diff options
author | jeff <jeff@FreeBSD.org> | 2005-04-03 10:38:18 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-04-03 10:38:18 +0000 |
commit | e2abc701a549728aa912e77753c2cf0e10ca9a1a (patch) | |
tree | 1b1f4b7e5a669effe6ea74da7c3d94c328d7e596 /sys/ufs/ffs | |
parent | e0e3d6c9e0bacdabaa648ddcc3816c52f4202318 (diff) | |
download | FreeBSD-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.c | 7 |
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); |