SCCS-vsn: sys/ufs/ffs/ufs_vnops.c 7.112
SCCS-vsn: sys/ufs/ufs/ufs_vnops.c 7.112
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)ufs_vnops.c 7.111 (Berkeley) %G%
+ * @(#)ufs_vnops.c 7.112 (Berkeley) %G%
*/
#include <sys/param.h>
*/
#include <sys/param.h>
if (p->p_pid == ip->i_lockholder)
panic("locking against myself");
ip->i_lockwaiter = p->p_pid;
if (p->p_pid == ip->i_lockholder)
panic("locking against myself");
ip->i_lockwaiter = p->p_pid;
+ } else
+ ip->i_lockwaiter = -1;
#endif
(void) sleep((caddr_t)ip, PINOD);
goto start;
}
#ifdef DIAGNOSTIC
ip->i_lockwaiter = 0;
#endif
(void) sleep((caddr_t)ip, PINOD);
goto start;
}
#ifdef DIAGNOSTIC
ip->i_lockwaiter = 0;
+ if (ip->i_lockholder != 0)
+ panic("lockholder (%d) != 0", ip->i_lockholder);
+ if (p && p->p_pid == 0)
+ printf("locking by process 0\n");
if (p)
ip->i_lockholder = p->p_pid;
if (p)
ip->i_lockholder = p->p_pid;
+ else
+ ip->i_lockholder = -1;
#endif
ip->i_flag |= ILOCKED;
return (0);
#endif
ip->i_flag |= ILOCKED;
return (0);
/*
* Unlock an inode. If WANT bit is on, wakeup.
*/
/*
* Unlock an inode. If WANT bit is on, wakeup.
*/
int
ufs_unlock(ap)
struct vop_unlock_args /* {
int
ufs_unlock(ap)
struct vop_unlock_args /* {
} */ *ap;
{
register struct inode *ip = VTOI(ap->a_vp);
} */ *ap;
{
register struct inode *ip = VTOI(ap->a_vp);
+ struct proc *p = curproc; /* XXX */
if ((ip->i_flag & ILOCKED) == 0) {
vprint("ufs_unlock: unlocked inode", ap->a_vp);
panic("ufs_unlock NOT LOCKED");
}
if ((ip->i_flag & ILOCKED) == 0) {
vprint("ufs_unlock: unlocked inode", ap->a_vp);
panic("ufs_unlock NOT LOCKED");
}
+ if (p && p->p_pid != ip->i_lockholder && p->p_pid > -1 &&
+ ip->i_lockholder > -1 && lockcount++ < 100)
+ panic("unlocker (%d) != lock holder (%d)",
+ p->p_pid, ip->i_lockholder);
ip->i_lockholder = 0;
#endif
ip->i_flag &= ~ILOCKED;
ip->i_lockholder = 0;
#endif
ip->i_flag &= ~ILOCKED;
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)ufs_vnops.c 7.111 (Berkeley) %G%
+ * @(#)ufs_vnops.c 7.112 (Berkeley) %G%
*/
#include <sys/param.h>
*/
#include <sys/param.h>
if (p->p_pid == ip->i_lockholder)
panic("locking against myself");
ip->i_lockwaiter = p->p_pid;
if (p->p_pid == ip->i_lockholder)
panic("locking against myself");
ip->i_lockwaiter = p->p_pid;
+ } else
+ ip->i_lockwaiter = -1;
#endif
(void) sleep((caddr_t)ip, PINOD);
goto start;
}
#ifdef DIAGNOSTIC
ip->i_lockwaiter = 0;
#endif
(void) sleep((caddr_t)ip, PINOD);
goto start;
}
#ifdef DIAGNOSTIC
ip->i_lockwaiter = 0;
+ if (ip->i_lockholder != 0)
+ panic("lockholder (%d) != 0", ip->i_lockholder);
+ if (p && p->p_pid == 0)
+ printf("locking by process 0\n");
if (p)
ip->i_lockholder = p->p_pid;
if (p)
ip->i_lockholder = p->p_pid;
+ else
+ ip->i_lockholder = -1;
#endif
ip->i_flag |= ILOCKED;
return (0);
#endif
ip->i_flag |= ILOCKED;
return (0);
/*
* Unlock an inode. If WANT bit is on, wakeup.
*/
/*
* Unlock an inode. If WANT bit is on, wakeup.
*/
int
ufs_unlock(ap)
struct vop_unlock_args /* {
int
ufs_unlock(ap)
struct vop_unlock_args /* {
} */ *ap;
{
register struct inode *ip = VTOI(ap->a_vp);
} */ *ap;
{
register struct inode *ip = VTOI(ap->a_vp);
+ struct proc *p = curproc; /* XXX */
if ((ip->i_flag & ILOCKED) == 0) {
vprint("ufs_unlock: unlocked inode", ap->a_vp);
panic("ufs_unlock NOT LOCKED");
}
if ((ip->i_flag & ILOCKED) == 0) {
vprint("ufs_unlock: unlocked inode", ap->a_vp);
panic("ufs_unlock NOT LOCKED");
}
+ if (p && p->p_pid != ip->i_lockholder && p->p_pid > -1 &&
+ ip->i_lockholder > -1 && lockcount++ < 100)
+ panic("unlocker (%d) != lock holder (%d)",
+ p->p_pid, ip->i_lockholder);
ip->i_lockholder = 0;
#endif
ip->i_flag &= ~ILOCKED;
ip->i_lockholder = 0;
#endif
ip->i_flag &= ~ILOCKED;