summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>2006-01-09 20:42:19 +0000
committertegge <tegge@FreeBSD.org>2006-01-09 20:42:19 +0000
commitd344c1186100b5323aefd8a08d585a95db5aa73c (patch)
tree63c09ce208013c75e9755db86cfe31120c538d27 /sys/ufs
parent4d88aab3ea1d28d6617480348f596c37389d6434 (diff)
downloadFreeBSD-src-d344c1186100b5323aefd8a08d585a95db5aa73c.zip
FreeBSD-src-d344c1186100b5323aefd8a08d585a95db5aa73c.tar.gz
Add marker vnodes to ensure that all vnodes associated with the mount point are
iterated over when using MNT_VNODE_FOREACH. Reviewed by: truckman
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c6
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c14
-rw-r--r--sys/ufs/ufs/ufs_quota.c22
3 files changed, 27 insertions, 15 deletions
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index c64a1e3..355c19f 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -203,7 +203,7 @@ ffs_snapshot(mp, snapfile)
struct nameidata nd;
struct mount *wrtmp;
struct vattr vat;
- struct vnode *vp, *xvp, *nvp, *devvp;
+ struct vnode *vp, *xvp, *mvp, *devvp;
struct uio auio;
struct iovec aiov;
struct snapdata *sn;
@@ -485,7 +485,7 @@ restart:
MNT_ILOCK(mp);
mp->mnt_kern_flag &= ~MNTK_SUSPENDED;
loop:
- MNT_VNODE_FOREACH(xvp, mp, nvp) {
+ MNT_VNODE_FOREACH(xvp, mp, mvp) {
VI_LOCK(xvp);
MNT_IUNLOCK(mp);
if ((xvp->v_iflag & VI_DOOMED) ||
@@ -506,6 +506,7 @@ loop:
}
if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK, td) != 0) {
MNT_ILOCK(mp);
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
goto loop;
}
if (snapdebug)
@@ -553,6 +554,7 @@ loop:
free(copy_fs->fs_csp, M_UFSMNT);
bawrite(sbp);
sbp = NULL;
+ MNT_VNODE_FOREACH_ABORT(mp, mvp);
goto out1;
}
MNT_ILOCK(mp);
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 04c4dba..c6c6510 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -445,7 +445,7 @@ ffs_cmount(struct mntarg *ma, void *data, int flags, struct thread *td)
static int
ffs_reload(struct mount *mp, struct thread *td)
{
- struct vnode *vp, *nvp, *devvp;
+ struct vnode *vp, *mvp, *devvp;
struct inode *ip;
void *space;
struct buf *bp;
@@ -536,7 +536,7 @@ ffs_reload(struct mount *mp, struct thread *td)
loop:
MNT_ILOCK(mp);
- MNT_VNODE_FOREACH(vp, mp, nvp) {
+ MNT_VNODE_FOREACH(vp, mp, mvp) {
VI_LOCK(vp);
if (vp->v_iflag & VI_DOOMED) {
VI_UNLOCK(vp);
@@ -547,6 +547,7 @@ loop:
* Step 4: invalidate all cached file data.
*/
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
+ MNT_VNODE_FOREACH_ABORT(mp, mvp);
goto loop;
}
if (vinvalbuf(vp, 0, td, 0, 0))
@@ -561,6 +562,7 @@ loop:
if (error) {
VOP_UNLOCK(vp, 0, td);
vrele(vp);
+ MNT_VNODE_FOREACH_ABORT(mp, mvp);
return (error);
}
ffs_load_inode(bp, ip, fs, ip->i_number);
@@ -1106,7 +1108,7 @@ ffs_sync(mp, waitfor, td)
int waitfor;
struct thread *td;
{
- struct vnode *nvp, *vp, *devvp;
+ struct vnode *mvp, *vp, *devvp;
struct inode *ip;
struct ufsmount *ump = VFSTOUFS(mp);
struct fs *fs;
@@ -1130,7 +1132,7 @@ ffs_sync(mp, waitfor, td)
lockreq |= LK_INTERLOCK | LK_SLEEPFAIL;
MNT_ILOCK(mp);
loop:
- MNT_VNODE_FOREACH(vp, mp, nvp) {
+ MNT_VNODE_FOREACH(vp, mp, mvp) {
/*
* Depend on the mntvnode_slock to keep things stable enough
* for a quick test. Since there might be hundreds of
@@ -1152,8 +1154,10 @@ loop:
MNT_IUNLOCK(mp);
if ((error = vget(vp, lockreq, td)) != 0) {
MNT_ILOCK(mp);
- if (error == ENOENT || error == ENOLCK)
+ if (error == ENOENT || error == ENOLCK) {
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
goto loop;
+ }
continue;
}
if ((error = ffs_syncvnode(vp, waitfor)) != 0)
diff --git a/sys/ufs/ufs/ufs_quota.c b/sys/ufs/ufs/ufs_quota.c
index 2ba8d1a..f66c2eb 100644
--- a/sys/ufs/ufs/ufs_quota.c
+++ b/sys/ufs/ufs/ufs_quota.c
@@ -403,7 +403,7 @@ quotaon(td, mp, type, fname)
{
struct ufsmount *ump = VFSTOUFS(mp);
struct vnode *vp, **vpp;
- struct vnode *nvp;
+ struct vnode *mvp;
struct dquot *dq;
int error, flags;
struct nameidata nd;
@@ -453,11 +453,12 @@ quotaon(td, mp, type, fname)
*/
MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, nvp) {
+ MNT_VNODE_FOREACH(vp, mp, mvp) {
VI_LOCK(vp);
MNT_IUNLOCK(mp);
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
MNT_ILOCK(mp);
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
goto again;
}
if (vp->v_type == VNON || vp->v_writecount == 0) {
@@ -470,8 +471,10 @@ again:
VOP_UNLOCK(vp, 0, td);
vrele(vp);
MNT_ILOCK(mp);
- if (error)
+ if (error) {
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
break;
+ }
}
MNT_IUNLOCK(mp);
ump->um_qflags[type] &= ~QTF_OPENING;
@@ -490,7 +493,7 @@ quotaoff(td, mp, type)
int type;
{
struct vnode *vp;
- struct vnode *qvp, *nvp;
+ struct vnode *qvp, *mvp;
struct ufsmount *ump = VFSTOUFS(mp);
struct dquot *dq;
struct inode *ip;
@@ -509,7 +512,7 @@ quotaoff(td, mp, type)
*/
MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, nvp) {
+ MNT_VNODE_FOREACH(vp, mp, mvp) {
VI_LOCK(vp);
MNT_IUNLOCK(mp);
if (vp->v_type == VNON) {
@@ -519,6 +522,7 @@ again:
}
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
MNT_ILOCK(mp);
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
goto again;
}
ip = VTOI(vp);
@@ -717,7 +721,7 @@ qsync(mp)
{
struct ufsmount *ump = VFSTOUFS(mp);
struct thread *td = curthread; /* XXX */
- struct vnode *vp, *nvp;
+ struct vnode *vp, *mvp;
struct dquot *dq;
int i, error;
@@ -736,7 +740,7 @@ qsync(mp)
*/
MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, nvp) {
+ MNT_VNODE_FOREACH(vp, mp, mvp) {
VI_LOCK(vp);
MNT_IUNLOCK(mp);
if (vp->v_type == VNON) {
@@ -747,8 +751,10 @@ again:
error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, td);
if (error) {
MNT_ILOCK(mp);
- if (error == ENOENT)
+ if (error == ENOENT) {
+ MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
goto again;
+ }
continue;
}
for (i = 0; i < MAXQUOTAS; i++) {
OpenPOWER on IntegriCloud