Module Name:    src
Committed By:   hannken
Date:           Mon Mar 17 09:29:55 UTC 2014

Modified Files:
        src/sys/ufs/ffs: ffs_vfsops.c

Log Message:
Change ffs_sync() to use vfs_vnode_iterator.


To generate a diff of this commit:
cvs rdiff -u -r1.293 -r1.294 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/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.293 src/sys/ufs/ffs/ffs_vfsops.c:1.294
--- src/sys/ufs/ffs/ffs_vfsops.c:1.293	Wed Mar  5 09:37:29 2014
+++ src/sys/ufs/ffs/ffs_vfsops.c	Mon Mar 17 09:29:55 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vfsops.c,v 1.293 2014/03/05 09:37:29 hannken Exp $	*/
+/*	$NetBSD: ffs_vfsops.c,v 1.294 2014/03/17 09:29:55 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.293 2014/03/05 09:37:29 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.294 2014/03/17 09:29:55 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -1603,10 +1603,11 @@ ffs_statvfs(struct mount *mp, struct sta
 int
 ffs_sync(struct mount *mp, int waitfor, kauth_cred_t cred)
 {
-	struct vnode *vp, *mvp, *nvp;
+	struct vnode *vp;
 	struct inode *ip;
 	struct ufsmount *ump = VFSTOUFS(mp);
 	struct fs *fs;
+	struct vnode_iterator *marker;
 	int error, allerror = 0;
 	bool is_suspending;
 
@@ -1616,42 +1617,24 @@ ffs_sync(struct mount *mp, int waitfor, 
 		panic("update: rofs mod");
 	}
 
-	/* Allocate a marker vnode. */
-	mvp = vnalloc(mp);
-
 	fstrans_start(mp, FSTRANS_SHARED);
 	is_suspending = (fstrans_getstate(mp) == FSTRANS_SUSPENDING);
 	/*
 	 * Write back each (modified) inode.
 	 */
-	mutex_enter(&mntvnode_lock);
-loop:
-	/*
-	 * NOTE: not using the TAILQ_FOREACH here since in this loop vgone()
-	 * and vclean() can be called indirectly
-	 */
-	for (vp = TAILQ_FIRST(&mp->mnt_vnodelist); vp; vp = nvp) {
-		nvp = TAILQ_NEXT(vp, v_mntvnodes);
-		/*
-		 * If the vnode that we are about to sync is no longer
-		 * associated with this mount point, start over.
-		 */
-		if (vp->v_mount != mp)
-			goto loop;
-		/*
-		 * Don't interfere with concurrent scans of this FS.
-		 */
-		if (vismarker(vp))
+	vfs_vnode_iterator_init(mp, &marker);
+	while (vfs_vnode_iterator_next(marker, &vp)) {
+		error = vn_lock(vp, LK_EXCLUSIVE);
+		if (error) {
+			vrele(vp);
 			continue;
-		mutex_enter(vp->v_interlock);
+		}
 		ip = VTOI(vp);
-
 		/*
 		 * Skip the vnode/inode if inaccessible.
 		 */
-		if (ip == NULL || (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) != 0 ||
-		    vp->v_type == VNON) {
-			mutex_exit(vp->v_interlock);
+		if (ip == NULL || vp->v_type == VNON) {
+			vput(vp);
 			continue;
 		}
 
@@ -1674,22 +1657,11 @@ loop:
 		    IN_MODIFY | IN_MODIFIED | IN_ACCESSED)) == 0 &&
 		    (waitfor == MNT_LAZY || (LIST_EMPTY(&vp->v_dirtyblkhd) &&
 		    UVM_OBJ_IS_CLEAN(&vp->v_uobj)))) {
-			mutex_exit(vp->v_interlock);
+			vput(vp);
 			continue;
 		}
 		if (vp->v_type == VBLK && is_suspending) {
-			mutex_exit(vp->v_interlock);
-			continue;
-		}
-		vmark(mvp, vp);
-		mutex_exit(&mntvnode_lock);
-		error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT);
-		if (error) {
-			mutex_enter(&mntvnode_lock);
-			nvp = vunmark(mvp);
-			if (error == ENOENT) {
-				goto loop;
-			}
+			vput(vp);
 			continue;
 		}
 		if (waitfor == MNT_LAZY) {
@@ -1706,10 +1678,9 @@ loop:
 		if (error)
 			allerror = error;
 		vput(vp);
-		mutex_enter(&mntvnode_lock);
-		nvp = vunmark(mvp);
 	}
-	mutex_exit(&mntvnode_lock);
+	vfs_vnode_iterator_destroy(marker);
+
 	/*
 	 * Force stale file system control information to be flushed.
 	 */
@@ -1721,10 +1692,6 @@ loop:
 		    0, 0)) != 0)
 			allerror = error;
 		VOP_UNLOCK(ump->um_devvp);
-		if (allerror == 0 && waitfor == MNT_WAIT && !mp->mnt_wapbl) {
-			mutex_enter(&mntvnode_lock);
-			goto loop;
-		}
 	}
 #if defined(QUOTA) || defined(QUOTA2)
 	qsync(mp);
@@ -1754,7 +1721,6 @@ loop:
 #endif
 
 	fstrans_done(mp);
-	vnfree(mvp);
 	return (allerror);
 }
 

Reply via email to