svn commit: r207742 - head/sys/ufs/ffs

Jeff Roberson jeff at FreeBSD.org
Fri May 7 08:45:22 UTC 2010


Author: jeff
Date: Fri May  7 08:45:21 2010
New Revision: 207742
URL: http://svn.freebsd.org/changeset/base/207742

Log:
   - Call softdep_prealloc() before any of the balloc routines in the
     snapshot code.
   - Don't fsync() vnodes in prealloc if copy on write is in progress.  It
     is not safe to recurse back into the write path here.
  
  Reported by:	Vladimir Grebenschikov <vova at fbsd.ru>

Modified:
  head/sys/ufs/ffs/ffs_snapshot.c
  head/sys/ufs/ffs/ffs_softdep.c

Modified: head/sys/ufs/ffs/ffs_snapshot.c
==============================================================================
--- head/sys/ufs/ffs/ffs_snapshot.c	Fri May  7 08:20:56 2010	(r207741)
+++ head/sys/ufs/ffs/ffs_snapshot.c	Fri May  7 08:45:21 2010	(r207742)
@@ -1002,6 +1002,8 @@ expunge_ufs1(snapvp, cancelip, fs, acctf
 	if (lbn < NDADDR) {
 		blkno = VTOI(snapvp)->i_din1->di_db[lbn];
 	} else {
+		if (DOINGSOFTDEP(snapvp))
+			softdep_prealloc(snapvp, MNT_WAIT);
 		td->td_pflags |= TDP_COWINPROGRESS;
 		error = ffs_balloc_ufs1(snapvp, lblktosize(fs, (off_t)lbn),
 		   fs->fs_bsize, KERNCRED, BA_METAONLY, &bp);
@@ -1283,6 +1285,8 @@ expunge_ufs2(snapvp, cancelip, fs, acctf
 	if (lbn < NDADDR) {
 		blkno = VTOI(snapvp)->i_din2->di_db[lbn];
 	} else {
+		if (DOINGSOFTDEP(snapvp))
+			softdep_prealloc(snapvp, MNT_WAIT);
 		td->td_pflags |= TDP_COWINPROGRESS;
 		error = ffs_balloc_ufs2(snapvp, lblktosize(fs, (off_t)lbn),
 		   fs->fs_bsize, KERNCRED, BA_METAONLY, &bp);
@@ -1746,6 +1750,8 @@ retry:
 		goto retry;
 	TAILQ_FOREACH(ip, &sn->sn_head, i_nextsnap) {
 		vp = ITOV(ip);
+		if (DOINGSOFTDEP(vp))
+			softdep_prealloc(vp, MNT_WAIT);
 		/*
 		 * Lookup block being written.
 		 */
@@ -2268,6 +2274,8 @@ ffs_copyonwrite(devvp, bp)
 	}
 	TAILQ_FOREACH(ip, &sn->sn_head, i_nextsnap) {
 		vp = ITOV(ip);
+		if (DOINGSOFTDEP(vp))
+			softdep_prealloc(vp, MNT_WAIT);
 		/*
 		 * We ensure that everything of our own that needs to be
 		 * copied will be done at the time that ffs_snapshot is

Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c	Fri May  7 08:20:56 2010	(r207741)
+++ head/sys/ufs/ffs/ffs_softdep.c	Fri May  7 08:45:21 2010	(r207742)
@@ -2475,7 +2475,8 @@ softdep_prealloc(vp, waitok)
 	 * Attempt to sync this vnode once to flush any journal
 	 * work attached to it.
 	 */
-	ffs_syncvnode(vp, waitok);
+	if ((curthread->td_pflags & TDP_COWINPROGRESS) == 0)
+		ffs_syncvnode(vp, waitok);
 	ACQUIRE_LOCK(&lk);
 	process_removes(vp);
 	if (journal_space(ump, 0) == 0) {


More information about the svn-src-head mailing list