Module Name: src
Committed By: hannken
Date: Mon Apr 18 07:36:14 UTC 2011
Modified Files:
src/sys/ufs/ffs: ffs_snapshot.c
Log Message:
Preallocate all cylinder group blocks so we no longer redo ~50% of
the cylinder groups while the file system is suspended.
This was removed in error with Rev 1.16.
>From Manuel Bouyer <[email protected]> via tech-kern.
To generate a diff of this commit:
cvs rdiff -u -r1.111 -r1.112 src/sys/ufs/ffs/ffs_snapshot.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/ufs/ffs/ffs_snapshot.c
diff -u src/sys/ufs/ffs/ffs_snapshot.c:1.111 src/sys/ufs/ffs/ffs_snapshot.c:1.112
--- src/sys/ufs/ffs/ffs_snapshot.c:1.111 Sun Mar 6 17:08:38 2011
+++ src/sys/ufs/ffs/ffs_snapshot.c Mon Apr 18 07:36:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_snapshot.c,v 1.111 2011/03/06 17:08:38 bouyer Exp $ */
+/* $NetBSD: ffs_snapshot.c,v 1.112 2011/04/18 07:36:13 hannken Exp $ */
/*
* Copyright 2000 Marshall Kirk McKusick. All Rights Reserved.
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.111 2011/03/06 17:08:38 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.112 2011/04/18 07:36:13 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -405,7 +405,7 @@
static int
snapshot_setup(struct mount *mp, struct vnode *vp)
{
- int error, n, len, loc;
+ int error, n, len, loc, cg;
daddr_t blkno, numblks;
struct buf *ibp, *nbp;
struct fs *fs = VFSTOUFS(mp)->um_fs;
@@ -501,6 +501,28 @@
if (error)
goto out;
bawrite(nbp);
+ if (wbreak > 0 && (++n % wbreak) == 0) {
+ UFS_WAPBL_END(mp);
+ error = UFS_WAPBL_BEGIN(mp);
+ if (error)
+ return error;
+ }
+ }
+ /*
+ * Allocate all cylinder group blocks.
+ */
+ for (cg = 0; cg < fs->fs_ncg; cg++) {
+ error = ffs_balloc(vp, lfragtosize(fs, cgtod(fs, cg)),
+ fs->fs_bsize, l->l_cred, 0, &nbp);
+ if (error)
+ goto out;
+ bawrite(nbp);
+ if (wbreak > 0 && (++n % wbreak) == 0) {
+ UFS_WAPBL_END(mp);
+ error = UFS_WAPBL_BEGIN(mp);
+ if (error)
+ return error;
+ }
}
out: