--- //depot/vendor/freebsd/src/sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_lockmgr/gnu/fs/xfs/FreeBSD/xfs_vnode.c 2008/07/19 15:22:47 @@ -104,13 +104,18 @@ vp = vmap->v_vp; - error = vget(vp, 0, curthread); - if (error) { - vdrop(vp); + error = vget(vp, LK_EXCLUSIVE, curthread); + vdrop(vp); + if (error) return (NULL); - } - vdrop(vp); + /* + * Drop the vnode returned by vget here. + * VOP_RECLAIM(9) should block on internal XFS locks so that + * the reclaiming scheme still remains consistent even if the + * vp is not locked. + */ + VOP_UNLOCK(vp, 0); if (vp->v_data != xfs_vp) { vput(vp); return (NULL); --- //depot/vendor/freebsd/src/sys/kern/vfs_subr.c 2008/05/18 21:11:08 +++ //depot/user/attilio/attilio_lockmgr/kern/vfs_subr.c 2008/07/19 15:22:47 @@ -2038,6 +2038,8 @@ error = 0; VFS_ASSERT_GIANT(vp->v_mount); + VNASSERT((flags & LK_TYPE_MASK) != 0, vp, + ("vget: invalid lock operation")); if ((flags & LK_INTERLOCK) == 0) VI_LOCK(vp); vholdl(vp);