Index: sys/fs/nullfs/null_vnops.c =================================================================== --- sys/fs/nullfs/null_vnops.c +++ sys/fs/nullfs/null_vnops.c @@ -696,7 +696,7 @@ vdrop(lvp); } else { VI_UNLOCK(vp); - error = vop_stdlock(ap); + error = vop_stdlock_vnlock(ap); } return (error); @@ -721,7 +721,7 @@ error = VOP_UNLOCK(lvp, 0); vdrop(lvp); } else { - error = vop_stdunlock(ap); + error = vop_stdunlock_vnlock(ap); } return (error); @@ -927,7 +927,7 @@ .vop_getwritemount = null_getwritemount, .vop_inactive = null_inactive, .vop_need_inactive = null_need_inactive, - .vop_islocked = vop_stdislocked, + .vop_islocked = vop_stdislocked_vnlock, .vop_lock1 = null_lock, .vop_lookup = null_lookup, .vop_open = null_open, Index: sys/fs/unionfs/union_vnops.c =================================================================== --- sys/fs/unionfs/union_vnops.c +++ sys/fs/unionfs/union_vnops.c @@ -1771,13 +1771,13 @@ unp = VTOUNIONFS(ap->a_vp); if (unp == NULL) - return (vop_stdislocked(ap)); + return (vop_stdislocked_vnlock(ap)); if (unp->un_uppervp != NULLVP) return (VOP_ISLOCKED(unp->un_uppervp)); if (unp->un_lowervp != NULLVP) return (VOP_ISLOCKED(unp->un_lowervp)); - return (vop_stdislocked(ap)); + return (vop_stdislocked_vnlock(ap)); } static int @@ -1946,7 +1946,7 @@ VOP_UNLOCK(lvp, LK_RELEASE); vdrop(lvp); } - return (vop_stdlock(ap)); + return (vop_stdlock_vnlock(ap)); } if (error != 0 && lvp != NULLVP) { /* rollback */ @@ -1967,7 +1967,7 @@ unionfs_lock_null_vnode: ap->a_flags |= LK_INTERLOCK; - return (vop_stdlock(ap)); + return (vop_stdlock_vnlock(ap)); } static int @@ -2013,7 +2013,7 @@ return error; unionfs_unlock_null_vnode: - return (vop_stdunlock(ap)); + return (vop_stdunlock_vnlock(ap)); } static int Index: sys/kern/vfs_default.c =================================================================== --- sys/kern/vfs_default.c +++ sys/kern/vfs_default.c @@ -512,8 +512,9 @@ struct vnode *vp = ap->a_vp; struct mtx *ilk; + MPASS(vp->v_vnlock == &vp->v_lock); ilk = VI_MTX(vp); - return (lockmgr_lock_fast_path(vp->v_vnlock, ap->a_flags, + return (lockmgr_lock_fast_path(&vp->v_lock, ap->a_flags, &ilk->lock_object, ap->a_file, ap->a_line)); } @@ -528,8 +529,9 @@ struct vnode *vp = ap->a_vp; struct mtx *ilk; + MPASS(vp->v_vnlock == &vp->v_lock); ilk = VI_MTX(vp); - return (lockmgr_unlock_fast_path(vp->v_vnlock, ap->a_flags, + return (lockmgr_unlock_fast_path(&vp->v_lock, ap->a_flags, &ilk->lock_object)); } @@ -541,6 +543,54 @@ } */ *ap; { + MPASS(ap->a_vp->v_vnlock == &ap->a_vp->v_lock); + return (lockstatus(&ap->a_vp->v_lock)); +} + +/* + * Variants of the aboe which read the v_vnlock pointer. + */ +int +vop_stdlock_vnlock(ap) + struct vop_lock1_args /* { + struct vnode *a_vp; + int a_flags; + char *file; + int line; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct mtx *ilk; + + ilk = VI_MTX(vp); + return (lockmgr_lock_fast_path(vp->v_vnlock, ap->a_flags, + &ilk->lock_object, ap->a_file, ap->a_line)); +} + +/* See above. */ +int +vop_stdunlock_vnlock(ap) + struct vop_unlock_args /* { + struct vnode *a_vp; + int a_flags; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct mtx *ilk; + + ilk = VI_MTX(vp); + return (lockmgr_unlock_fast_path(vp->v_vnlock, ap->a_flags, + &ilk->lock_object)); +} + +/* See above. */ +int +vop_stdislocked_vnlock(ap) + struct vop_islocked_args /* { + struct vnode *a_vp; + } */ *ap; +{ + return (lockstatus(ap->a_vp->v_vnlock)); } Index: sys/sys/vnode.h =================================================================== --- sys/sys/vnode.h +++ sys/sys/vnode.h @@ -760,11 +760,14 @@ int vop_stdgetpages(struct vop_getpages_args *); int vop_stdinactive(struct vop_inactive_args *); int vop_stdneed_inactive(struct vop_need_inactive_args *); -int vop_stdislocked(struct vop_islocked_args *); int vop_stdkqfilter(struct vop_kqfilter_args *); +int vop_stdislocked(struct vop_islocked_args *); int vop_stdlock(struct vop_lock1_args *); -int vop_stdputpages(struct vop_putpages_args *); int vop_stdunlock(struct vop_unlock_args *); +int vop_stdislocked_vnlock(struct vop_islocked_args *); +int vop_stdlock_vnlock(struct vop_lock1_args *); +int vop_stdunlock_vnlock(struct vop_unlock_args *); +int vop_stdputpages(struct vop_putpages_args *); int vop_nopoll(struct vop_poll_args *); int vop_stdaccess(struct vop_access_args *ap); int vop_stdaccessx(struct vop_accessx_args *ap); Index: sys/ufs/ffs/ffs_vnops.c =================================================================== --- sys/ufs/ffs/ffs_vnops.c +++ sys/ufs/ffs/ffs_vnops.c @@ -134,7 +134,9 @@ .vop_fdatasync = ffs_fdatasync, .vop_getpages = ffs_getpages, .vop_getpages_async = ffs_getpages_async, + .vop_islocked = vop_stdislocked_vnlock, .vop_lock1 = ffs_lock, + .vop_unlock = vop_stdunlock_vnlock, .vop_read = ffs_read, .vop_reallocblks = ffs_reallocblks, .vop_write = ffs_write, @@ -145,7 +147,9 @@ .vop_default = &ufs_fifoops, .vop_fsync = ffs_fsync, .vop_fdatasync = ffs_fdatasync, + .vop_islocked = vop_stdislocked_vnlock, .vop_lock1 = ffs_lock, + .vop_unlock = vop_stdunlock_vnlock, .vop_vptofh = ffs_vptofh, }; @@ -156,7 +160,9 @@ .vop_fdatasync = ffs_fdatasync, .vop_getpages = ffs_getpages, .vop_getpages_async = ffs_getpages_async, + .vop_islocked = vop_stdislocked_vnlock, .vop_lock1 = ffs_lock, + .vop_unlock = vop_stdunlock_vnlock, .vop_read = ffs_read, .vop_reallocblks = ffs_reallocblks, .vop_write = ffs_write, @@ -173,7 +179,9 @@ .vop_default = &ufs_fifoops, .vop_fsync = ffs_fsync, .vop_fdatasync = ffs_fdatasync, + .vop_islocked = vop_stdislocked_vnlock, .vop_lock1 = ffs_lock, + .vop_unlock = vop_stdunlock_vnlock, .vop_reallocblks = ffs_reallocblks, .vop_strategy = ffsext_strategy, .vop_closeextattr = ffs_closeextattr, Index: sys/ufs/ufs/ufs_vnops.c =================================================================== --- sys/ufs/ufs/ufs_vnops.c +++ sys/ufs/ufs/ufs_vnops.c @@ -2738,6 +2738,9 @@ .vop_inactive = ufs_inactive, .vop_ioctl = ufs_ioctl, .vop_link = ufs_link, + .vop_islocked = vop_stdislocked_vnlock, + .vop_lock1 = vop_stdlock_vnlock, + .vop_unlock = vop_stdunlock_vnlock, .vop_lookup = vfs_cache_lookup, .vop_markatime = ufs_markatime, .vop_mkdir = ufs_mkdir, @@ -2785,6 +2788,9 @@ .vop_read = VOP_PANIC, .vop_reclaim = ufs_reclaim, .vop_setattr = ufs_setattr, + .vop_islocked = vop_stdislocked_vnlock, + .vop_lock1 = vop_stdlock_vnlock, + .vop_unlock = vop_stdunlock_vnlock, #ifdef MAC .vop_setlabel = vop_stdsetlabel_ea, #endif