Index: coda/coda_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/coda/coda_vnops.c,v retrieving revision 1.12 diff -u -r1.12 coda_vnops.c --- coda_vnops.c 1999/01/07 16:14:12 1.12 +++ coda_vnops.c 1999/01/16 08:45:48 @@ -1314,7 +1314,7 @@ * lock it without bothering to check anything else. */ if (*ap->a_vpp) { - if ((error = VOP_LOCK(*ap->a_vpp, LK_EXCLUSIVE, p))) { + if ((error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE, p))) { printf("coda_lookup: "); panic("unlocked parent but couldn't lock child"); } @@ -1323,7 +1323,7 @@ /* The parent is locked, and may be the same as the child */ if (*ap->a_vpp && (*ap->a_vpp != dvp)) { /* Different, go ahead and lock it. */ - if ((error = VOP_LOCK(*ap->a_vpp, LK_EXCLUSIVE, p))) { + if ((error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE, p))) { printf("coda_lookup: "); panic("unlocked parent but couldn't lock child"); } @@ -2042,7 +2042,12 @@ cp->c_fid.Volume, cp->c_fid.Vnode, cp->c_fid.Unique)); } +#ifndef DEBUG_LOCKS return (lockmgr(&cp->c_lock, ap->a_flags, &vp->v_interlock, p)); +#else + return (debuglockmgr(&cp->c_lock, ap->a_flags, &vp->v_interlock, p, + "coda_lock", vp->filename, vp->line)); +#endif } int Index: conf/options =================================================================== RCS file: /home/ncvs/src/sys/conf/options,v retrieving revision 1.119 diff -u -r1.119 options --- options 1999/01/15 10:00:10 1.119 +++ options 1999/01/16 08:51:13 @@ -255,6 +255,7 @@ # These cause changes all over the kernel DEBUG opt_global.h +DEBUG_LOCKS opt_global.h DEBUG_VFS_LOCKS opt_global.h DIAGNOSTIC opt_global.h ENABLE_VFS_IOOPT opt_global.h Index: i386/conf/LINT =================================================================== RCS file: /home/ncvs/src/sys/i386/conf/LINT,v retrieving revision 1.535 diff -u -r1.535 LINT --- LINT 1999/01/15 10:00:11 1.535 +++ LINT 1999/01/16 08:51:31 @@ -1840,6 +1840,12 @@ # options "NSFBUFS=1024" +# +# Enable extra debugging code for locks. This include storing the +# filename and line of whatever aquired the lock. +# +options DEBUG_LOCKS + # More undocumented options for linting. options CLK_CALIBRATION_LOOP @@ -1849,6 +1855,7 @@ options COMPAT_LINUX options CPU_UPGRADE_HW_CACHE options DEBUG +options DEBUG_VFS_LOCKS options "DEBUG_1284" #options DISABLE_PSE options "EXT2FS" Index: kern/kern_lock.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_lock.c,v retrieving revision 1.22 diff -u -r1.22 kern_lock.c --- kern_lock.c 1999/01/10 01:58:24 1.22 +++ kern_lock.c 1999/01/16 08:39:53 @@ -171,11 +171,20 @@ * accepted shared locks and shared-to-exclusive upgrades to go away. */ int +#ifndef DEBUG_LOCKS lockmgr(lkp, flags, interlkp, p) +#else +debuglockmgr(lkp, flags, interlkp, p, name, file, line) +#endif struct lock *lkp; u_int flags; struct simplelock *interlkp; struct proc *p; +#ifdef DEBUG_LOCKS + const char *name; /* Name of lock function */ + const char *file; /* Name of file call is from */ + int line; /* Line number in file */ +#endif { int error; pid_t pid; @@ -283,6 +292,11 @@ panic("lockmgr: non-zero exclusive count"); #endif lkp->lk_exclusivecount = 1; +#if defined(DEBUG_LOCKS) + lkp->lk_filename = file; + lkp->lk_lineno = line; + lkp->lk_lockername = name; +#endif COUNT(p, 1); break; } @@ -338,6 +352,11 @@ panic("lockmgr: non-zero exclusive count"); #endif lkp->lk_exclusivecount = 1; +#if defined(DEBUG_LOCKS) + lkp->lk_filename = file; + lkp->lk_lineno = line; + lkp->lk_lockername = name; +#endif COUNT(p, 1); break; @@ -383,6 +402,11 @@ lkp->lk_flags |= LK_DRAINING | LK_HAVE_EXCL; lkp->lk_lockholder = pid; lkp->lk_exclusivecount = 1; +#if defined(DEBUG_LOCKS) + lkp->lk_filename = file; + lkp->lk_lineno = line; + lkp->lk_lockername = name; +#endif COUNT(p, 1); break; Index: kern/vfs_default.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_default.c,v retrieving revision 1.16 diff -u -r1.16 vfs_default.c --- vfs_default.c 1998/11/10 09:04:09 1.16 +++ vfs_default.c 1999/01/16 08:23:30 @@ -205,7 +205,12 @@ return 0; } +#ifndef DEBUG_LOCKS return (lockmgr(l, ap->a_flags, &ap->a_vp->v_interlock, ap->a_p)); +#else + return (debuglockmgr(l, ap->a_flags, &ap->a_vp->v_interlock, ap->a_p, + "vop_stdlock", ap->a_vp->filename, ap->a_vp->line)); +#endif } int @@ -355,7 +360,12 @@ } if (flags & LK_INTERLOCK) vnflags |= LK_INTERLOCK; - return(lockmgr(vp->v_vnlock, vnflags, &vp->v_interlock, ap->a_p)); +#ifndef DEBUG_LOCKS + return (lockmgr(vp->v_vnlock, vnflags, &vp->v_interlock, ap->a_p)); +#else + return (debuglockmgr(vp->v_vnlock, vnflags, &vp->v_interlock, ap->a_p, + "vop_sharedlock", vp->filename, vp->line)); +#endif } /* Index: kern/vfs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_vnops.c,v retrieving revision 1.61 diff -u -r1.61 vfs_vnops.c --- vfs_vnops.c 1999/01/05 18:49:56 1.61 +++ vfs_vnops.c 1999/01/16 07:17:57 @@ -510,10 +510,18 @@ * acquire requested lock. */ int +#ifndef DEBUG_LOCKS vn_lock(vp, flags, p) +#else +debug_vn_lock(vp, flags, p, filename, line) +#endif struct vnode *vp; int flags; struct proc *p; +#ifdef DEBUG_LOCKS + const char *filename; + int line; +#endif { int error; @@ -526,7 +534,12 @@ tsleep((caddr_t)vp, PINOD, "vn_lock", 0); error = ENOENT; } else { - error = VOP_LOCK(vp, flags | LK_NOPAUSE | LK_INTERLOCK, p); +#ifdef DEBUG_LOCKS + vp->filename = filename; + vp->line = line; +#endif + error = VOP_LOCK(vp, + flags | LK_NOPAUSE | LK_INTERLOCK, p); if (error == 0) return (error); } Index: sys/lock.h =================================================================== RCS file: /home/ncvs/src/sys/sys/lock.h,v retrieving revision 1.12 diff -u -r1.12 lock.h --- lock.h 1999/01/02 11:34:56 1.12 +++ lock.h 1999/01/16 08:37:48 @@ -59,6 +59,11 @@ char *lk_wmesg; /* resource sleeping (for tsleep) */ int lk_timo; /* maximum sleep time (for tsleep) */ pid_t lk_lockholder; /* pid of exclusive lock holder */ +#ifdef DEBUG_LOCKS + const char *lk_filename; + const char *lk_lockername; + int lk_lineno; +#endif }; /* * Lock request types: @@ -169,8 +174,19 @@ void lockinit __P((struct lock *, int prio, char *wmesg, int timo, int flags)); +#ifdef DEBUG_LOCKS +int debuglockmgr __P((struct lock *, u_int flags, + struct simplelock *, struct proc *p, + const char *, + const char *, + int)); +#define lockmgr(lockp, flags, slockp, proc) \ + debuglockmgr((lockp), (flags), (slockp), (proc), \ + "lockmgr", __FILE__, __LINE__) +#else int lockmgr __P((struct lock *, u_int flags, struct simplelock *, struct proc *p)); +#endif void lockmgr_printinfo __P((struct lock *)); int lockstatus __P((struct lock *)); Index: sys/vnode.h =================================================================== RCS file: /home/ncvs/src/sys/sys/vnode.h,v retrieving revision 1.79 diff -u -r1.79 vnode.h --- vnode.h 1999/01/05 18:50:01 1.79 +++ vnode.h 1999/01/16 07:10:32 @@ -125,6 +125,10 @@ short vpi_events; /* what they are looking for */ short vpi_revents; /* what has happened */ } v_pollinfo; +#ifdef DEBUG_LOCKS + const char *filename; /* Source file doing locking */ + int line; /* Line number doing locking */ +#endif }; #define v_mountedhere v_un.vu_mountedhere #define v_socket v_un.vu_socket @@ -505,6 +509,11 @@ int vn_close __P((struct vnode *vp, int flags, struct ucred *cred, struct proc *p)); int vn_lock __P((struct vnode *vp, int flags, struct proc *p)); +#ifdef DEBUG_LOCKS +int debug_vn_lock __P((struct vnode *vp, int flags, struct proc *p, + const char *filename, int line)); +#define vn_lock(vp,flags,p) debug_vn_lock(vp,flags,p,__FILE__,__LINE__) +#endif int vn_open __P((struct nameidata *ndp, int fmode, int cmode)); void vn_pollevent __P((struct vnode *vp, int events)); void vn_pollgone __P((struct vnode *vp));