Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/ufs/ffs Before expunging all snapshots take the snapshot...
details: https://anonhg.NetBSD.org/src/rev/9920a2faf187
branches: trunk
changeset: 764625:9920a2faf187
user: hannken <hannken%NetBSD.org@localhost>
date: Fri Apr 29 09:45:15 2011 +0000
description:
Before expunging all snapshots take the snapshot lock and resume the file
system as this is sufficient for the remaining operations.
Reduces the time the file system is suspended and should make this time
independent of the number of snapshots already present.
diffstat:
sys/ufs/ffs/ffs_snapshot.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diffs (74 lines):
diff -r 747bfd836c27 -r 9920a2faf187 sys/ufs/ffs/ffs_snapshot.c
--- a/sys/ufs/ffs/ffs_snapshot.c Fri Apr 29 09:43:28 2011 +0000
+++ b/sys/ufs/ffs/ffs_snapshot.c Fri Apr 29 09:45:15 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_snapshot.c,v 1.113 2011/04/23 08:23:52 hannken Exp $ */
+/* $NetBSD: ffs_snapshot.c,v 1.114 2011/04/29 09:45:15 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.113 2011/04/23 08:23:52 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.114 2011/04/29 09:45:15 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -177,7 +177,7 @@
return EOPNOTSUPP;
}
#else /* defined(FFS_NO_SNAPSHOT) */
- bool suspended = false;
+ bool suspended = false, snapshot_locked = false;
int error, redo = 0, snaploc;
void *sbbuf = NULL;
daddr_t *snaplist = NULL, snaplistsize = 0;
@@ -310,6 +310,24 @@
DIP_ASSIGN(ip, mtimensec, ts.tv_nsec);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
/*
+ * Lock the snapshot and resume file system.
+ */
+ mutex_enter(&si->si_snaplock);
+ mutex_enter(&si->si_lock);
+ si->si_owner = curlwp;
+ mutex_exit(&si->si_lock);
+ snapshot_locked = true;
+ KASSERT(suspended);
+ vfs_resume(vp->v_mount);
+ suspended = false;
+#ifdef DEBUG
+ getmicrotime(&endtime);
+ timersub(&endtime, &starttime, &endtime);
+ printf("%s: suspended %lld.%03d sec, redo %d of %d\n",
+ mp->mnt_stat.f_mntonname, (long long)endtime.tv_sec,
+ endtime.tv_usec / 1000, redo, fs->fs_ncg);
+#endif
+ /*
* Copy allocation information from all snapshots and then
* expunge them from our view.
*/
@@ -381,15 +399,13 @@
si->si_gen++;
mutex_exit(&si->si_lock);
- if (suspended) {
+ if (suspended)
vfs_resume(vp->v_mount);
-#ifdef DEBUG
- getmicrotime(&endtime);
- timersub(&endtime, &starttime, &endtime);
- printf("%s: suspended %lld.%03d sec, redo %d of %d\n",
- mp->mnt_stat.f_mntonname, (long long)endtime.tv_sec,
- endtime.tv_usec / 1000, redo, fs->fs_ncg);
-#endif
+ if (snapshot_locked) {
+ mutex_enter(&si->si_lock);
+ si->si_owner = NULL;
+ mutex_exit(&si->si_lock);
+ mutex_exit(&si->si_snaplock);
}
if (error) {
if (!UFS_WAPBL_BEGIN(mp)) {
Home |
Main Index |
Thread Index |
Old Index