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