Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -5967,7 +5967,7 @@ znode_t *zp; int err; - err = vop_lock(ap); + err = lockmgr_vop_lock(ap); if (err == 0 && (ap->a_flags & LK_NOWAIT) == 0) { vp = ap->a_vp; zp = vp->v_data; @@ -6026,10 +6026,10 @@ #ifdef DIAGNOSTIC .vop_lock1 = zfs_lock, #else - .vop_lock1 = vop_lock, + .vop_lock1 = lockmgr_vop_lock, #endif - .vop_unlock = vop_unlock, - .vop_islocked = vop_islocked, + .vop_unlock = lockmgr_vop_unlock, + .vop_islocked = lockmgr_vop_islocked, }; VFS_VOP_VECTOR_REGISTER(zfs_vnodeops); Index: sys/fs/tmpfs/tmpfs_vnops.c =================================================================== --- sys/fs/tmpfs/tmpfs_vnops.c +++ sys/fs/tmpfs/tmpfs_vnops.c @@ -1632,9 +1632,9 @@ .vop_whiteout = tmpfs_whiteout, .vop_bmap = VOP_EOPNOTSUPP, .vop_vptocnp = tmpfs_vptocnp, - .vop_lock1 = vop_lock, - .vop_unlock = vop_unlock, - .vop_islocked = vop_islocked, + .vop_lock1 = lockmgr_vop_lock, + .vop_unlock = lockmgr_vop_unlock, + .vop_islocked = lockmgr_vop_islocked, }; VFS_VOP_VECTOR_REGISTER(tmpfs_vnodeop_entries); Index: sys/kern/kern_lock.c =================================================================== --- sys/kern/kern_lock.c +++ sys/kern/kern_lock.c @@ -52,6 +52,8 @@ #include +#include + #ifdef DDB #include #endif @@ -1166,15 +1168,10 @@ return (lockmgr_xlock_hard(lk, flags, NULL, file, line, NULL)); } -int -lockmgr_unlock(struct lock *lk) +static int __always_inline +lockmgr_unlock_impl(struct lock *lk, const char *file, int line) { uintptr_t x, tid; - const char *file; - int line; - - file = __FILE__; - line = __LINE__; _lockmgr_assert(lk, KA_LOCKED, file, line); x = lk->lk_lock; @@ -1198,6 +1195,71 @@ return (0); } +int +lockmgr_unlock(struct lock *lk) +{ + + return (lockmgr_unlock_impl(lk, __FILE__, __LINE__)); +} + +/* + * Optional entry points for VFS. + * + * Differences to regular vop_* routines are: + * - shared locking disablement is not supported + * - v_vnlock pointer is not honored + */ +int +lockmgr_vop_lock(struct vop_lock1_args *ap) +{ + struct vnode *vp; + int flags; + struct mtx *ilk; + + vp = ap->a_vp; + flags = ap->a_flags; + + MPASS(vp->v_vnlock == &vp->v_lock); + + if (__predict_false((flags & ~(LK_TYPE_MASK | LK_NODDLKTREAT | LK_RETRY)) != 0)) + goto other; + + switch (flags & LK_TYPE_MASK) { + case LK_SHARED: + return (lockmgr_slock(&vp->v_lock, flags, ap->a_file, ap->a_line)); + case LK_EXCLUSIVE: + return (lockmgr_xlock(&vp->v_lock, flags, ap->a_file, ap->a_line)); + } +other: + ilk = VI_MTX(vp); + return (lockmgr_lock_flags(&vp->v_lock, flags, + &ilk->lock_object, ap->a_file, ap->a_line)); +} + +int +lockmgr_vop_unlock(struct vop_unlock_args *ap) +{ + struct vnode *vp; + struct lock *lk; + + vp = ap->a_vp; + MPASS(vp->v_vnlock == &vp->v_lock); + lk = &vp->v_lock; + + return (lockmgr_unlock_impl(lk, __FILE__, __LINE__)); +} + +int +lockmgr_vop_islocked(struct vop_islocked_args *ap) +{ + struct vnode *vp; + + vp = ap->a_vp; + MPASS(vp->v_vnlock == &vp->v_lock); + + return (lockstatus(&vp->v_lock)); +} + int __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, const char *wmesg, int pri, int timo, const char *file, int line) Index: sys/kern/vfs_default.c =================================================================== --- sys/kern/vfs_default.c +++ sys/kern/vfs_default.c @@ -540,69 +540,6 @@ return (lockstatus(ap->a_vp->v_vnlock)); } -/* - * Variants of the above set. - * - * Differences are: - * - shared locking disablement is not supported - * - v_vnlock pointer is not honored - */ -int -vop_lock(ap) - struct vop_lock1_args /* { - struct vnode *a_vp; - int a_flags; - char *file; - int line; - } */ *ap; -{ - struct vnode *vp = ap->a_vp; - int flags = ap->a_flags; - struct mtx *ilk; - - MPASS(vp->v_vnlock == &vp->v_lock); - - if (__predict_false((flags & ~(LK_TYPE_MASK | LK_NODDLKTREAT | LK_RETRY)) != 0)) - goto other; - - switch (flags & LK_TYPE_MASK) { - case LK_SHARED: - return (lockmgr_slock(&vp->v_lock, flags, ap->a_file, ap->a_line)); - case LK_EXCLUSIVE: - return (lockmgr_xlock(&vp->v_lock, flags, ap->a_file, ap->a_line)); - } -other: - ilk = VI_MTX(vp); - return (lockmgr_lock_fast_path(&vp->v_lock, flags, - &ilk->lock_object, ap->a_file, ap->a_line)); -} - -int -vop_unlock(ap) - struct vop_unlock_args /* { - struct vnode *a_vp; - } */ *ap; -{ - struct vnode *vp = ap->a_vp; - - MPASS(vp->v_vnlock == &vp->v_lock); - - return (lockmgr_unlock(&vp->v_lock)); -} - -int -vop_islocked(ap) - struct vop_islocked_args /* { - struct vnode *a_vp; - } */ *ap; -{ - struct vnode *vp = ap->a_vp; - - MPASS(vp->v_vnlock == &vp->v_lock); - - return (lockstatus(&vp->v_lock)); -} - /* * Return true for select/poll. */ Index: sys/sys/lockmgr.h =================================================================== --- sys/sys/lockmgr.h +++ sys/sys/lockmgr.h @@ -94,6 +94,15 @@ void lockmgr_printinfo(const struct lock *lk); int lockstatus(const struct lock *lk); +struct vop_lock1_args; +int lockmgr_vop_lock(struct vop_lock1_args *ap); + +struct vop_unlock_args; +int lockmgr_vop_unlock(struct vop_unlock_args *ap); + +struct vop_islocked_args; +int lockmgr_vop_islocked(struct vop_islocked_args *ap); + /* * As far as the ilk can be a static NULL pointer these functions need a * strict prototype in order to safely use the lock_object member. Index: sys/sys/vnode.h =================================================================== --- sys/sys/vnode.h +++ sys/sys/vnode.h @@ -767,8 +767,6 @@ int vop_stdunlock(struct vop_unlock_args *); int vop_stdislocked(struct vop_islocked_args *); int vop_lock(struct vop_lock1_args *); -int vop_unlock(struct vop_unlock_args *); -int vop_islocked(struct vop_islocked_args *); int vop_stdputpages(struct vop_putpages_args *); int vop_nopoll(struct vop_poll_args *); int vop_stdaccess(struct vop_access_args *ap);