Date: Fri, 7 May 2010 08:45:22 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r207742 - head/sys/ufs/ffs Message-ID: <201005070845.o478jMXO043757@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@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) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005070845.o478jMXO043757>