Annotation of XNU/bsd/hfs/hfs_dbg.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*     hfs_dbg.h
                     23:  *
                     24:  *     (c) 1997 Apple Computer, Inc.  All Rights Reserved
                     25:  *
                     26:  *     hfs_dbg.h -- debugging macros for HFS file system.
                     27:  *
                     28:  *     HISTORY
                     29:  *     10-Nov-1998 Pat Dirks           Cleaned up definition of DBG_ASSERT to handle embedded '%' correctly.
                     30:  *     28-Apr-1998     Scott Roberts   Reorganized and added HFS_DEBUG_STAGE
                     31:  *     17-Nov-1997     Pat Dirks               Pat Dirks at Apple Computer
                     32:  *                                                             Derived from old hfs version.
                     33:  */
                     34: 
                     35: struct componentname;
                     36: 
                     37: /* Define the debugging stage...
                     38:                4 -> Do all, aggresive, call_kdp
                     39:                3 -> debug asserts and debug err, panic instead of call_kdp
                     40:                2 -> debug error, no kdb
                     41:                1 -> very little, panic only
                     42: */
                     43: #ifndef HFS_DIAGNOSTIC
                     44:        #define HFS_DIAGNOSTIC 0
                     45: #endif /* HFS_DIAGNOSTIC */
                     46: 
                     47: #ifndef HFS_DEBUG_STAGE
                     48: #if HFS_DIAGNOSTIC
                     49:        #define HFS_DEBUG_STAGE 4
                     50: #else
                     51:        #define HFS_DEBUG_STAGE 1
                     52: #endif /* KERNEL */
                     53: #endif /* HFS_DEBUG_STAGE */
                     54: 
                     55: #ifdef KERNEL
                     56:   #define PRINTIT kprintf
                     57: #else /* KERNEL */
                     58:   #define PRINTIT printf
                     59: #endif /* KERNEL */
                     60: 
                     61: #if (HFS_DEBUG_STAGE > 3)
                     62: #define DEBUG_BREAK Debugger("");
                     63: #else
                     64: #define DEBUG_BREAK
                     65: #endif
                     66: 
                     67: #if (HFS_DEBUG_STAGE == 4)
                     68:     #define DEBUG_BREAK_MSG(PRINTF_ARGS) { PRINTIT PRINTF_ARGS; DEBUG_BREAK };
                     69: #elif (HFS_DEBUG_STAGE == 3)
                     70:     #define DEBUG_BREAK_MSG(PRINTF_ARGS) { panic PRINTF_ARGS;};
                     71: #else
                     72:     #define DEBUG_BREAK_MSG(PRINTF_ARGS) { PRINTIT PRINTF_ARGS; };
                     73: #endif
                     74: 
                     75: 
                     76: //#define PRINT_DELAY (void) tsleep((caddr_t)&lbolt, PPAUSE, "hfs kprintf", 0)
                     77: #define PRINT_DELAY
                     78: 
                     79: /*
                     80:  * Debugging macros.
                     81:  */
                     82: #if    HFS_DIAGNOSTIC
                     83: extern int hfs_dbg_all;
                     84: extern int hfs_dbg_vfs;
                     85: extern int hfs_dbg_vop;
                     86: extern int hfs_dbg_load;
                     87: extern int hfs_dbg_io;
                     88: extern int hfs_dbg_utils;
                     89: extern int hfs_dbg_rw;
                     90: extern int hfs_dbg_lookup;
                     91: extern int hfs_dbg_tree;
                     92: extern int hfs_dbg_err;
                     93: extern int hfs_dbg_test;
                     94: 
                     95: #ifdef KERNEL
                     96:     #if (HFS_DEBUG_STAGE == 4)
                     97:                char            gDebugAssertStr[255];
                     98:                #define DBG_ASSERT(a) { if (!(a)) { \
                     99:                                sprintf(gDebugAssertStr,"Oops - File "__FILE__", line %d: assertion '%s' failed.\n", __LINE__, #a); \
                    100:                 Debugger(gDebugAssertStr); } }
                    101:        #else
                    102: #define DBG_ASSERT(a) { if (!(a)) { panic("File "__FILE__", line %d: assertion '%s' failed.\n", __LINE__, #a); } }
                    103:     #endif /* HFS_DEBUG_STAGE */
                    104: #else
                    105:     #define DBG_ASSERT(a) assert(a)
                    106: #endif /* KERNEL */
                    107: 
                    108: //#define DBG_VFS if (hfs_dbg_all || hfs_dbg_vfs) PRINTIT
                    109: #define DBG_VFS(x)     {               \
                    110:        if(hfs_dbg_all || hfs_dbg_vfs) {        \
                    111:         PRINTIT("%X: ", current_proc()->p_pid); \
                    112:         PRINTIT x;             \
                    113:            PRINT_DELAY;  \
                    114:        };                      \
                    115: }
                    116: #define DBG_VFS_CONT(x)        {               \
                    117:     if(hfs_dbg_all || hfs_dbg_vfs) {   \
                    118:         PRINTIT x;             \
                    119:         PRINT_DELAY;  \
                    120:     };                 \
                    121: }
                    122: #define DBG_VOP(x)     {               \
                    123:     if(hfs_dbg_all || hfs_dbg_vop) {   \
                    124:         PRINTIT("%X: ", current_proc()->p_pid); \
                    125:         PRINTIT x;                     \
                    126:         PRINT_DELAY;  \
                    127:     };                 \
                    128: }
                    129: #define DBG_VOP_CONT(x)        {               \
                    130:     if(hfs_dbg_all || hfs_dbg_vop) {   \
                    131:         PRINTIT x;                     \
                    132:         PRINT_DELAY;  \
                    133:     };                 \
                    134: }
                    135: #define DBG_LOAD(x)    {               \
                    136:        if(hfs_dbg_all || hfs_dbg_load) {       \
                    137:         PRINTIT("%X: ", current_proc()->p_pid); \
                    138:            PRINTIT x;                  \
                    139:            PRINT_DELAY;  \
                    140:        };                      \
                    141: }
                    142: #define DBG_IO(x)      {               \
                    143:        if(hfs_dbg_all || hfs_dbg_io) { \
                    144:         PRINTIT("%X: ", current_proc()->p_pid); \
                    145:            PRINTIT x;                  \
                    146:            PRINT_DELAY;  \
                    147:        };                      \
                    148: }
                    149: #define DBG_UTILS(x)   {               \
                    150:        if(hfs_dbg_all || hfs_dbg_utils) {      \
                    151:         PRINTIT("%X: ", current_proc()->p_pid); \
                    152:            PRINTIT x;                  \
                    153:         PRINT_DELAY;  \
                    154:        };                      \
                    155: }
                    156: #define DBG_RW(x)      {               \
                    157:        if(hfs_dbg_all || hfs_dbg_rw) { \
                    158:         PRINTIT("%X: ", current_proc()->p_pid); \
                    159:            PRINTIT x;                  \
                    160:            PRINT_DELAY;  \
                    161:        };                      \
                    162: }
                    163: #define DBG_LOOKUP(x)  {               \
                    164:        if(hfs_dbg_all || hfs_dbg_lookup) {     \
                    165:         PRINTIT("%X: ", current_proc()->p_pid); \
                    166:            PRINTIT x;                  \
                    167:            PRINT_DELAY;  \
                    168:        };                      \
                    169: }
                    170: #define DBG_TREE(x)    {               \
                    171:        if(hfs_dbg_all || hfs_dbg_tree) {       \
                    172:         PRINTIT("%X: ", current_proc()->p_pid); \
                    173:            PRINTIT x;                  \
                    174:         PRINT_DELAY;  \
                    175:        };                      \
                    176: }
                    177: #define DBG_ERR(x)     {               \
                    178:        if(hfs_dbg_all || hfs_dbg_err) {        \
                    179:         PRINTIT("%X: ", current_proc()->p_pid); \
                    180:            PRINTIT("HFS ERROR: "); \
                    181:            PRINTIT x;                  \
                    182:            PRINT_DELAY;  \
                    183:        };                      \
                    184: }
                    185: #define DBG_TEST(x)    {               \
                    186:        if(hfs_dbg_all || hfs_dbg_test) {       \
                    187:         PRINTIT("%X: ", current_proc()->p_pid); \
                    188:            PRINTIT x;                  \
                    189:            PRINT_DELAY;  \
                    190:        };                      \
                    191: }
                    192: #else  // HFS_DIAGNOSTIC
                    193: #define DBG_ASSERT(a)
                    194: #define DBG_VFS(x)
                    195: #define DBG_VFS_CONT(x)
                    196: #define DBG_VOP(x)
                    197: #define DBG_VOP_CONT(x)
                    198: #define DBG_LOAD(x)
                    199: #define DBG_IO(x)
                    200: #define DBG_UTILS(x)
                    201: #define DBG_RW(x)
                    202: #define DBG_LOOKUP(x)
                    203: #define DBG_TREE(x)
                    204: #define DBG_ERR(x)
                    205: #define DBG_TEST(x)
                    206: #endif // HFS_DIAGNOSTIC
                    207: 
                    208: 
                    209: /* Used to help print commone values in the vnode ops */
                    210: #if HFS_DIAGNOSTIC
                    211:     extern void debug_vn_status (char* introStr, struct vnode *vn);
                    212:     extern void debug_vn_print (char* introStr, struct vnode *vn);
                    213:        extern void debug_check_vnode(struct vnode *vp, int stage);
                    214: 
                    215:     #define DBG_VN_STATUS (introStr, vn)       debug_vn_status (introStr, vn)
                    216:     #define DBG_VN_PRINT (introStr, vn)        debug_vn_print (introStr, vn)
                    217:     #define DBG_FUNC_NAME(FSTR)                        static char *funcname = FSTR
                    218:        #define DBG_PRINT_FUNC_NAME()                   DBG_VFS(("%s: ", funcname));
                    219:        #define DBG_VOP_PRINT_FUNCNAME()                DBG_VOP(("%s: ", funcname));
                    220: 
                    221: 
                    222:     /* This checks to make sure the passed in node is valid and HFS */
                    223:     #define    DBG_HFS_NODE_CHECK(VP)  {                                                       \
                    224:         if ((VP) == NULL || VTOH((VP))->h_valid != HFS_VNODE_MAGIC) {          \
                    225:             DBG_VOP_CONT(("%s: INVALID VNODE: ", funcname));   \
                    226:                 DBG_VOP_PRINT_VNODE_INFO(VP);                          \
                    227:                     DBG_VOP_CONT(("\n"));                                                      \
                    228:                         return (EINVAL);                                                       \
                    229:                             }                                                                                  \
                    230:         }
                    231: 
                    232:     #define DBG_VOP_PRINT_VNODE_INFO(VP)       { if (VP && VTOH((VP))->h_valid == HFS_VNODE_MAGIC)             { \
                    233:         DBG_VOP_CONT(("\tn: %s, p: %d, id: %d, f: %d, u: %d, v: 0x%x ",H_NAME(VTOH(VP)),       \
                    234:                 H_DIRID(VTOH(VP)), H_FILEID(VTOH(VP)), H_FORKTYPE(VTOH(VP)), (VP)->v_usecount, (u_int)(VP))); \
                    235:                     } else { \
                    236:                         DBG_VOP_CONT(("\tBAD MACNODE"));}}
                    237: 
                    238:        #define DBG_VOP_PRINT_CPN_INFO(CN) DBG_VOP_CONT(("name: %s",(CN)->cn_nameptr));
                    239: 
                    240: #else /* HFS_DIAGNOSTIC */
                    241: 
                    242:     #define DBG_VN_PRINT(introStr,vn)
                    243:     #define DBG_VN_STATUS(introStr,vn)
                    244:     #define DBG_FUNC_NAME(FSTR)
                    245:     #define DBG_PRINT_FUNC_NAME()
                    246:     #define DBG_HFS_NODE_CHECK(VP)
                    247:     #define DBG_VOP_PRINT_FUNCNAME()
                    248:     #define DBG_VOP_PRINT_VNODE_INFO(VP)
                    249:     #define DBG_VOP_PRINT_CPN_INFO(CN)
                    250: 
                    251: #endif /* HFS_DIAGNOSTIC */
                    252: 
                    253: 
                    254: #if HFS_DIAGNOSTIC
                    255: #define        DBG_VOP_TEST_LOCKS      1
                    256: #else /* HFS_DIAGNOSTIC */
                    257: #undef DBG_VOP_TEST_LOCKS
                    258: #endif /* HFS_DIAGNOSTIC */
                    259: 
                    260: 
                    261: 
                    262: #if DBG_VOP_TEST_LOCKS
                    263: 
                    264: typedef struct VopDbgStoreRec {
                    265:     short      id;
                    266:     struct vnode       *vp;
                    267:     short      inState;
                    268:     short      outState;
                    269:     short      errState;
                    270:     int                inValue;
                    271:     int                outValue;
                    272:     } VopDbgStoreRec;
                    273: 
                    274:     
                    275: void DbgVopTest (int max, int error, VopDbgStoreRec *VopDbgStore, char *funcname);
                    276: void DbgLookupTest(char *funcname,     struct componentname  *cnp, struct vnode *dvp, struct vnode *vp);
                    277: 
                    278: #define        VOPDBG_IGNORE                   0
                    279: #define        VOPDBG_LOCKED                   1
                    280: #define        VOPDBG_UNLOCKED                 -1
                    281: #define        VOPDBG_LOCKNOTNIL               2
                    282: #define        VOPDBG_SAME                             3
                    283: 
                    284: #define        VOPDBG_ZERO     0
                    285: #define        VOPDBG_POS      1
                    286: 
                    287: /*             This sets up the test for the lock state of vnodes. The entry paramaters are:
                    288:  *                     I = index of paramater
                    289:  *                     VP = pointer to a vnode
                    290:  *                     ENTRYSTATE = the inState of the lock
                    291:  *                     EXITSTATE = the outState of the lock
                    292:  *                     ERRORSTATE = the error state of the lock
                    293:  *             It initializes the structure, does some preliminary validity checks, but does nothing
                    294:  *             if the instate is set to be ignored.
                    295:  */
                    296: 
                    297: 
                    298: #define  DBG_VOP_LOCKS_DECL(I) VopDbgStoreRec  VopDbgStore[I];short numOfLockSlots=I
                    299: #define  DBG_VOP_LOCKS_INIT(I,VP,ENTRYSTATE,EXITSTATE,ERRORSTATE,CHECKFLAG)            \
                    300:                if (I >= numOfLockSlots) { \
                    301:                 DEBUG_BREAK_MSG(("%s: DBG_VOP_LOCKS_INIT: Entry #%d greater than allocated slots!\n", funcname, I)); \
                    302:             }; \
                    303:            VopDbgStore[I].id                   = I; \
                    304:                        VopDbgStore[I].vp                       = VP; \
                    305:                        VopDbgStore[I].inState          = ENTRYSTATE; \
                    306:                        VopDbgStore[I].outState         = EXITSTATE; \
                    307:                        VopDbgStore[I].errState         = ERRORSTATE; \
                    308:                        VopDbgStore[I].inValue          = 0; \
                    309:                        VopDbgStore[I].outValue         = 0; \
                    310:                        if ((VopDbgStore[I].inState != VOPDBG_IGNORE)) {                                                        \
                    311:                                if ((VP) == NULL)                                                                                                               \
                    312:                 PRINTIT ("%X: %s: DBG_VOP_LOCK on start: Null vnode ptr\n", current_proc()->p_pid, funcname);  \
                    313:                                else                                                                                                                                    \
                    314:                                        VopDbgStore[I].inValue = lockstatus (&(VTOH(VP))->h_lock);                      \
                    315:                                }                                                                                                                                               \
                    316:                        if ((VP) != NULL)                                                                                                                       \
                    317:                                {                                                                                                                                               \
                    318:                                if (CHECKFLAG==VOPDBG_POS && (VP)->v_usecount <= 0)                                     \
                    319:                 PRINTIT("%X: %s: BAD USECOUNT OF %d !!!!\n", current_proc()->p_pid, funcname, (VP)->v_usecount);       \
                    320:                                else if ((VP)->v_usecount < 0)                                                                                                  \
                    321:                 PRINTIT("%X: %s: BAD USECOUNT OF %d !!!!\n", current_proc()->p_pid, funcname, (VP)->v_usecount);       \
                    322:                                }
                    323: 
                    324:     #define DBG_VOP_UPDATE_VP(I, VP) \
                    325:                VopDbgStore[I].vp                       = VP;
                    326: 
                    327:     #define  DBG_VOP_LOCKS_TEST(status) DbgVopTest (numOfLockSlots, status, VopDbgStore, funcname);
                    328:     #define  DBG_VOP_LOOKUP_TEST(funcname, cnp, dvp, vp) DbgLookupTest (funcname, cnp, dvp, vp);
                    329: 
                    330: #else   /* DBG_VOP_TEST_LOCKS */
                    331: 
                    332:     #define  DBG_VOP_LOCKS_DECL(A)
                    333:     #define  DBG_VOP_LOCKS_INIT(A,B,C,D,E,F)
                    334:     #define  DBG_VOP_LOCKS_TEST(a)
                    335:     #define  DBG_VOP_LOOKUP_TEST(funcname, cnp, dvp, vp)
                    336:     #define  DBG_VOP_UPDATE_VP(I, VP)
                    337: #endif /* DBG_VOP_TEST_LOCKS */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.