Module Name:    src
Committed By:   hannken
Date:           Thu Feb 27 13:00:06 UTC 2014

Modified Files:
        src/sys/conf: files
        src/sys/kern: vfs_mount.c vfs_subr.c vfs_vnode.c
        src/sys/miscfs/deadfs: dead_vnops.c
        src/sys/rump/librump/rumpvfs: Makefile.rumpvfs
        src/sys/sys: mount.h
Added Files:
        src/sys/miscfs/deadfs: dead_vfsops.c

Log Message:
Currently dead vnodes still reside on the vnodelist of the file system
they have been removed from.

Create a "dead mount" that takes dead vnodes until they get freed.

Discussed on tech-kern.


To generate a diff of this commit:
cvs rdiff -u -r1.1083 -r1.1084 src/sys/conf/files
cvs rdiff -u -r1.25 -r1.26 src/sys/kern/vfs_mount.c
cvs rdiff -u -r1.441 -r1.442 src/sys/kern/vfs_subr.c
cvs rdiff -u -r1.30 -r1.31 src/sys/kern/vfs_vnode.c
cvs rdiff -u -r0 -r1.1 src/sys/miscfs/deadfs/dead_vfsops.c
cvs rdiff -u -r1.54 -r1.55 src/sys/miscfs/deadfs/dead_vnops.c
cvs rdiff -u -r1.39 -r1.40 src/sys/rump/librump/rumpvfs/Makefile.rumpvfs
cvs rdiff -u -r1.210 -r1.211 src/sys/sys/mount.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/conf/files
diff -u src/sys/conf/files:1.1083 src/sys/conf/files:1.1084
--- src/sys/conf/files:1.1083	Fri Feb 21 07:32:43 2014
+++ src/sys/conf/files	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1083 2014/02/21 07:32:43 matt Exp $
+#	$NetBSD: files,v 1.1084 2014/02/27 13:00:06 hannken Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20100430
@@ -1649,6 +1649,7 @@ file	kern/vfs_vnops.c
 file	kern/vfs_wapbl.c		wapbl
 file	kern/vfs_xattr.c
 file	kern/vnode_if.c
+file	miscfs/deadfs/dead_vfsops.c
 file	miscfs/deadfs/dead_vnops.c
 file	miscfs/fifofs/fifo_vnops.c
 file	miscfs/genfs/genfs_io.c

Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.25 src/sys/kern/vfs_mount.c:1.26
--- src/sys/kern/vfs_mount.c:1.25	Wed Nov 27 17:25:46 2013
+++ src/sys/kern/vfs_mount.c	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_mount.c,v 1.25 2013/11/27 17:25:46 christos Exp $	*/
+/*	$NetBSD: vfs_mount.c,v 1.26 2014/02/27 13:00:06 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.25 2013/11/27 17:25:46 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.26 2014/02/27 13:00:06 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -525,31 +525,6 @@ vflush(struct mount *mp, vnode_t *skipvp
 }
 
 /*
- * Remove clean vnodes from a mountpoint's vnode list.
- */
-void
-vfs_scrubvnlist(struct mount *mp)
-{
-	vnode_t *vp, *nvp;
-
-retry:
-	mutex_enter(&mntvnode_lock);
-	TAILQ_FOREACH_SAFE(vp, &mp->mnt_vnodelist, v_mntvnodes, nvp) {
-		mutex_enter(vp->v_interlock);
-		if ((vp->v_iflag & VI_CLEAN) != 0) {
-			TAILQ_REMOVE(&mp->mnt_vnodelist, vp, v_mntvnodes);
-			vp->v_mount = NULL;
-			mutex_exit(&mntvnode_lock);
-			mutex_exit(vp->v_interlock);
-			vfs_destroy(mp);
-			goto retry;
-		}
-		mutex_exit(vp->v_interlock);
-	}
-	mutex_exit(&mntvnode_lock);
-}
-
-/*
  * Mount a file system.
  */
 
