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 <v...@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) {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to