Module Name:    src
Committed By:   hannken
Date:           Mon Dec 27 18:49:42 UTC 2010

Modified Files:
        src/sys/fs/msdosfs: msdosfs_vfsops.c
        src/sys/miscfs/genfs: genfs_vnops.c
        src/sys/ufs/ffs: ffs_vfsops.c

Log Message:
Extend the range of fstrans transactions to a sequence of vnode operations
on a locked vnode.  This leaves a suspended file system and therefore a
snapshot with either all or no operations of such a sequence done.


To generate a diff of this commit:
cvs rdiff -u -r1.88 -r1.89 src/sys/fs/msdosfs/msdosfs_vfsops.c
cvs rdiff -u -r1.185 -r1.186 src/sys/miscfs/genfs/genfs_vnops.c
cvs rdiff -u -r1.262 -r1.263 src/sys/ufs/ffs/ffs_vfsops.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/fs/msdosfs/msdosfs_vfsops.c
diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.88 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.89
--- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.88	Tue Dec 14 17:17:02 2010
+++ src/sys/fs/msdosfs/msdosfs_vfsops.c	Mon Dec 27 18:49:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: msdosfs_vfsops.c,v 1.88 2010/12/14 17:17:02 hannken Exp $	*/
+/*	$NetBSD: msdosfs_vfsops.c,v 1.89 2010/12/27 18:49:42 hannken Exp $	*/
 
 /*-
  * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.88 2010/12/14 17:17:02 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.89 2010/12/27 18:49:42 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -938,8 +938,7 @@
 	struct vnode *vp, *mvp;
 	struct denode *dep;
 	struct msdosfsmount *pmp = VFSTOMSDOSFS(mp);
-	int lk_flags, error, allerror = 0;
-	bool is_suspending;
+	int error, allerror = 0;
 
 	/*
 	 * If we ever switch to not updating all of the fats all the time,
@@ -956,15 +955,6 @@
 	if ((mvp = vnalloc(mp)) == NULL)
 		return ENOMEM;
 	fstrans_start(mp, FSTRANS_SHARED);
-	is_suspending = (fstrans_getstate(mp) == FSTRANS_SUSPENDING);
-	/*
-	 * We can't lock vnodes while the file system is suspending because
-	 * threads waiting on fstrans may have locked vnodes.
-	 */
-	if (is_suspending)
-		lk_flags = 0;
-	else
-		lk_flags = LK_EXCLUSIVE | LK_NOWAIT;
 	/*
 	 * Write back each (modified) denode.
 	 */
@@ -985,7 +975,7 @@
 			continue;
 		}
 		mutex_exit(&mntvnode_lock);
-		error = vget(vp, lk_flags);
+		error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT);
 		if (error) {
 			mutex_enter(&mntvnode_lock);
 			if (error == ENOENT) {
@@ -997,10 +987,7 @@
 		if ((error = VOP_FSYNC(vp, cred,
 		    waitfor == MNT_WAIT ? FSYNC_WAIT : 0, 0, 0)) != 0)
 			allerror = error;
-		if (is_suspending)
-			vrele(vp);
-		else
-			vput(vp);
+		vput(vp);
 		mutex_enter(&mntvnode_lock);
 	}
 	mutex_exit(&mntvnode_lock);

Index: src/sys/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.185 src/sys/miscfs/genfs/genfs_vnops.c:1.186
--- src/sys/miscfs/genfs/genfs_vnops.c:1.185	Tue Nov 30 10:43:05 2010
+++ src/sys/miscfs/genfs/genfs_vnops.c	Mon Dec 27 18:49:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_vnops.c,v 1.185 2010/11/30 10:43:05 dholland Exp $	*/
+/*	$NetBSD: genfs_vnops.c,v 1.186 2010/12/27 18:49:42 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,13 +57,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.185 2010/11/30 10:43:05 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.186 2010/12/27 18:49:42 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
 #include <sys/kernel.h>
 #include <sys/mount.h>
+#include <sys/fstrans.h>
 #include <sys/namei.h>
 #include <sys/vnode.h>
 #include <sys/fcntl.h>
@@ -293,10 +294,17 @@
 	KASSERT((flags & ~(LK_EXCLUSIVE | LK_SHARED | LK_NOWAIT)) == 0);
 
 	op = ((flags & LK_EXCLUSIVE) != 0 ? RW_WRITER : RW_READER);
+	if ((flags & LK_NOWAIT) != 0) {
+		if (fstrans_start_nowait(vp->v_mount, FSTRANS_SHARED))
+			return EBUSY;
+		if (! rw_tryenter(&vp->v_lock, op)) {
+			fstrans_done(vp->v_mount);
+			return EBUSY;
+		}
+		return 0;
+	}
 
-	if ((flags & LK_NOWAIT) != 0)
-		return (rw_tryenter(&vp->v_lock, op) ? 0 : EBUSY);
-
+	fstrans_start(vp->v_mount, FSTRANS_SHARED);
 	rw_enter(&vp->v_lock, op);
 
 	return 0;
@@ -314,6 +322,7 @@
 	struct vnode *vp = ap->a_vp;
 
 	rw_exit(&vp->v_lock);
+	fstrans_done(vp->v_mount);
 
 	return 0;
 }

Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.262 src/sys/ufs/ffs/ffs_vfsops.c:1.263
--- src/sys/ufs/ffs/ffs_vfsops.c:1.262	Mon Aug  9 17:12:18 2010
+++ src/sys/ufs/ffs/ffs_vfsops.c	Mon Dec 27 18:49:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vfsops.c,v 1.262 2010/08/09 17:12:18 pooka Exp $	*/
+/*	$NetBSD: ffs_vfsops.c,v 1.263 2010/12/27 18:49:42 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.262 2010/08/09 17:12:18 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.263 2010/12/27 18:49:42 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -1547,7 +1547,7 @@
 	struct inode *ip;
 	struct ufsmount *ump = VFSTOUFS(mp);
 	struct fs *fs;
-	int lk_flags, error, allerror = 0;
+	int error, allerror = 0;
 	bool is_suspending;
 
 	fs = ump->um_fs;
@@ -1563,14 +1563,6 @@
 	fstrans_start(mp, FSTRANS_SHARED);
 	is_suspending = (fstrans_getstate(mp) == FSTRANS_SUSPENDING);
 	/*
-	 * We can't lock vnodes while the file system is suspending because
-	 * threads waiting on fstrans may have locked vnodes.
-	 */
-	if (is_suspending)
-		lk_flags = 0;
-	else
-		lk_flags = LK_EXCLUSIVE | LK_NOWAIT;
-	/*
 	 * Write back each (modified) inode.
 	 */
 	mutex_enter(&mntvnode_lock);
@@ -1632,7 +1624,7 @@
 		}
 		vmark(mvp, vp);
 		mutex_exit(&mntvnode_lock);
-		error = vget(vp, lk_flags);
+		error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT);
 		if (error) {
 			mutex_enter(&mntvnode_lock);
 			nvp = vunmark(mvp);
@@ -1654,10 +1646,7 @@
 		}
 		if (error)
 			allerror = error;
-		if (is_suspending)
-			vrele(vp);
-		else
-			vput(vp);
+		vput(vp);
 		mutex_enter(&mntvnode_lock);
 		nvp = vunmark(mvp);
 	}

Reply via email to