@@ -829,7 +804,6 @@ dounmount(struct mount *mp, int flags, s
 	if ((mp->mnt_flag & MNT_RDONLY) == 0) {
 		error = VFS_SYNC(mp, MNT_WAIT, l->l_cred);
 	}
-	vfs_scrubvnlist(mp);
 	if (error == 0 || (flags & MNT_FORCE)) {
 		error = VFS_UNMOUNT(mp, flags);
 	}
@@ -845,7 +819,6 @@ dounmount(struct mount *mp, int flags, s
 		return (error);
 	}
 	mutex_exit(&mp->mnt_updating);
-	vfs_scrubvnlist(mp);
 
 	/*
 	 * release mnt_umounting lock here, because other code calls

Index: src/sys/kern/vfs_subr.c
diff -u src/sys/kern/vfs_subr.c:1.441 src/sys/kern/vfs_subr.c:1.442
--- src/sys/kern/vfs_subr.c:1.441	Wed Nov 27 17:24:44 2013
+++ src/sys/kern/vfs_subr.c	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_subr.c,v 1.441 2013/11/27 17:24:44 christos Exp $	*/
+/*	$NetBSD: vfs_subr.c,v 1.442 2014/02/27 13:00:06 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.441 2013/11/27 17:24:44 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.442 2014/02/27 13:00:06 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -131,8 +131,8 @@ vntblinit(void)
 {
 
 	vn_initialize_syncerd();
-	vfs_vnode_sysinit();
 	vfs_mount_sysinit();
+	vfs_vnode_sysinit();
 }
 
 /*

Index: src/sys/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.30 src/sys/kern/vfs_vnode.c:1.31
--- src/sys/kern/vfs_vnode.c:1.30	Sat Dec  7 10:03:28 2013
+++ src/sys/kern/vfs_vnode.c	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnode.c,v 1.30 2013/12/07 10:03:28 hannken Exp $	*/
+/*	$NetBSD: vfs_vnode.c,v 1.31 2014/02/27 13:00:06 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.30 2013/12/07 10:03:28 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.31 2014/02/27 13:00:06 hannken Exp $");
 
 #define _VFS_VNODE_PRIVATE
 
@@ -150,6 +150,7 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,
 u_int			numvnodes		__cacheline_aligned;
 
 static pool_cache_t	vnode_cache		__read_mostly;
+static struct mount	*dead_mount;
 
 /*
  * There are two free lists: one is for vnodes which have no buffer/page
@@ -178,6 +179,7 @@ static void		vnpanic(vnode_t *, const ch
 
 /* Routines having to do with the management of the vnode table. */
 extern int		(**dead_vnodeop_p)(void *);
+extern struct vfsops	dead_vfsops;
 
 void
 vfs_vnode_sysinit(void)
@@ -188,6 +190,10 @@ vfs_vnode_sysinit(void)
 	    NULL, IPL_NONE, NULL, NULL, NULL);
 	KASSERT(vnode_cache != NULL);
 
+	dead_mount = vfs_mountalloc(&dead_vfsops, NULL);
+	KASSERT(dead_mount != NULL);
+	dead_mount->mnt_iflag = IMNT_MPSAFE;
+
 	mutex_init(&vnode_free_list_lock, MUTEX_DEFAULT, IPL_NONE);
 	TAILQ_INIT(&vnode_free_list);
 	TAILQ_INIT(&vnode_hold_list);
@@ -999,12 +1005,10 @@ vclean(vnode_t *vp)
 	/* Purge name cache. */
 	cache_purge(vp);
 
-	/*
-	 * The vnode isn't clean, but still resides on the mount list.  Remove
-	 * it. XXX This is a bit dodgy.
-	 */
-	if (! doclose)
-		vfs_insmntque(vp, NULL);
+	/* Move to dead mount. */
+	vp->v_vflag &= ~VV_ROOT;
+	atomic_inc_uint(&dead_mount->mnt_refcnt);
+	vfs_insmntque(vp, dead_mount);
 
 	/* Done with purge, notify sleepers of the grim news. */
 	mutex_enter(vp->v_interlock);

Index: src/sys/miscfs/deadfs/dead_vnops.c
diff -u src/sys/miscfs/deadfs/dead_vnops.c:1.54 src/sys/miscfs/deadfs/dead_vnops.c:1.55
--- src/sys/miscfs/deadfs/dead_vnops.c:1.54	Fri Feb  7 15:29:22 2014
+++ src/sys/miscfs/deadfs/dead_vnops.c	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dead_vnops.c,v 1.54 2014/02/07 15:29:22 hannken Exp $	*/
+/*	$NetBSD: dead_vnops.c,v 1.55 2014/02/27 13:00:06 hannken Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.54 2014/02/07 15:29:22 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.55 2014/02/27 13:00:06 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -146,7 +146,7 @@ dead_lookup(void *v)
 
 	*(ap->a_vpp) = NULL;
 
-	return EIO;
+	return ENOENT;
 }
 
 /* ARGSUSED */

