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