svn commit: r195186 - head/sys/ufs/ffs
Konstantin Belousov
kib at FreeBSD.org
Tue Jun 30 10:07:01 UTC 2009
Author: kib
Date: Tue Jun 30 10:07:00 2009
New Revision: 195186
URL: http://svn.freebsd.org/changeset/base/195186
Log:
Softdep_fsync() may need to lock parent directory of the synced vnode.
Use inlined (due to FFSV_FORCEINSMQ) version of vn_vget_ino() to prevent
mountpoint from being unmounted and freed while no vnodes are locked.
Tested by: pho
Approved by: re (kensmith)
MFC after: 1 month
Modified:
head/sys/ufs/ffs/ffs_softdep.c
Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c Tue Jun 30 09:51:41 2009 (r195185)
+++ head/sys/ufs/ffs/ffs_softdep.c Tue Jun 30 10:07:00 2009 (r195186)
@@ -5102,10 +5102,28 @@ softdep_fsync(vp)
FREE_LOCK(&lk);
if (ffs_vgetf(mp, parentino, LK_NOWAIT | LK_EXCLUSIVE, &pvp,
FFSV_FORCEINSMQ)) {
+ error = vfs_busy(mp, MBF_NOWAIT);
+ if (error != 0) {
+ VOP_UNLOCK(vp, 0);
+ error = vfs_busy(mp, 0);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ if (error != 0)
+ return (ENOENT);
+ if (vp->v_iflag & VI_DOOMED) {
+ vfs_unbusy(mp);
+ return (ENOENT);
+ }
+ }
VOP_UNLOCK(vp, 0);
error = ffs_vgetf(mp, parentino, LK_EXCLUSIVE,
&pvp, FFSV_FORCEINSMQ);
+ vfs_unbusy(mp);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ if (vp->v_iflag & VI_DOOMED) {
+ if (error == 0)
+ vput(pvp);
+ error = ENOENT;
+ }
if (error != 0)
return (error);
}
More information about the svn-src-all
mailing list