It is time for the lockmgr() api to die. The api is only used by filesystems, where it is a trivial change to use rrw locks instead. All it needs is LK_* defines for the RW_* flags. (See the sys/lock.h hunk in the diff below.)
The ffs regress tests display the same number of fail/ok results before and after applying diff below, and I have done some manual testing with various filesystems on amd64 and macppc. Again, the purpose is to make filesystem code less scary and more comprehensible. Ok? natano Index: distrib/sets/lists/comp/mi =================================================================== RCS file: /cvs/src/distrib/sets/lists/comp/mi,v retrieving revision 1.1233 diff -u -p -r1.1233 mi --- distrib/sets/lists/comp/mi 23 May 2016 00:59:55 -0000 1.1233 +++ distrib/sets/lists/comp/mi 29 May 2016 18:13:57 -0000 @@ -2712,7 +2712,6 @@ ./usr/share/man/man9/kthread.9 ./usr/share/man/man9/ktrace.9 ./usr/share/man/man9/loadfirmware.9 -./usr/share/man/man9/lock.9 ./usr/share/man/man9/log.9 ./usr/share/man/man9/malloc.9 ./usr/share/man/man9/mbuf.9 Index: share/man/man9/Makefile =================================================================== RCS file: /cvs/src/share/man/man9/Makefile,v retrieving revision 1.276 diff -u -p -r1.276 Makefile --- share/man/man9/Makefile 25 Apr 2016 19:24:42 -0000 1.276 +++ share/man/man9/Makefile 29 May 2016 18:14:11 -0000 @@ -20,7 +20,7 @@ MAN= aml_evalnode.9 atomic_add_int.9 ato ieee80211_radiotap.9 if_get.9 if_rxr_init.9 ifq_enqueue.9 \ ifq_deq_begin.9 iic.9 intro.9 inittodr.9 intr_barrier.9 \ kern.9 km_alloc.9 knote.9 kthread.9 ktrace.9 \ - loadfirmware.9 lock.9 log.9 \ + loadfirmware.9 log.9 \ malloc.9 membar_sync.9 mbuf.9 mbuf_tags.9 md5.9 mi_switch.9 \ microtime.9 ml_init.9 mq_init.9 mutex.9 \ namei.9 \ Index: share/man/man9/VOP_LOOKUP.9 =================================================================== RCS file: /cvs/src/share/man/man9/VOP_LOOKUP.9,v retrieving revision 1.35 diff -u -p -r1.35 VOP_LOOKUP.9 --- share/man/man9/VOP_LOOKUP.9 23 May 2016 09:31:28 -0000 1.35 +++ share/man/man9/VOP_LOOKUP.9 29 May 2016 18:14:11 -0000 @@ -1,6 +1,7 @@ .\" $OpenBSD: VOP_LOOKUP.9,v 1.35 2016/05/23 09:31:28 natano Exp $ .\" .\" Copyright (c) 2003 Ted Unangst +.\" Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -565,16 +566,54 @@ to lock a vnode. It should not be used by other file system code. .Fn VOP_UNLOCK unlocks a vnode. -.Fn VOP_ISLOCKED -returns 1 if -.Fa vp -is locked and 0 if not. -It should be used cautiously, as not all file systems implement locks -effectively. Note the asymmetry between .Xr vn_lock 9 and .Fn VOP_UNLOCK . +.Pp +.Fa flags +may contain the following flags: +.Pp +.Bl -tag -width LK_RECURSEFAIL -compact -offset indent +.It Dv LK_EXCLUSIVE +Acquire an exclusive lock. +.It Dv LK_SHARED +Acquire a shared lock. +.It Dv LK_NOWAIT +Don't wait if the vnode lock is held by someone else +(may still wait on reclamation lock). +.It Dv LK_RECURSEFAIL +Attempt at recursive lock fails. +.It Dv LK_DRAIN +Wait for all activity on the lock to end, then mark it decommissioned. +This feature is used to ensure that no other activity can occur while the +underlying object of a vnode is being cleaned out. +Must be used in combination with +.Dv LK_EXCLUSIVE . +.El +.Pp +.Fn VOP_ISLOCKED +returns one of the following values: +.Pp +.Bl -tag -width LK_EXCLUSIVE -compact -offset indent +.It Dv LK_EXCLUSIVE +.Fa vp +is locked for exclusive access by the calling thread. +.It Dv LK_EXCLOTHER +.Fa vp +is locked for exclusive access by a different thread. +.It Dv LK_SHARED +.Fa vp +is locked for shared access. +The current thread may be one of the threads that have it locked. +.It 0 +.Fa vp +is not locked. +.El +.Pp +.Fn VOP_ISLOCKED +should be used cautiously, as not all file systems implement locks +effectively. .Pp .It Fn VOP_KQFILTER vp kn Register the Index: share/man/man9/mutex.9 =================================================================== RCS file: /cvs/src/share/man/man9/mutex.9,v retrieving revision 1.22 diff -u -p -r1.22 mutex.9 --- share/man/man9/mutex.9 13 Feb 2014 14:23:05 -0000 1.22 +++ share/man/man9/mutex.9 29 May 2016 18:14:11 -0000 @@ -104,7 +104,6 @@ function will return non-zero if it succ .Fa mtxp , otherwise it will return 0. .Sh SEE ALSO -.Xr lockmgr 9 , .Xr msleep 9 , .Xr rwlock 9 , .Xr spl 9 Index: share/man/man9/rwlock.9 =================================================================== RCS file: /cvs/src/share/man/man9/rwlock.9,v retrieving revision 1.17 diff -u -p -r1.17 rwlock.9 --- share/man/man9/rwlock.9 9 Jul 2014 18:00:09 -0000 1.17 +++ share/man/man9/rwlock.9 29 May 2016 18:14:11 -0000 @@ -183,8 +183,8 @@ can be called during autoconf, from proc .Pp All other functions can be called during autoconf or from process context. .Sh SEE ALSO -.Xr lockmgr 9 , -.Xr mutex 9 +.Xr mutex 9 , +.Xr spl 9 .Sh HISTORY The .Nm Index: share/man/man9/vnsubr.9 =================================================================== RCS file: /cvs/src/share/man/man9/vnsubr.9,v retrieving revision 1.11 diff -u -p -r1.11 vnsubr.9 --- share/man/man9/vnsubr.9 3 Sep 2011 22:59:07 -0000 1.11 +++ share/man/man9/vnsubr.9 29 May 2016 18:14:11 -0000 @@ -125,22 +125,17 @@ Instead, the .Xr vget 9 function should be used. .Pp -The +In addition to the .Fa flags -argument may contain the following flags: +accepted by +.Xr VOP_LOCK 9 , +the following flag may be used: .Pp -.Bl -tag -width LK_EXCLUSIVE -offset indent -compact +.Bl -tag -width LK_RETRY -offset indent -compact .It Dv LK_RETRY Return the vnode even if it has been reclaimed. -.It Dv LK_NOWAIT -Don't wait if the vnode lock is held by someone else -(may still wait on reclamation lock). Must not be used with -.Dv LK_RETRY . -.It Dv LK_EXCLUSIVE -Acquire an exclusive lock. -.It Dv LK_SHARED -Acquire a shared lock. +.Dv LK_NOWAIT . .El .Pp The Index: sys/isofs/cd9660/cd9660_node.c =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_node.c,v retrieving revision 1.30 diff -u -p -r1.30 cd9660_node.c --- sys/isofs/cd9660/cd9660_node.c 19 Mar 2016 12:04:15 -0000 1.30 +++ sys/isofs/cd9660/cd9660_node.c 29 May 2016 18:14:12 -0000 @@ -146,7 +146,7 @@ cd9660_ihashins(ip) *ipp = ip; /* XXX locking unlock hash list? */ - lockmgr(&ip->i_lock, LK_EXCLUSIVE, NULL); + rrw_enter(&ip->i_lock, RW_WRITE); return (0); } Index: sys/isofs/cd9660/cd9660_node.h =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_node.h,v retrieving revision 1.19 diff -u -p -r1.19 cd9660_node.h --- sys/isofs/cd9660/cd9660_node.h 2 Jun 2013 01:07:39 -0000 1.19 +++ sys/isofs/cd9660/cd9660_node.h 29 May 2016 18:14:12 -0000 @@ -66,7 +66,7 @@ struct iso_node { doff_t i_diroff; /* offset in dir, where we found last entry */ doff_t i_offset; /* offset of free space in directory */ cdino_t i_ino; /* inode number of found directory */ - struct lock i_lock; /* node lock */ + struct rrwlock i_lock; /* node lock */ doff_t iso_extent; /* extent of file */ doff_t i_size; Index: sys/isofs/cd9660/cd9660_vfsops.c =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vfsops.c,v retrieving revision 1.79 diff -u -p -r1.79 cd9660_vfsops.c --- sys/isofs/cd9660/cd9660_vfsops.c 22 May 2016 20:27:04 -0000 1.79 +++ sys/isofs/cd9660/cd9660_vfsops.c 29 May 2016 18:14:12 -0000 @@ -771,7 +771,7 @@ retry: return (error); } ip = malloc(sizeof(*ip), M_ISOFSNODE, M_WAITOK | M_ZERO); - lockinit(&ip->i_lock, PINOD, "isoinode", 0, 0); + rrw_init(&ip->i_lock, "isoinode"); vp->v_data = ip; ip->i_vnode = vp; ip->i_dev = dev; Index: sys/isofs/cd9660/cd9660_vnops.c =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vnops.c,v retrieving revision 1.75 diff -u -p -r1.75 cd9660_vnops.c --- sys/isofs/cd9660/cd9660_vnops.c 19 Mar 2016 12:04:15 -0000 1.75 +++ sys/isofs/cd9660/cd9660_vnops.c 29 May 2016 18:14:12 -0000 @@ -696,7 +696,7 @@ cd9660_lock(void *v) struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags, NULL)); + return rrw_enter(&VTOI(vp)->i_lock, ap->a_flags & LK_RWFLAGS); } /* @@ -708,7 +708,8 @@ cd9660_unlock(void *v) struct vop_unlock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->i_lock, LK_RELEASE, NULL)); + rrw_exit(&VTOI(vp)->i_lock); + return 0; } /* @@ -772,7 +773,7 @@ cd9660_islocked(void *v) { struct vop_islocked_args *ap = v; - return (lockstatus(&VTOI(ap->a_vp)->i_lock)); + return rrw_status(&VTOI(ap->a_vp)->i_lock); } /* Index: sys/isofs/udf/udf.h =================================================================== RCS file: /cvs/src/sys/isofs/udf/udf.h,v retrieving revision 1.20 diff -u -p -r1.20 udf.h --- sys/isofs/udf/udf.h 18 Nov 2014 10:42:15 -0000 1.20 +++ sys/isofs/udf/udf.h 29 May 2016 18:14:12 -0000 @@ -41,7 +41,7 @@ struct unode { struct vnode *u_vnode; struct vnode *u_devvp; struct umount *u_ump; - struct lock u_lock; + struct rrwlock u_lock; dev_t u_dev; udfino_t u_ino; union { Index: sys/isofs/udf/udf_vfsops.c =================================================================== RCS file: /cvs/src/sys/isofs/udf/udf_vfsops.c,v retrieving revision 1.51 diff -u -p -r1.51 udf_vfsops.c --- sys/isofs/udf/udf_vfsops.c 22 May 2016 20:27:04 -0000 1.51 +++ sys/isofs/udf/udf_vfsops.c 29 May 2016 18:14:12 -0000 @@ -653,7 +653,7 @@ udf_vget(struct mount *mp, ino_t ino, st vp->v_data = up; vref(ump->um_devvp); - lockinit(&up->u_lock, PINOD, "unode", 0, 0); + rrw_init(&up->u_lock, "unode"); /* * udf_hashins() will lock the vnode for us. Index: sys/isofs/udf/udf_vnops.c =================================================================== RCS file: /cvs/src/sys/isofs/udf/udf_vnops.c,v retrieving revision 1.63 diff -u -p -r1.63 udf_vnops.c --- sys/isofs/udf/udf_vnops.c 19 Mar 2016 12:04:15 -0000 1.63 +++ sys/isofs/udf/udf_vnops.c 29 May 2016 18:14:12 -0000 @@ -898,20 +898,19 @@ int udf_lock(void *v) { struct vop_lock_args *ap = v; - struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOU(vp)->u_lock, ap->a_flags, NULL)); + return rrw_enter(&VTOU(vp)->u_lock, ap->a_flags & LK_RWFLAGS); } int udf_unlock(void *v) { struct vop_unlock_args *ap = v; - struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOU(vp)->u_lock, LK_RELEASE, NULL)); + rrw_exit(&VTOU(vp)->u_lock); + return 0; } int @@ -919,7 +918,7 @@ udf_islocked(void *v) { struct vop_islocked_args *ap = v; - return (lockstatus(&VTOU(ap->a_vp)->u_lock)); + return rrw_status(&VTOU(ap->a_vp)->u_lock); } int Index: sys/kern/kern_lock.c =================================================================== RCS file: /cvs/src/sys/kern/kern_lock.c,v retrieving revision 1.46 diff -u -p -r1.46 kern_lock.c --- sys/kern/kern_lock.c 14 Sep 2014 14:17:25 -0000 1.46 +++ sys/kern/kern_lock.c 29 May 2016 18:14:12 -0000 @@ -45,63 +45,6 @@ int __mp_lock_spinout = 200000000; #endif -/* - * Initialize a lock; required before use. - */ -void -lockinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags) -{ - KASSERT(flags == 0); - - memset(lkp, 0, sizeof(struct lock)); - rrw_init(&lkp->lk_lck, wmesg); -} - -int -lockstatus(struct lock *lkp) -{ - switch (rrw_status(&lkp->lk_lck)) { - case RW_WRITE: - return (LK_EXCLUSIVE); - case RW_WRITE_OTHER: - return (LK_EXCLOTHER); - case RW_READ: - return (LK_SHARED); - case 0: - default: - return (0); - } -} - -int -lockmgr(struct lock *lkp, u_int flags, void *notused) -{ - int rwflags = 0; - - KASSERT(!((flags & (LK_SHARED|LK_EXCLUSIVE)) == - (LK_SHARED|LK_EXCLUSIVE))); - KASSERT(!((flags & (LK_CANRECURSE|LK_RECURSEFAIL)) == - (LK_CANRECURSE|LK_RECURSEFAIL))); - KASSERT((flags & LK_RELEASE) || - (flags & (LK_SHARED|LK_EXCLUSIVE|LK_DRAIN))); - - if (flags & LK_RELEASE) { - rrw_exit(&lkp->lk_lck); - return (0); - } - if (flags & LK_SHARED) - rwflags |= RW_READ; - if (flags & (LK_EXCLUSIVE|LK_DRAIN)) - rwflags |= RW_WRITE; - if (flags & LK_RECURSEFAIL) - rwflags |= RW_RECURSEFAIL; - if (flags & LK_NOWAIT) - rwflags |= RW_NOSLEEP; - - return (rrw_enter(&lkp->lk_lck, rwflags)); - -} - #if defined(MULTIPROCESSOR) /* * Functions for manipulating the kernel_lock. We put them here Index: sys/kern/vfs_subr.c =================================================================== RCS file: /cvs/src/sys/kern/vfs_subr.c,v retrieving revision 1.247 diff -u -p -r1.247 vfs_subr.c --- sys/kern/vfs_subr.c 26 May 2016 16:03:29 -0000 1.247 +++ sys/kern/vfs_subr.c 29 May 2016 18:14:12 -0000 @@ -957,7 +957,7 @@ vclean(struct vnode *vp, int flags, stru * For active vnodes, it ensures that no other activity can * occur while the underlying object is being cleaned out. */ - VOP_LOCK(vp, LK_DRAIN, p); + VOP_LOCK(vp, LK_DRAIN | LK_EXCLUSIVE, p); /* * Clean out any VM data associated with the vnode. Index: sys/kern/vfs_vnops.c =================================================================== RCS file: /cvs/src/sys/kern/vfs_vnops.c,v retrieving revision 1.84 diff -u -p -r1.84 vfs_vnops.c --- sys/kern/vfs_vnops.c 19 Mar 2016 12:04:15 -0000 1.84 +++ sys/kern/vfs_vnops.c 29 May 2016 18:14:12 -0000 @@ -513,9 +513,6 @@ vn_lock(struct vnode *vp, int flags, str { int error; - if ((flags & LK_RECURSEFAIL) == 0) - flags |= LK_CANRECURSE; - do { if (vp->v_flag & VXLOCK) { vp->v_flag |= VXWANT; Index: sys/miscfs/fuse/fuse_vfsops.c =================================================================== RCS file: /cvs/src/sys/miscfs/fuse/fuse_vfsops.c,v retrieving revision 1.22 diff -u -p -r1.22 fuse_vfsops.c --- sys/miscfs/fuse/fuse_vfsops.c 26 May 2016 16:03:29 -0000 1.22 +++ sys/miscfs/fuse/fuse_vfsops.c 29 May 2016 18:14:12 -0000 @@ -270,7 +270,7 @@ retry: } ip = malloc(sizeof(*ip), M_FUSEFS, M_WAITOK | M_ZERO); - lockinit(&ip->ufs_ino.i_lock, PINOD, "fuseinode", 0, 0); + rrw_init(&ip->ufs_ino.i_lock, "fuseinode"); nvp->v_data = ip; ip->ufs_ino.i_vnode = nvp; ip->ufs_ino.i_dev = fmp->dev; Index: sys/miscfs/fuse/fuse_vnops.c =================================================================== RCS file: /cvs/src/sys/miscfs/fuse/fuse_vnops.c,v retrieving revision 1.27 diff -u -p -r1.27 fuse_vnops.c --- sys/miscfs/fuse/fuse_vnops.c 19 Mar 2016 12:04:15 -0000 1.27 +++ sys/miscfs/fuse/fuse_vnops.c 29 May 2016 18:14:12 -0000 @@ -1473,7 +1473,7 @@ fusefs_lock(void *v) struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->ufs_ino.i_lock, ap->a_flags, NULL)); + return rrw_enter(&VTOI(vp)->ufs_ino.i_lock, ap->a_flags & LK_RWFLAGS); } int @@ -1482,7 +1482,8 @@ fusefs_unlock(void *v) struct vop_unlock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->ufs_ino.i_lock, LK_RELEASE, NULL)); + rrw_exit(&VTOI(vp)->ufs_ino.i_lock); + return 0; } int @@ -1490,7 +1491,7 @@ fusefs_islocked(void *v) { struct vop_islocked_args *ap = v; - return (lockstatus(&VTOI(ap->a_vp)->ufs_ino.i_lock)); + return rrw_status(&VTOI(ap->a_vp)->ufs_ino.i_lock); } int Index: sys/msdosfs/denode.h =================================================================== RCS file: /cvs/src/sys/msdosfs/denode.h,v retrieving revision 1.28 diff -u -p -r1.28 denode.h --- sys/msdosfs/denode.h 13 Jan 2016 10:00:55 -0000 1.28 +++ sys/msdosfs/denode.h 29 May 2016 18:14:12 -0000 @@ -149,7 +149,7 @@ struct denode { long de_refcnt; /* reference count */ struct msdosfsmount *de_pmp; /* addr of our mount struct */ struct lockf *de_lockf; /* byte level lock list */ - struct lock de_lock; /* denode lock */ + struct rrwlock de_lock; /* denode lock */ u_char de_Name[11]; /* name, from DOS directory entry */ u_char de_Attributes; /* attributes, from directory entry */ u_char de_CTimeHundredth; /* creation time, 1/100th of a sec */ Index: sys/msdosfs/msdosfs_denode.c =================================================================== RCS file: /cvs/src/sys/msdosfs/msdosfs_denode.c,v retrieving revision 1.56 diff -u -p -r1.56 msdosfs_denode.c --- sys/msdosfs/msdosfs_denode.c 19 Mar 2016 12:04:16 -0000 1.56 +++ sys/msdosfs/msdosfs_denode.c 29 May 2016 18:14:12 -0000 @@ -233,7 +233,7 @@ retry: return (error); } ldep = malloc(sizeof(*ldep), M_MSDOSFSNODE, M_WAITOK | M_ZERO); - lockinit(&ldep->de_lock, PINOD, "denode", 0, 0); + rrw_init(&ldep->de_lock, "denode"); nvp->v_data = ldep; ldep->de_vnode = nvp; ldep->de_flag = 0; Index: sys/msdosfs/msdosfs_vnops.c =================================================================== RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v retrieving revision 1.111 diff -u -p -r1.111 msdosfs_vnops.c --- sys/msdosfs/msdosfs_vnops.c 21 May 2016 18:11:36 -0000 1.111 +++ sys/msdosfs/msdosfs_vnops.c 29 May 2016 18:14:12 -0000 @@ -1721,7 +1721,7 @@ msdosfs_lock(void *v) struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTODE(vp)->de_lock, ap->a_flags, NULL)); + return rrw_enter(&VTODE(vp)->de_lock, ap->a_flags & LK_RWFLAGS); } int @@ -1730,7 +1730,8 @@ msdosfs_unlock(void *v) struct vop_unlock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTODE(vp)->de_lock, LK_RELEASE, NULL)); + rrw_exit(&VTODE(vp)->de_lock); + return 0; } int @@ -1738,7 +1739,7 @@ msdosfs_islocked(void *v) { struct vop_islocked_args *ap = v; - return (lockstatus(&VTODE(ap->a_vp)->de_lock)); + return rrw_status(&VTODE(ap->a_vp)->de_lock); } /* Index: sys/ntfs/ntfs_vfsops.c =================================================================== RCS file: /cvs/src/sys/ntfs/ntfs_vfsops.c,v retrieving revision 1.51 diff -u -p -r1.51 ntfs_vfsops.c --- sys/ntfs/ntfs_vfsops.c 22 May 2016 20:27:04 -0000 1.51 +++ sys/ntfs/ntfs_vfsops.c 29 May 2016 18:14:12 -0000 @@ -522,7 +522,7 @@ ntfs_unmount(struct mount *mp, int mntfl ntmp->ntm_devvp->v_specmountpoint = NULL; /* lock the device vnode before calling VOP_CLOSE() */ - VOP_LOCK(ntmp->ntm_devvp, LK_EXCLUSIVE | LK_RETRY, p); + vn_lock(ntmp->ntm_devvp, LK_EXCLUSIVE | LK_RETRY, p); vinvalbuf(ntmp->ntm_devvp, V_SAVE, NOCRED, p, 0, 0); (void)VOP_CLOSE(ntmp->ntm_devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); Index: sys/sys/lock.h =================================================================== RCS file: /cvs/src/sys/sys/lock.h,v retrieving revision 1.26 diff -u -p -r1.26 lock.h --- sys/sys/lock.h 23 Sep 2015 15:37:26 -0000 1.26 +++ sys/sys/lock.h 29 May 2016 18:14:12 -0000 @@ -40,25 +40,16 @@ #include <sys/rwlock.h> -struct lock { - struct rrwlock lk_lck; -}; +#define LK_EXCLUSIVE RW_WRITE /* exclusive lock */ +#define LK_SHARED RW_READ /* shared lock */ +#define LK_TYPE_MASK (RW_WRITE|RW_READ) /* type of lock sought */ +#define LK_NOWAIT RW_NOSLEEP /* do not sleep to await lock */ +#define LK_RECURSEFAIL RW_RECURSEFAIL /* fail if recursive exclusive lock */ +#define LK_EXCLOTHER RW_WRITE_OTHER /* exclusive lock held by some other thread */ +#define LK_RWFLAGS (RW_WRITE|RW_READ|RW_NOSLEEP|RW_RECURSEFAIL|RW_WRITE_OTHER) -#define LK_SHARED 0x01 /* shared lock */ -#define LK_EXCLUSIVE 0x02 /* exclusive lock */ -#define LK_TYPE_MASK 0x03 /* type of lock sought */ -#define LK_DRAIN 0x04 /* wait for all lock activity to end */ -#define LK_RELEASE 0x08 /* release any type of lock */ -#define LK_NOWAIT 0x10 /* do not sleep to await lock */ -#define LK_CANRECURSE 0x20 /* allow recursive exclusive lock */ -#define LK_RECURSEFAIL 0x40 /* fail if recursive exclusive lock */ -#define LK_RETRY 0x80 /* vn_lock: retry until locked */ - -/* for lockstatus() only */ -#define LK_EXCLOTHER 0x100 /* exclusive lock held by some other thread */ - -void lockinit(struct lock *, int, char *, int, int); -int lockmgr(struct lock *, u_int flags, void *); -int lockstatus(struct lock *); +/* LK_ specific */ +#define LK_DRAIN 0x1000UL /* wait for all lock activity to end */ +#define LK_RETRY 0x2000UL /* vn_lock: retry until locked */ #endif /* !_LOCK_H_ */ Index: sys/tmpfs/tmpfs.h =================================================================== RCS file: /cvs/src/sys/tmpfs/tmpfs.h,v retrieving revision 1.7 diff -u -p -r1.7 tmpfs.h --- sys/tmpfs/tmpfs.h 17 Dec 2014 19:42:15 -0000 1.7 +++ sys/tmpfs/tmpfs.h 29 May 2016 18:14:12 -0000 @@ -94,7 +94,7 @@ typedef struct tmpfs_node { * no vnode has been allocated or it has been reclaimed). */ struct rwlock tn_nlock; /* node lock */ - struct lock tn_vlock; /* vnode lock */ + struct rrwlock tn_vlock; /* vnode lock */ struct vnode * tn_vnode; /* Directory entry. Only a hint, since hard link can have multiple. */ Index: sys/tmpfs/tmpfs_subr.c =================================================================== RCS file: /cvs/src/sys/tmpfs/tmpfs_subr.c,v retrieving revision 1.15 diff -u -p -r1.15 tmpfs_subr.c --- sys/tmpfs/tmpfs_subr.c 6 Feb 2016 16:10:23 -0000 1.15 +++ sys/tmpfs/tmpfs_subr.c 29 May 2016 18:14:12 -0000 @@ -314,7 +314,7 @@ again: return error; } - lockinit(&node->tn_vlock, PINOD, "tnode", 0, 0); + rrw_init(&node->tn_vlock, "tnode"); vp->v_type = node->tn_type; /* Type-specific initialization. */ Index: sys/tmpfs/tmpfs_vnops.c =================================================================== RCS file: /cvs/src/sys/tmpfs/tmpfs_vnops.c,v retrieving revision 1.26 diff -u -p -r1.26 tmpfs_vnops.c --- sys/tmpfs/tmpfs_vnops.c 2 May 2016 20:06:58 -0000 1.26 +++ sys/tmpfs/tmpfs_vnops.c 29 May 2016 18:14:12 -0000 @@ -1194,7 +1194,7 @@ tmpfs_lock(void *v) struct vop_lock_args *ap = v; tmpfs_node_t *tnp = VP_TO_TMPFS_NODE(ap->a_vp); - return lockmgr(&tnp->tn_vlock, ap->a_flags, NULL); + return rrw_enter(&tnp->tn_vlock, ap->a_flags & LK_RWFLAGS); } int @@ -1203,7 +1203,8 @@ tmpfs_unlock(void *v) struct vop_unlock_args *ap = v; tmpfs_node_t *tnp = VP_TO_TMPFS_NODE(ap->a_vp); - return lockmgr(&tnp->tn_vlock, LK_RELEASE, NULL); + rrw_exit(&tnp->tn_vlock); + return 0; } int @@ -1212,7 +1213,7 @@ tmpfs_islocked(void *v) struct vop_islocked_args *ap = v; tmpfs_node_t *tnp = VP_TO_TMPFS_NODE(ap->a_vp); - return lockstatus(&tnp->tn_vlock); + return rrw_status(&tnp->tn_vlock); } /* Index: sys/ufs/ext2fs/ext2fs_vfsops.c =================================================================== RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_vfsops.c,v retrieving revision 1.91 diff -u -p -r1.91 ext2fs_vfsops.c --- sys/ufs/ext2fs/ext2fs_vfsops.c 22 May 2016 20:27:04 -0000 1.91 +++ sys/ufs/ext2fs/ext2fs_vfsops.c 29 May 2016 18:14:12 -0000 @@ -843,7 +843,7 @@ ext2fs_vget(struct mount *mp, ino_t ino, } ip = pool_get(&ext2fs_inode_pool, PR_WAITOK|PR_ZERO); - lockinit(&ip->i_lock, PINOD, "inode", 0, 0); + rrw_init(&ip->i_lock, "inode"); vp->v_data = ip; ip->i_vnode = vp; ip->i_ump = ump; Index: sys/ufs/ffs/ffs_vfsops.c =================================================================== RCS file: /cvs/src/sys/ufs/ffs/ffs_vfsops.c,v retrieving revision 1.158 diff -u -p -r1.158 ffs_vfsops.c --- sys/ufs/ffs/ffs_vfsops.c 23 May 2016 09:31:28 -0000 1.158 +++ sys/ufs/ffs/ffs_vfsops.c 29 May 2016 18:14:12 -0000 @@ -1295,7 +1295,7 @@ retry: vp->v_flag |= VLOCKSWORK; #endif ip = pool_get(&ffs_ino_pool, PR_WAITOK|PR_ZERO); - lockinit(&ip->i_lock, PINOD, "inode", 0, 0); + rrw_init(&ip->i_lock, "inode"); ip->i_ump = ump; vref(ip->i_devvp); vp->v_data = ip; Index: sys/ufs/ufs/inode.h =================================================================== RCS file: /cvs/src/sys/ufs/ufs/inode.h,v retrieving revision 1.49 diff -u -p -r1.49 inode.h --- sys/ufs/ufs/inode.h 14 Jul 2014 08:54:13 -0000 1.49 +++ sys/ufs/ufs/inode.h 29 May 2016 18:14:12 -0000 @@ -86,7 +86,7 @@ struct inode { struct dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */ u_quad_t i_modrev; /* Revision level for NFS lease. */ struct lockf *i_lockf;/* Head of byte-level lock list. */ - struct lock i_lock; /* Inode lock */ + struct rrwlock i_lock;/* Inode lock */ /* * Side effects; used during directory lookup. Index: sys/ufs/ufs/ufs_ihash.c =================================================================== RCS file: /cvs/src/sys/ufs/ufs/ufs_ihash.c,v retrieving revision 1.22 diff -u -p -r1.22 ufs_ihash.c --- sys/ufs/ufs/ufs_ihash.c 14 Mar 2015 03:38:53 -0000 1.22 +++ sys/ufs/ufs/ufs_ihash.c 29 May 2016 18:14:12 -0000 @@ -138,7 +138,7 @@ ufs_ihashins(struct inode *ip) ufsino_t inum = ip->i_number; /* lock the inode, then put it on the appropriate hash list */ - lockmgr(&ip->i_lock, LK_EXCLUSIVE, NULL); + rrw_enter(&ip->i_lock, RW_WRITE); /* XXXLOCKING lock hash list */ @@ -146,7 +146,7 @@ ufs_ihashins(struct inode *ip) LIST_FOREACH(curip, ipp, i_hash) { if (inum == curip->i_number && dev == curip->i_dev) { /* XXXLOCKING unlock hash list? */ - lockmgr(&ip->i_lock, LK_RELEASE, NULL); + rrw_exit(&ip->i_lock); return (EEXIST); } } Index: sys/ufs/ufs/ufs_vnops.c =================================================================== RCS file: /cvs/src/sys/ufs/ufs/ufs_vnops.c,v retrieving revision 1.127 diff -u -p -r1.127 ufs_vnops.c --- sys/ufs/ufs/ufs_vnops.c 19 Mar 2016 12:04:16 -0000 1.127 +++ sys/ufs/ufs/ufs_vnops.c 29 May 2016 18:14:12 -0000 @@ -1538,7 +1538,7 @@ ufs_lock(void *v) struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags, NULL)); + return rrw_enter(&VTOI(vp)->i_lock, ap->a_flags & LK_RWFLAGS); } /* @@ -1550,7 +1550,8 @@ ufs_unlock(void *v) struct vop_unlock_args *ap = v; struct vnode *vp = ap->a_vp; - return (lockmgr(&VTOI(vp)->i_lock, LK_RELEASE, NULL)); + rrw_exit(&VTOI(vp)->i_lock); + return 0; } /* @@ -1561,7 +1562,7 @@ ufs_islocked(void *v) { struct vop_islocked_args *ap = v; - return (lockstatus(&VTOI(ap->a_vp)->i_lock)); + return rrw_status(&VTOI(ap->a_vp)->i_lock); } /* cvs rm share/man/man9/lock.9