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. */