Hi, The following diff removes VLOCKSWORK flag.
This flag is currently used to mark or unmark a vnode to actively check vnode locking semantic (when compiled with VFSLCKDEBUG). Currently, VLOCKSWORK flag isn't properly set for several FS implementation which have full locking support, specially: - cd9660 - udf - fuse - msdosfs - tmpfs Instead of using a particular flag, I propose to directly check if v_op->vop_islocked is nullop or not to activate or not the vnode locking checks. Some alternate methods might be possible, like having a specific member inside struct vops. But it will only duplicate the fact that nullop is used as lock mecanism. I also slightly changed ASSERT_VP_ISLOCKED(vp) macro: - evaluate vp argument only once - explicitly check if VOP_ISLOCKED() != LK_EXCLUSIVE (it might returns error or 'locked by some else', and it doesn't mean "locked by me") - show the VOP_ISLOCKED returned code in panic message Some code are using ASSERT_VP_ISLOCKED() like code. I kept them simple. The direct impact on snapshots should be low as VFSLCKDEBUG isn't set by default. Comments or OK ? -- Sebastien Marie diff e44725a8dd99f82f94f37ecff5c0e710c4dba97e /home/semarie/repos/openbsd/sys-clean blob - c752dd99e9ef62b05162cfeda67913ab5bccf06e file + kern/vfs_subr.c --- kern/vfs_subr.c +++ kern/vfs_subr.c @@ -1075,9 +1075,6 @@ vclean(struct vnode *vp, int flags, struct proc *p) vp->v_op = &dead_vops; VN_KNOTE(vp, NOTE_REVOKE); vp->v_tag = VT_NON; -#ifdef VFSLCKDEBUG - vp->v_flag &= ~VLOCKSWORK; -#endif mtx_enter(&vnode_mtx); vp->v_lflag &= ~VXLOCK; if (vp->v_lflag & VXWANT) { @@ -1930,7 +1927,7 @@ vinvalbuf(struct vnode *vp, int flags, struct ucred *c int s, error; #ifdef VFSLCKDEBUG - if ((vp->v_flag & VLOCKSWORK) && !VOP_ISLOCKED(vp)) + if ((vp->v_op->vop_islocked != nullop) && !VOP_ISLOCKED(vp)) panic("%s: vp isn't locked, vp %p", __func__, vp); #endif blob - caf2dc327bfc2f5a001bcee80edd90938497ef99 file + kern/vfs_vops.c --- kern/vfs_vops.c +++ kern/vfs_vops.c @@ -48,11 +48,15 @@ #include <sys/systm.h> #ifdef VFSLCKDEBUG -#define ASSERT_VP_ISLOCKED(vp) do { \ - if (((vp)->v_flag & VLOCKSWORK) && !VOP_ISLOCKED(vp)) { \ - VOP_PRINT(vp); \ - panic("vp not locked"); \ - } \ +#define ASSERT_VP_ISLOCKED(vp) do { \ + struct vnode *_vp = (vp); \ + int r; \ + if (_vp->v_op->vop_islocked == nullop) \ + break; \ + if ((r = VOP_ISLOCKED(_vp)) != LK_EXCLUSIVE) { \ + VOP_PRINT(_vp); \ + panic("%s: vp not locked, vp %p, %d", __func__, _vp, r);\ + } \ } while (0) #else #define ASSERT_VP_ISLOCKED(vp) /* nothing */ blob - 81b900e83d2071d8450f35cfae42c6cb91f1a414 file + nfs/nfs_node.c --- nfs/nfs_node.c +++ nfs/nfs_node.c @@ -133,9 +133,6 @@ loop: } vp = nvp; -#ifdef VFSLCKDEBUG - vp->v_flag |= VLOCKSWORK; -#endif rrw_init_flags(&np->n_lock, "nfsnode", RWL_DUPOK | RWL_IS_VNODE); vp->v_data = np; /* we now have an nfsnode on this vnode */ blob - 3668f954a9aab3fd49ed5e41e7d4ab51b4bf0a90 file + sys/vnode.h --- sys/vnode.h +++ sys/vnode.h @@ -146,8 +146,7 @@ struct vnode { #define VCLONED 0x0400 /* vnode was cloned */ #define VALIASED 0x0800 /* vnode has an alias */ #define VLARVAL 0x1000 /* vnode data not yet set up by higher level */ -#define VLOCKSWORK 0x4000 /* FS supports locking discipline */ -#define VCLONE 0x8000 /* vnode is a clone */ +#define VCLONE 0x4000 /* vnode is a clone */ /* * (v_bioflag) Flags that may be manipulated by interrupt handlers blob - d859d216b40ebb2f5cce1eb5cf0becbfff21a638 file + ufs/ext2fs/ext2fs_subr.c --- ufs/ext2fs/ext2fs_subr.c +++ ufs/ext2fs/ext2fs_subr.c @@ -170,9 +170,6 @@ ext2fs_vinit(struct mount *mp, struct vnode **vpp) nvp->v_data = vp->v_data; vp->v_data = NULL; vp->v_op = &spec_vops; -#ifdef VFSLCKDEBUG - vp->v_flag &= ~VLOCKSWORK; -#endif vrele(vp); vgone(vp); /* Reinitialize aliased vnode. */ blob - 2aedef06acfdc500a4019c3f75a986b648c5b36a file + ufs/ffs/ffs_subr.c --- ufs/ffs/ffs_subr.c +++ ufs/ffs/ffs_subr.c @@ -272,9 +272,6 @@ ffs_vinit(struct mount *mntp, struct vnode **vpp) nvp->v_data = vp->v_data; vp->v_data = NULL; vp->v_op = &spec_vops; -#ifdef VFSLCKDEBUG - vp->v_flag &= ~VLOCKSWORK; -#endif vrele(vp); vgone(vp); /* blob - 48303e6a811c99141707d1b1459f49fd06c2aa55 file + ufs/ffs/ffs_vfsops.c --- ufs/ffs/ffs_vfsops.c +++ ufs/ffs/ffs_vfsops.c @@ -1324,9 +1324,6 @@ retry: return (error); } -#ifdef VFSLCKDEBUG - vp->v_flag |= VLOCKSWORK; -#endif ip = pool_get(&ffs_ino_pool, PR_WAITOK|PR_ZERO); rrw_init_flags(&ip->i_lock, "inode", RWL_DUPOK | RWL_IS_VNODE); ip->i_ump = ump; blob - 5fc969c3ff77f79f429c6ad6815e3492bca4b26a file + uvm/uvm_vnode.c --- uvm/uvm_vnode.c +++ uvm/uvm_vnode.c @@ -1328,7 +1328,7 @@ uvm_vnp_uncache(struct vnode *vp) * carry over sanity check from old vnode pager: the vnode should * be VOP_LOCK'd, and we confirm it here. */ - if ((vp->v_flag & VLOCKSWORK) && !VOP_ISLOCKED(vp)) + if ((vp->v_op->vop_islocked != nullop) && !VOP_ISLOCKED(vp)) panic("uvm_vnp_uncache: vnode not locked!"); #endif