Index: src/sys/rump/librump/rumpvfs/Makefile.rumpvfs
diff -u src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.39 src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.40
--- src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.39	Mon Dec  9 20:44:00 2013
+++ src/sys/rump/librump/rumpvfs/Makefile.rumpvfs	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rumpvfs,v 1.39 2013/12/09 20:44:00 pooka Exp $
+#	$NetBSD: Makefile.rumpvfs,v 1.40 2014/02/27 13:00:06 hannken Exp $
 #
 
 .include "${RUMPTOP}/Makefile.rump"
@@ -41,7 +41,7 @@ SRCS+=	uvm_vnode.c
 SRCS+=	sync_subr.c sync_vnops.c
 
 # sys/miscfs/deadfs
-SRCS+=	dead_vnops.c
+SRCS+=	dead_vfsops.c dead_vnops.c
 
 # sys/miscfs
 SRCS+=	genfs_io.c genfs_rename.c genfs_vfsops.c genfs_vnops.c spec_vnops.c

Index: src/sys/sys/mount.h
diff -u src/sys/sys/mount.h:1.210 src/sys/sys/mount.h:1.211
--- src/sys/sys/mount.h:1.210	Sat Nov 23 13:35:36 2013
+++ src/sys/sys/mount.h	Thu Feb 27 13:00:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mount.h,v 1.210 2013/11/23 13:35:36 christos Exp $	*/
+/*	$NetBSD: mount.h,v 1.211 2014/02/27 13:00:06 hannken Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993
@@ -410,7 +410,6 @@ void	vfs_reinit(void);
 struct vfsops *vfs_getopsbyname(const char *);
 void	vfs_delref(struct vfsops *);
 void	vfs_destroy(struct mount *);
-void	vfs_scrubvnlist(struct mount *);
 struct mount *vfs_mountalloc(struct vfsops *, struct vnode *);
 int	vfs_stdextattrctl(struct mount *, int, struct vnode *,
 	    int, const char *);

Added files:

Index: src/sys/miscfs/deadfs/dead_vfsops.c
diff -u /dev/null src/sys/miscfs/deadfs/dead_vfsops.c:1.1
--- /dev/null	Thu Feb 27 13:00:06 2014
+++ src/sys/miscfs/deadfs/dead_vfsops.c	Thu Feb 27 13:00:06 2014
@@ -0,0 +1,80 @@
+/*	$NetBSD: dead_vfsops.c,v 1.1 2014/02/27 13:00:06 hannken Exp $	*/
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Juergen Hannken-Illjes.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: dead_vfsops.c,v 1.1 2014/02/27 13:00:06 hannken Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+
+extern const struct vnodeopv_desc dead_vnodeop_opv_desc;
+
+static const struct vnodeopv_desc * const dead_vnodeopv_descs[] = {
+	&dead_vnodeop_opv_desc,
+	NULL
+};
+
+static void
+dead_panic(void)
+{
+
+	panic("dead fs operation used");
+}
+
+struct vfsops dead_vfsops = {
+	"dead",
+	0,
+	(void *)dead_panic,			/* vfs_mount */
+	(void *)dead_panic,			/* vfs_start */
+	(void *)dead_panic,			/* vfs_unmount */
+	(void *)dead_panic,			/* vfs_root */
+	(void *)dead_panic,			/* vfs_quotactl */
+	(void *)dead_panic,			/* vfs_statvfs */
+	(void *)dead_panic,			/* vfs_sync */
+	(void *)dead_panic,			/* vfs_vget */
+	(void *)dead_panic,			/* vfs_fhtovp */
+	(void *)dead_panic,			/* vfs_vptofh */
+	(void *)dead_panic,			/* vfs_init */
+	(void *)dead_panic,			/* vfs_reinit */
+	(void *)dead_panic,			/* vfs_done */
+	(void *)dead_panic,			/* vfs_mountroot */
+	(void *)dead_panic,			/* vfs_snapshot */
+	(void *)dead_panic,			/* vfs_extattrctl */
+	(void *)dead_panic,			/* vfs_suspendctl */
+	(void *)dead_panic,			/* vfs_renamelock_enter */
+	(void *)dead_panic,			/* vfs_renamelock_exit */
+	(void *)eopnotsupp,			/* vfs_fsync */
+	dead_vnodeopv_descs,
+	0,
+	{ NULL, NULL }
+};

Reply via email to