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); } }