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
 

Reply via email to