Module Name: src Committed By: hannken Date: Sun May 8 18:37:15 UTC 2011
Modified Files: src/sys/ufs/ffs: ffs_snapshot.c Log Message: Revert previous commit. Locking the snapshot vnode while the file system is suspended extends the suspension until the vnode gets unlocked by the caller of ffs_snapshot(). Resuming the file system before expunging all snapshots and syncing the snapshot creates races and deadlocks with journaling file systems at least. To generate a diff of this commit: cvs rdiff -u -r1.114 -r1.115 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.114 src/sys/ufs/ffs/ffs_snapshot.c:1.115 --- src/sys/ufs/ffs/ffs_snapshot.c:1.114 Fri Apr 29 09:45:15 2011 +++ src/sys/ufs/ffs/ffs_snapshot.c Sun May 8 18:37:15 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_snapshot.c,v 1.114 2011/04/29 09:45:15 hannken Exp $ */ +/* $NetBSD: ffs_snapshot.c,v 1.115 2011/05/08 18:37: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.114 2011/04/29 09:45:15 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.115 2011/05/08 18:37: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, snapshot_locked = false; + bool suspended = false; int error, redo = 0, snaploc; void *sbbuf = NULL; daddr_t *snaplist = NULL, snaplistsize = 0; @@ -310,24 +310,6 @@ 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. */ @@ -399,13 +381,17 @@ si->si_gen++; mutex_exit(&si->si_lock); - if (suspended) + if (suspended) { + VOP_UNLOCK(vp); vfs_resume(vp->v_mount); - if (snapshot_locked) { - mutex_enter(&si->si_lock); - si->si_owner = NULL; - mutex_exit(&si->si_lock); - mutex_exit(&si->si_snaplock); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); +#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 (error) { if (!UFS_WAPBL_BEGIN(mp)) {