Index: coda/coda_subr.c =========================================================================== --- coda/coda_subr.c 2003/10/30 22:44:22 #12 +++ coda/coda_subr.c 2003/10/30 22:44:22 @@ -307,12 +307,12 @@ void coda_checkunmounting(mp) struct mount *mp; -{ +{ register struct vnode *vp, *nvp; struct cnode *cp; int count = 0, bad = 0; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp; vp = nvp) { nvp = TAILQ_NEXT(vp, v_nmntvnodes); if (vp->v_mount != mp) @@ -331,7 +331,7 @@ } VI_UNLOCK(vp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); } void Index: fs/msdosfs/msdosfs_vfsops.c =========================================================================== --- fs/msdosfs/msdosfs_vfsops.c 2003/10/30 22:44:22 #31 +++ fs/msdosfs/msdosfs_vfsops.c 2003/10/30 22:44:22 @@ -778,7 +778,7 @@ /* * Write back each (modified) denode. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { /* @@ -794,19 +794,19 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); dep = VTODE(vp); if (vp->v_type == VNON || ((dep->de_flag & (DE_ACCESS | DE_CREATE | DE_UPDATE | DE_MODIFIED)) == 0 && (TAILQ_EMPTY(&vp->v_dirtyblkhd) || waitfor == MNT_LAZY))) { VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, td); if (error) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (error == ENOENT) goto loop; continue; @@ -814,11 +814,10 @@ error = VOP_FSYNC(vp, cred, waitfor, td); if (error) allerror = error; - VOP_UNLOCK(vp, 0, td); - vrele(vp); - mtx_lock(&mntvnode_mtx); + vput(vp); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * Flush filesystem control info. Index: fs/unionfs/union_vfsops.c =========================================================================== --- fs/unionfs/union_vfsops.c 2003/10/30 22:44:22 #16 +++ fs/unionfs/union_vfsops.c 2003/10/30 22:44:22 @@ -351,11 +351,7 @@ int n; /* count #vnodes held on mount list */ - mtx_lock(&mntvnode_mtx); - n = 0; - TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) - n++; - mtx_unlock(&mntvnode_mtx); + n = mp->mnt_nvnodelistsize; /* if this is unchanged then stop */ if (n == freeing) Index: gnu/ext2fs/ext2_vfsops.c =========================================================================== --- gnu/ext2fs/ext2_vfsops.c 2003/10/30 22:44:22 #29 +++ gnu/ext2fs/ext2_vfsops.c 2003/10/30 22:44:22 @@ -569,10 +569,10 @@ brelse(bp); loop: - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); for (vp = TAILQ_FIRST(&mountp->mnt_nvnodelist); vp != NULL; vp = nvp) { if (vp->v_mount != mountp) { - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); goto loop; } nvp = TAILQ_NEXT(vp, v_nmntvnodes); @@ -581,7 +581,7 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * Step 4: invalidate all inactive vnodes. */ @@ -612,9 +612,9 @@ EXT2_INODE_SIZE * ino_to_fsbo(fs, ip->i_number)), ip); brelse(bp); vput(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return (0); } @@ -899,7 +899,7 @@ /* * Write back each (modified) inode. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { /* @@ -914,30 +914,29 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); ip = VTOI(vp); if (vp->v_type == VNON || ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) == 0 && (TAILQ_EMPTY(&vp->v_dirtyblkhd) || waitfor == MNT_LAZY))) { VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, td); if (error) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (error == ENOENT) goto loop; continue; } if ((error = VOP_FSYNC(vp, cred, waitfor, td)) != 0) allerror = error; - VOP_UNLOCK(vp, 0, td); - vrele(vp); - mtx_lock(&mntvnode_mtx); + vput(vp); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * Force stale file system control information to be flushed. */ Index: kern/vfs_default.c =========================================================================== --- kern/vfs_default.c 2003/10/30 22:44:22 #35 +++ kern/vfs_default.c 2003/10/30 22:44:22 @@ -879,7 +879,7 @@ /* * Force stale buffer cache information to be flushed. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { /* @@ -896,10 +896,10 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if ((error = vget(vp, lockreq, td)) != 0) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (error == ENOENT) goto loop; continue; @@ -908,14 +908,10 @@ if (error) allerror = error; - mtx_lock(&mntvnode_mtx); - if (nvp != TAILQ_NEXT(vp, v_nmntvnodes)) { - vput(vp); - goto loop; - } vput(vp); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return (allerror); } Index: kern/vfs_mount.c =========================================================================== --- kern/vfs_mount.c 2003/10/30 22:44:22 #44 +++ kern/vfs_mount.c 2003/10/30 22:44:22 @@ -116,9 +116,6 @@ /* For any iteration/modification of mountlist */ struct mtx mountlist_mtx; -/* For any iteration/modification of mnt_vnodelist */ -struct mtx mntvnode_mtx; - /* * The vnode of the system's root (/ in the filesystem, without chroot * active.) @@ -662,6 +659,7 @@ TAILQ_INIT(&mp->mnt_nvnodelist); TAILQ_INIT(&mp->mnt_reservedvnlist); mp->mnt_nvnodelistsize = 0; + mtx_init(&mp->mnt_mtx, "struct mount mtx", NULL, MTX_DEF); lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); (void)vfs_busy(mp, LK_NOWAIT, 0, td); mp->mnt_op = vfsp->vfc_vfsops; @@ -1029,6 +1027,7 @@ TAILQ_INIT(&mp->mnt_nvnodelist); TAILQ_INIT(&mp->mnt_reservedvnlist); mp->mnt_nvnodelistsize = 0; + mtx_init(&mp->mnt_mtx, "struct mount mtx", NULL, MTX_DEF); lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); (void)vfs_busy(mp, LK_NOWAIT, 0, td); mp->mnt_op = vfsp->vfc_vfsops; @@ -1371,6 +1370,7 @@ panic("unmount: dangling vnode"); lockmgr(&mp->mnt_lock, LK_RELEASE | LK_INTERLOCK, &mountlist_mtx, td); lockdestroy(&mp->mnt_lock); + mtx_destroy(&mp->mnt_mtx); if (coveredvp != NULL) vrele(coveredvp); if (mp->mnt_kern_flag & MNTK_MWAIT) @@ -1408,6 +1408,7 @@ if (vfsp == NULL) return (ENODEV); mp = malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK | M_ZERO); + mtx_init(&mp->mnt_mtx, "struct mount mtx", NULL, MTX_DEF); lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); (void)vfs_busy(mp, LK_NOWAIT, 0, td); TAILQ_INIT(&mp->mnt_nvnodelist); Index: kern/vfs_subr.c =========================================================================== --- kern/vfs_subr.c 2003/10/30 22:44:22 #153 +++ kern/vfs_subr.c 2003/10/30 22:44:22 @@ -476,7 +476,6 @@ (5 * (sizeof(struct vm_object) + sizeof(struct vnode)))); minvnodes = desiredvnodes / 4; mtx_init(&mountlist_mtx, "mountlist", NULL, MTX_DEF); - mtx_init(&mntvnode_mtx, "mntvnode", NULL, MTX_DEF); mtx_init(&mntid_mtx, "mntid", NULL, MTX_DEF); mtx_init(&spechash_mtx, "spechash", NULL, MTX_DEF); TAILQ_INIT(&vnode_free_list); @@ -710,7 +709,7 @@ trigger = cnt.v_page_count * 2 / usevnodes; done = 0; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); count = mp->mnt_nvnodelistsize / 10 + 1; while (count && (vp = TAILQ_FIRST(&mp->mnt_nvnodelist)) != NULL) { TAILQ_REMOVE(&mp->mnt_nvnodelist, vp, v_nmntvnodes); @@ -722,16 +721,16 @@ if (VMIGHTFREE(vp) && /* critical path opt */ (vp->v_object == NULL || vp->v_object->resident_page_count < trigger)) { - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); vgonel(vp, curthread); done++; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } else VI_UNLOCK(vp); } --count; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return done; } @@ -1051,24 +1050,26 @@ register struct mount *mp; { - mtx_lock(&mntvnode_mtx); /* * Delete from old mount point vnode list, if on one. */ if (vp->v_mount != NULL) { + MNT_ILOCK(vp->v_mount); KASSERT(vp->v_mount->mnt_nvnodelistsize > 0, ("bad mount point vnode list size")); TAILQ_REMOVE(&vp->v_mount->mnt_nvnodelist, vp, v_nmntvnodes); vp->v_mount->mnt_nvnodelistsize--; + MNT_IUNLOCK(vp->v_mount); } /* * Insert into list of vnodes for the new mount point, if available. */ if ((vp->v_mount = mp) != NULL) { + MNT_ILOCK(vp->v_mount); TAILQ_INSERT_TAIL(&mp->mnt_nvnodelist, vp, v_nmntvnodes); mp->mnt_nvnodelistsize++; + MNT_IUNLOCK(vp->v_mount); } - mtx_unlock(&mntvnode_mtx); } /* @@ -2368,7 +2369,7 @@ vput(rootvp); } - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp; vp = nvp) { /* @@ -2380,10 +2381,10 @@ nvp = TAILQ_NEXT(vp, v_nmntvnodes); VI_LOCK(vp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); error = vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE, td); if (error) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto loop; } /* @@ -2391,7 +2392,7 @@ */ if ((flags & SKIPSYSTEM) && (vp->v_vflag & VV_SYSTEM)) { VOP_UNLOCK(vp, 0, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } /* @@ -2407,7 +2408,7 @@ (error == 0 && vattr.va_nlink > 0)) && (vp->v_writecount == 0 || vp->v_type != VREG)) { VOP_UNLOCK(vp, LK_INTERLOCK, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } } else @@ -2421,7 +2422,7 @@ */ if (vp->v_usecount == 0) { vgonel(vp, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } @@ -2435,7 +2436,7 @@ vgonel(vp, td); else vgonechrl(vp, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } #ifdef DIAGNOSTIC @@ -2443,10 +2444,10 @@ vprint("vflush: busy vnode", vp); #endif VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); busy++; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (rootrefs > 0 && (flags & FORCECLOSE) == 0) { /* * If just the root vnode is busy, and if its refcount @@ -2481,10 +2482,10 @@ struct mount *mp; if ((mp = vp->v_mount) != NULL) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); TAILQ_REMOVE(&mp->mnt_nvnodelist, vp, v_nmntvnodes); TAILQ_INSERT_TAIL(&mp->mnt_nvnodelist, vp, v_nmntvnodes); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); } #endif } @@ -3073,7 +3074,7 @@ TAILQ_FOREACH(mp, &mountlist, mnt_list) { if (vfs_busy(mp, LK_NOWAIT, &mountlist_mtx, td)) continue; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) { if (n == len) break; @@ -3122,13 +3123,13 @@ vrele(vp); ++n; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); mtx_lock(&mountlist_mtx); vfs_unbusy(mp, td); if (n == len) break; } - mtx_unlock(&mountlist_mtx); + MNT_IUNLOCK(mp); error = SYSCTL_OUT(req, xvn, n * sizeof *xvn); free(xvn, M_TEMP); @@ -3201,7 +3202,7 @@ GIANT_REQUIRED; tries = 5; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { if (vp->v_mount != mp) { @@ -3219,13 +3220,13 @@ if ((vp->v_iflag & VI_OBJDIRTY) && (flags == MNT_WAIT || VOP_ISLOCKED(vp, NULL) == 0)) { - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (!vget(vp, LK_EXCLUSIVE | LK_RETRY | LK_INTERLOCK, curthread)) { if (vp->v_vflag & VV_NOSYNC) { /* unlinked */ vput(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } @@ -3238,7 +3239,7 @@ } vput(vp); } - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (TAILQ_NEXT(vp, v_nmntvnodes) != nvp) { if (--tries > 0) goto loop; @@ -3247,7 +3248,7 @@ } else VI_UNLOCK(vp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); } /* Index: nfsclient/nfs_subs.c =========================================================================== --- nfsclient/nfs_subs.c 2003/10/30 22:44:22 #17 +++ nfsclient/nfs_subs.c 2003/10/30 22:44:22 @@ -788,7 +788,7 @@ GIANT_REQUIRED; s = splbio(); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp; vp = nvp) { if (vp->v_mount != mp) /* Paranoia */ @@ -799,7 +799,7 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { nbp = TAILQ_NEXT(bp, b_vnbufs); if (BUF_REFCNT(bp) == 0 && @@ -808,9 +808,9 @@ bp->b_flags &= ~(B_NEEDCOMMIT | B_CLUSTEROK); } VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); splx(s); } Index: nfsclient/nfs_vfsops.c =========================================================================== --- nfsclient/nfs_vfsops.c 2003/10/30 22:44:22 #39 +++ nfsclient/nfs_vfsops.c 2003/10/30 22:44:22 @@ -931,7 +931,7 @@ /* * Force stale buffer cache information to be flushed. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; @@ -944,23 +944,23 @@ goto loop; vnp = TAILQ_NEXT(vp, v_nmntvnodes); VI_LOCK(vp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (VOP_ISLOCKED(vp, NULL) || TAILQ_EMPTY(&vp->v_dirtyblkhd) || waitfor == MNT_LAZY) { VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto loop; } error = VOP_FSYNC(vp, cred, waitfor, td); if (error) allerror = error; vput(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return (allerror); } Index: sys/mount.h =========================================================================== --- sys/mount.h 2003/10/30 22:44:22 #38 +++ sys/mount.h 2003/10/30 22:44:22 @@ -132,6 +132,7 @@ struct vnodelst mnt_nvnodelist; /* list of vnodes this mount */ struct vnodelst mnt_reservedvnlist; /* (future) dirty vnode list */ struct lock mnt_lock; /* mount structure lock */ + struct mtx mnt_mtx; /* mount structure interlock */ int mnt_writeopcount; /* write syscalls in progress */ int mnt_flag; /* flags shared with user */ struct vfsoptlist *mnt_opt; /* current mount options */ @@ -148,6 +149,11 @@ struct label mnt_fslabel; /* MAC label for the fs */ int mnt_nvnodelistsize; /* # of vnodes on this mount */ }; + + +#define MNT_ILOCK(mp) mtx_lock(&(mp)->mnt_mtx) +#define MNT_IUNLOCK(mp) mtx_unlock(&(mp)->mnt_mtx) + #endif /* _KERNEL */ /* Index: sys/vnode.h =========================================================================== --- sys/vnode.h 2003/10/30 22:44:22 #74 +++ sys/vnode.h 2003/10/30 22:44:22 @@ -464,11 +464,6 @@ */ extern struct vnodeop_desc *vnodeop_descs[]; -/* - * Interlock for scanning list of vnodes attached to a mountpoint - */ -extern struct mtx mntvnode_mtx; - #define VOPARG_OFFSETOF(s_type, field) __offsetof(s_type, field) #define VOPARG_OFFSETTO(s_type, s_offset, struct_p) \ ((s_type)(((char*)(struct_p)) + (s_offset))) Index: ufs/ffs/ffs_snapshot.c =========================================================================== --- ufs/ffs/ffs_snapshot.c 2003/10/30 22:44:22 #53 +++ ufs/ffs/ffs_snapshot.c 2003/10/30 22:44:22 @@ -405,7 +405,7 @@ snaplistsize = fs->fs_ncg + howmany(fs->fs_cssize, fs->fs_bsize) + FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */; mp->mnt_kern_flag &= ~MNTK_SUSPENDED; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: for (xvp = TAILQ_FIRST(&mp->mnt_nvnodelist); xvp; xvp = nvp) { /* @@ -416,30 +416,30 @@ goto loop; nvp = TAILQ_NEXT(xvp, v_nmntvnodes); VI_LOCK(xvp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if ((xvp->v_iflag & VI_XLOCK) || xvp->v_usecount == 0 || xvp->v_type == VNON || (VTOI(xvp)->i_flags & SF_SNAPSHOT)) { VI_UNLOCK(xvp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } if (snapdebug) vprint("ffs_snapshot: busy vnode", xvp); if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK, td) != 0) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto loop; } if (VOP_GETATTR(xvp, &vat, td->td_ucred, td) == 0 && vat.va_nlink > 0) { VOP_UNLOCK(xvp, 0, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } xp = VTOI(xvp); if (ffs_checkfreefile(copy_fs, vp, xp->i_number)) { VOP_UNLOCK(xvp, 0, td); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } /* @@ -475,9 +475,9 @@ sbp = NULL; goto out1; } - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * If there already exist snapshots on this filesystem, grab a * reference to their shared lock. If this is the first snapshot Index: ufs/ffs/ffs_vfsops.c =========================================================================== --- ufs/ffs/ffs_vfsops.c 2003/10/30 22:44:22 #64 +++ ufs/ffs/ffs_vfsops.c 2003/10/30 22:44:22 @@ -495,10 +495,10 @@ } loop: - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { if (vp->v_mount != mp) { - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); goto loop; } nvp = TAILQ_NEXT(vp, v_nmntvnodes); @@ -507,7 +507,7 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * Step 4: invalidate all inactive vnodes. */ @@ -538,9 +538,9 @@ ip->i_effnlink = ip->i_nlink; brelse(bp); vput(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return (0); } @@ -1112,7 +1112,6 @@ struct ufsmount *ump = VFSTOUFS(mp); struct fs *fs; int error, count, wait, lockreq, allerror = 0; - int restart; fs = ump->um_fs; if (fs->fs_fmod != 0 && fs->fs_ronly != 0) { /* XXX */ @@ -1129,9 +1128,8 @@ lockreq = LK_EXCLUSIVE; } lockreq |= LK_INTERLOCK; - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); loop: - restart = 0; for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { /* * If the vnode that we are about to sync is no longer @@ -1159,24 +1157,21 @@ VI_UNLOCK(vp); continue; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if ((error = vget(vp, lockreq, td)) != 0) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (error == ENOENT) goto loop; continue; } if ((error = VOP_FSYNC(vp, cred, waitfor, td)) != 0) allerror = error; - VOP_UNLOCK(vp, 0, td); - mtx_lock(&mntvnode_mtx); + vput(vp); + MNT_ILOCK(mp); if (TAILQ_NEXT(vp, v_nmntvnodes) != nvp) - restart = 1; - vrele(vp); - if (restart) goto loop; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); /* * Force stale filesystem control information to be flushed. */ @@ -1185,7 +1180,7 @@ allerror = error; /* Flushed work items may create new vnodes to clean */ if (allerror == 0 && count) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto loop; } } @@ -1201,7 +1196,7 @@ allerror = error; VOP_UNLOCK(devvp, 0, td); if (allerror == 0 && waitfor == MNT_WAIT) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto loop; } } else Index: ufs/ufs/ufs_quota.c =========================================================================== --- ufs/ufs/ufs_quota.c 2003/10/30 22:44:22 #22 +++ ufs/ufs/ufs_quota.c 2003/10/30 22:44:22 @@ -411,7 +411,6 @@ struct dquot *dq; int error, flags; struct nameidata nd; - int restart; error = suser_cred(td->td_ucred, PRISON_ROOT); if (error) @@ -456,35 +455,32 @@ * adding references to quota file being opened. * NB: only need to add dquot's for inodes being modified. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); again: - restart = 0; for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) { if (vp->v_mount != mp) goto again; nextvp = TAILQ_NEXT(vp, v_nmntvnodes); VI_LOCK(vp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto again; } if (vp->v_type == VNON || vp->v_writecount == 0) { vput(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } error = getinoquota(VTOI(vp)); - mtx_lock(&mntvnode_mtx); - if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp) - restart = 1; vput(vp); + MNT_ILOCK(mp); if (error) break; - if (restart) + if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp) goto again; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); ump->um_qflags[type] &= ~QTF_OPENING; if (error) quotaoff(td, mp, type); @@ -505,7 +501,6 @@ struct ufsmount *ump = VFSTOUFS(mp); struct dquot *dq; struct inode *ip; - int restart; int error; error = suser_cred(td->td_ucred, PRISON_ROOT); @@ -519,37 +514,34 @@ * Search vnodes associated with this mount point, * deleting any references to quota file being closed. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); again: - restart = 0; for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) { if (vp->v_mount != mp) goto again; nextvp = TAILQ_NEXT(vp, v_nmntvnodes); VI_LOCK(vp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (vp->v_type == VNON) { VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); goto again; } ip = VTOI(vp); dq = ip->i_dquot[type]; ip->i_dquot[type] = NODQUOT; dqrele(vp, dq); - mtx_lock(&mntvnode_mtx); + vput(vp); + MNT_ILOCK(mp); if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp) - restart = 1; - vput(vp); - if (restart) goto again; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); dqflush(qvp); ASSERT_VOP_LOCKED(qvp, "quotaoff"); qvp->v_vflag &= ~VV_SYSTEM; @@ -739,7 +731,6 @@ struct thread *td = curthread; /* XXX */ struct vnode *vp, *nextvp; struct dquot *dq; - int restart; int i, error; /* @@ -755,23 +746,22 @@ * Search vnodes associated with this mount point, * synchronizing any modified dquot structures. */ - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); again: - restart = 0; for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nextvp) { if (vp->v_mount != mp) goto again; nextvp = TAILQ_NEXT(vp, v_nmntvnodes); VI_LOCK(vp); - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); if (vp->v_type == VNON) { VI_UNLOCK(vp); - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); continue; } error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, td); if (error) { - mtx_lock(&mntvnode_mtx); + MNT_ILOCK(mp); if (error == ENOENT) goto again; continue; @@ -781,14 +771,12 @@ if (dq != NODQUOT && (dq->dq_flags & DQ_MOD)) dqsync(vp, dq); } + vput(vp); + MNT_ILOCK(mp); if (TAILQ_NEXT(vp, v_nmntvnodes) != nextvp) - restart = 1; - mtx_lock(&mntvnode_mtx); - vput(vp); - if (restart) goto again; } - mtx_unlock(&mntvnode_mtx); + MNT_IUNLOCK(mp); return (0); }