Module Name:    src
Committed By:   hannken
Date:           Mon Mar 17 09:27:37 UTC 2014

Modified Files:
        src/sys/kern: vfs_vnode.c

Log Message:
Add fstrans_startnowait()/fstrans_done() to vrele_thread().


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/kern/vfs_vnode.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/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.33 src/sys/kern/vfs_vnode.c:1.34
--- src/sys/kern/vfs_vnode.c:1.33	Wed Mar  5 09:37:29 2014
+++ src/sys/kern/vfs_vnode.c	Mon Mar 17 09:27:37 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnode.c,v 1.33 2014/03/05 09:37:29 hannken Exp $	*/
+/*	$NetBSD: vfs_vnode.c,v 1.34 2014/03/17 09:27:37 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -116,7 +116,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.33 2014/03/05 09:37:29 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.34 2014/03/17 09:27:37 hannken Exp $");
 
 #define _VFS_VNODE_PRIVATE
 
@@ -820,17 +820,27 @@ vrele_async(vnode_t *vp)
 static void
 vrele_thread(void *cookie)
 {
+	vnodelst_t skip_list;
 	vnode_t *vp;
+	struct mount *mp;
+
+	TAILQ_INIT(&skip_list);
 
+	mutex_enter(&vrele_lock);
 	for (;;) {
-		mutex_enter(&vrele_lock);
 		while (TAILQ_EMPTY(&vrele_list)) {
 			vrele_gen++;
 			cv_broadcast(&vrele_cv);
 			cv_timedwait(&vrele_cv, &vrele_lock, hz);
+			TAILQ_CONCAT(&vrele_list, &skip_list, v_freelist);
 		}
 		vp = TAILQ_FIRST(&vrele_list);
+		mp = vp->v_mount;
 		TAILQ_REMOVE(&vrele_list, vp, v_freelist);
+		if (fstrans_start_nowait(mp, FSTRANS_LAZY) != 0) {
+			TAILQ_INSERT_TAIL(&skip_list, vp, v_freelist);
+			continue;
+		}
 		vrele_pending--;
 		mutex_exit(&vrele_lock);
 
@@ -840,6 +850,8 @@ vrele_thread(void *cookie)
 		 */
 		mutex_enter(vp->v_interlock);
 		vrelel(vp, 0);
+		fstrans_done(mp);
+		mutex_enter(&vrele_lock);
 	}
 }
 

Reply via email to