summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-04-03 10:38:18 +0000
committerjeff <jeff@FreeBSD.org>2005-04-03 10:38:18 +0000
commite2abc701a549728aa912e77753c2cf0e10ca9a1a (patch)
tree1b1f4b7e5a669effe6ea74da7c3d94c328d7e596 /sys/ufs/ffs
parente0e3d6c9e0bacdabaa648ddcc3816c52f4202318 (diff)
downloadFreeBSD-src-e2abc701a549728aa912e77753c2cf0e10ca9a1a.zip
FreeBSD-src-e2abc701a549728aa912e77753c2cf0e10ca9a1a.tar.gz
- In ffs_sync we need to pass LK_SLEEPFAIL in when we lock the vnode
because it may change identities while we're sleeping on the lock. Otherwise we may bail out of ffs_sync() early due to an error from deadfs. - Collapse a VOP_UNLOCK, vrele into a single vput().
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 529a59e..dee50b0 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1083,7 +1083,7 @@ ffs_sync(mp, waitfor, td)
wait = 1;
lockreq = LK_EXCLUSIVE;
}
- lockreq |= LK_INTERLOCK;
+ lockreq |= LK_INTERLOCK | LK_SLEEPFAIL;
MNT_ILOCK(mp);
loop:
MNT_VNODE_FOREACH(vp, mp, nvp) {
@@ -1108,14 +1108,13 @@ loop:
MNT_IUNLOCK(mp);
if ((error = vget(vp, lockreq, td)) != 0) {
MNT_ILOCK(mp);
- if (error == ENOENT)
+ if (error == ENOENT || error == ENOLCK)
goto loop;
continue;
}
if ((error = ffs_syncvnode(vp, waitfor)) != 0)
allerror = error;
- VOP_UNLOCK(vp, 0, td);
- vrele(vp);
+ vput(vp);
MNT_ILOCK(mp);
}
MNT_IUNLOCK(mp);
OpenPOWER on IntegriCloud