And here it is the cd9660 part.

I prefered showing cd9660 over ffs, as ffs lock is shared between more
FS implementation (ext2fs, ffs).

else, cd9660 is similar to other implementations.


blob - 5082a7ad64a7c73a250023dd9e833b7ff91893b2
blob + 368b0a5b1252ba6b57401f28a8e0aad585828abb
--- sys/isofs/cd9660/cd9660_node.h
+++ sys/isofs/cd9660/cd9660_node.h
@@ -65,7 +65,6 @@ 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  rrwlock i_lock; /* node lock */
 
        doff_t  iso_extent;     /* extent of file */
        doff_t  i_size;
@@ -110,11 +109,8 @@ int        cd9660_reclaim(void *);
 int    cd9660_link(void *);
 int    cd9660_symlink(void *);
 int    cd9660_bmap(void *);
-int    cd9660_lock(void *);
-int    cd9660_unlock(void *);
 int    cd9660_strategy(void *);
 int    cd9660_print(void *);
-int    cd9660_islocked(void *);
 int    cd9660_pathconf(void *);
 
 int    cd9660_bufatoff(struct iso_node *, off_t, char **, struct buf **);
blob - 0bcfbd0270d8276b3569ade303fdd9b6d90a9505
blob + 8ca74c6685f468f3856f82fad2993065488bdaea
--- sys/isofs/cd9660/cd9660_vfsops.c
+++ sys/isofs/cd9660/cd9660_vfsops.c
@@ -715,7 +715,6 @@ retry:
                return (error);
        }
        ip = malloc(sizeof(*ip), M_ISOFSNODE, M_WAITOK | M_ZERO);
-       rrw_init_flags(&ip->i_lock, "isoinode", RWL_DUPOK | RWL_IS_VNODE);
        vp->v_data = ip;
        ip->i_vnode = vp;
        ip->i_dev = dev;
@@ -867,10 +866,10 @@ retry:
                if ((nvp = checkalias(vp, ip->inode.iso_rdev, mp)) != NULL) {
                        /*
                         * Discard unneeded vnode, but save its iso_node.
-                        * Note that the lock is carried over in the iso_node
                         */
                        nvp->v_data = vp->v_data;
                        vp->v_data = NULL;
+                       VOP_UNLOCK(vp); /* unlock before changing v_op */
                        vp->v_op = &spec_vops;
                        vrele(vp);
                        vgone(vp);
@@ -879,6 +878,7 @@ retry:
                         */
                        vp = nvp;
                        ip->i_vnode = vp;
+                       vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
                }
                break;
        case VLNK:
blob - ed1b5f39c7122cdcb37c133fae35d243a2995d90
blob + e9f20249ac4825abe12d206ac25d52c98af7ad29
--- sys/isofs/cd9660/cd9660_vnops.c
+++ sys/isofs/cd9660/cd9660_vnops.c
@@ -684,31 +684,6 @@ cd9660_symlink(void *v)
 }
 
 /*
- * Lock an inode.
- */
-int
-cd9660_lock(void *v)
-{
-       struct vop_lock_args *ap = v;
-       struct vnode *vp = ap->a_vp;
-
-       return rrw_enter(&VTOI(vp)->i_lock, ap->a_flags & LK_RWFLAGS);
-}
-
-/*
- * Unlock an inode.
- */
-int
-cd9660_unlock(void *v)
-{
-       struct vop_unlock_args *ap = v;
-       struct vnode *vp = ap->a_vp;
-
-       rrw_exit(&VTOI(vp)->i_lock);
-       return 0;
-}
-
-/*
  * Calculate the logical to physical mapping if not done already,
  * then call the device strategy routine.
  */
@@ -762,17 +737,6 @@ cd9660_print(void *v)
 }
 
 /*
- * Check for a locked inode.
- */
-int
-cd9660_islocked(void *v)
-{
-       struct vop_islocked_args *ap = v;
-
-       return rrw_status(&VTOI(ap->a_vp)->i_lock);
-}
-
-/*
  * Return POSIX pathconf information applicable to cd9660 filesystems.
  */
 int
@@ -840,12 +804,12 @@ const struct vops cd9660_vops = {
        .vop_abortop    = vop_generic_abortop,
        .vop_inactive   = cd9660_inactive,
        .vop_reclaim    = cd9660_reclaim,
-       .vop_lock       = cd9660_lock,
-       .vop_unlock     = cd9660_unlock,
+       .vop_lock       = vop_generic_lock,
+       .vop_unlock     = vop_generic_unlock,
+       .vop_islocked   = vop_generic_islocked,
        .vop_bmap       = cd9660_bmap,
        .vop_strategy   = cd9660_strategy,
        .vop_print      = cd9660_print,
-       .vop_islocked   = cd9660_islocked,
        .vop_pathconf   = cd9660_pathconf,
        .vop_advlock    = eopnotsupp,
        .vop_bwrite     = vop_generic_bwrite,
@@ -858,10 +822,10 @@ const struct vops cd9660_specvops = {
        .vop_setattr    = cd9660_setattr,
        .vop_inactive   = cd9660_inactive,
        .vop_reclaim    = cd9660_reclaim,
-       .vop_lock       = cd9660_lock,
-       .vop_unlock     = cd9660_unlock,
+       .vop_lock       = vop_generic_lock,
+       .vop_unlock     = vop_generic_unlock,
+       .vop_islocked   = vop_generic_islocked,
        .vop_print      = cd9660_print,
-       .vop_islocked   = cd9660_islocked,
 
        /* XXX: Keep in sync with spec_vops. */
        .vop_lookup     = vop_generic_lookup,
@@ -899,10 +863,10 @@ const struct vops cd9660_fifovops = {
        .vop_setattr    = cd9660_setattr,
        .vop_inactive   = cd9660_inactive,
        .vop_reclaim    = cd9660_reclaim,
-       .vop_lock       = cd9660_lock,
-       .vop_unlock     = cd9660_unlock,
+       .vop_lock       = vop_generic_lock,
+       .vop_unlock     = vop_generic_unlock,
+       .vop_islocked   = vop_generic_islocked,
        .vop_print      = cd9660_print,
-       .vop_islocked   = cd9660_islocked,
        .vop_bwrite     = vop_generic_bwrite,
 
        /* XXX: Keep in sync with fifo_vops. */

Reply via email to