Module Name:    src
Committed By:   hannken
Date:           Tue Jun 23 10:42:35 UTC 2015

Modified Files:
        src/sys/kern: vfs_subr.c
        src/sys/miscfs/deadfs: dead_vfsops.c
        src/sys/miscfs/specfs: spec_vnops.c specdev.h

Log Message:
Add a vfs_newvnode() method to deadfs and use it to create
anonymous device vnodes with bdevvp() and cdevvp().

Implement spec_inactive() and spec_reclaim() to handle these nodes.


To generate a diff of this commit:
cvs rdiff -u -r1.446 -r1.447 src/sys/kern/vfs_subr.c
cvs rdiff -u -r1.3 -r1.4 src/sys/miscfs/deadfs/dead_vfsops.c
cvs rdiff -u -r1.147 -r1.148 src/sys/miscfs/specfs/spec_vnops.c
cvs rdiff -u -r1.43 -r1.44 src/sys/miscfs/specfs/specdev.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/kern/vfs_subr.c
diff -u src/sys/kern/vfs_subr.c:1.446 src/sys/kern/vfs_subr.c:1.447
--- src/sys/kern/vfs_subr.c:1.446	Wed May  6 15:57:08 2015
+++ src/sys/kern/vfs_subr.c	Tue Jun 23 10:42:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_subr.c,v 1.446 2015/05/06 15:57:08 hannken Exp $	*/
+/*	$NetBSD: vfs_subr.c,v 1.447 2015/06/23 10:42:34 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.446 2015/05/06 15:57:08 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.447 2015/06/23 10:42:34 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -117,11 +117,12 @@ const int	vttoif_tab[9] = {
 int doforce = 1;		/* 1 => permit forcible unmounting */
 int prtactive = 0;		/* 1 => print out reclaim of active vnodes */
 
+extern struct mount *dead_rootmount;
+
 /*
  * Local declarations.
  */
 
-static int getdevvp(dev_t, vnode_t **, enum vtype);
 static void vn_initialize_syncerd(void);
 
 /*
@@ -342,8 +343,13 @@ loop:
 int
 bdevvp(dev_t dev, vnode_t **vpp)
 {
+	struct vattr va;
+
+	vattr_null(&va);
+	va.va_type = VBLK;
+	va.va_rdev = dev;
 
-	return (getdevvp(dev, vpp, VBLK));
+	return vcache_new(dead_rootmount, NULL, &va, NOCRED, vpp);
 }
 
 /*
@@ -353,8 +359,13 @@ bdevvp(dev_t dev, vnode_t **vpp)
 int
 cdevvp(dev_t dev, vnode_t **vpp)
 {
+	struct vattr va;
 
-	return (getdevvp(dev, vpp, VCHR));
+	vattr_null(&va);
+	va.va_type = VCHR;
+	va.va_rdev = dev;
+
+	return vcache_new(dead_rootmount, NULL, &va, NOCRED, vpp);
 }
 
 /*
@@ -479,36 +490,6 @@ reassignbuf(struct buf *bp, struct vnode
 }
 
 /*
- * Create a vnode for a device.
- * Used by bdevvp (block device) for root file system etc.,
- * and by cdevvp (character device) for console and kernfs.
- */
-static int
-getdevvp(dev_t dev, vnode_t **vpp, enum vtype type)
-{
-	vnode_t *vp;
-	vnode_t *nvp;
-	int error;
-
-	if (dev == NODEV) {
-		*vpp = NULL;
-		return (0);
-	}
-	error = getnewvnode(VT_NON, NULL, spec_vnodeop_p, NULL, &nvp);
-	if (error) {
-		*vpp = NULL;
-		return (error);
-	}
-	vp = nvp;
-	vp->v_type = type;
-	vp->v_vflag |= VV_MPSAFE;
-	uvm_vnp_setsize(vp, 0);
-	spec_node_init(vp, dev);
-	*vpp = vp;
-	return (0);
-}
-
-/*
  * Lookup a vnode by device number and return it referenced.
  */
 int

Index: src/sys/miscfs/deadfs/dead_vfsops.c
diff -u src/sys/miscfs/deadfs/dead_vfsops.c:1.3 src/sys/miscfs/deadfs/dead_vfsops.c:1.4
--- src/sys/miscfs/deadfs/dead_vfsops.c:1.3	Tue Jun 23 10:41:59 2015
+++ src/sys/miscfs/deadfs/dead_vfsops.c	Tue Jun 23 10:42:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: dead_vfsops.c,v 1.3 2015/06/23 10:41:59 hannken Exp $	*/
+/*	$NetBSD: dead_vfsops.c,v 1.4 2015/06/23 10:42:34 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dead_vfsops.c,v 1.3 2015/06/23 10:41:59 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dead_vfsops.c,v 1.4 2015/06/23 10:42:34 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -63,6 +63,8 @@ struct vfsops dead_vfsops = {
 	.vfs_statvfs = (void *)dead_panic,
 	.vfs_sync = (void *)dead_panic,
 	.vfs_vget = (void *)dead_panic,
+	.vfs_loadvnode = (void *)dead_panic,
+	.vfs_newvnode = dead_newvnode,
 	.vfs_fhtovp = (void *)dead_panic,
 	.vfs_vptofh = (void *)dead_panic,
 	.vfs_init = (void *)dead_panic,
@@ -84,3 +86,30 @@ dead_panic(void)
 
 	panic("dead fs operation used");
 }
+
+/*
+ * Create a new anonymous device vnode.
+ */
+int
+dead_newvnode(struct mount *mp, struct vnode *dvp, struct vnode *vp,
+    struct vattr *vap, kauth_cred_t cred,
+    size_t *key_len, const void **new_key)
+{
+
+	KASSERT(mp == dead_rootmount);
+	KASSERT(dvp == NULL);
+	KASSERT(vap->va_type == VCHR || vap->va_type == VBLK);
+	KASSERT(vap->va_rdev != VNOVAL);
+
+	vp->v_tag = VT_NON;
+	vp->v_type = vap->va_type;
+	vp->v_op = spec_vnodeop_p;
+	vp->v_vflag |= VV_MPSAFE;
+	uvm_vnp_setsize(vp, 0);
+	spec_node_init(vp, vap->va_rdev);
+
+	*key_len = sizeof(struct vnode *);
+	*new_key = vp;
+
+	return 0;
+}

Index: src/sys/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.147 src/sys/miscfs/specfs/spec_vnops.c:1.148
--- src/sys/miscfs/specfs/spec_vnops.c:1.147	Mon Apr 20 13:44:16 2015
+++ src/sys/miscfs/specfs/spec_vnops.c	Tue Jun 23 10:42:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: spec_vnops.c,v 1.147 2015/04/20 13:44:16 riastradh Exp $	*/
+/*	$NetBSD: spec_vnops.c,v 1.148 2015/06/23 10:42:34 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.147 2015/04/20 13:44:16 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.148 2015/06/23 10:42:34 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -101,6 +101,7 @@ const char	devcls[] = "devcls";
 #endif
 
 static vnode_t	*specfs_hash[SPECHSZ];
+extern struct mount *dead_rootmount;
 
 /*
  * This vnode operations vector is used for special device nodes
@@ -1077,11 +1078,27 @@ spec_inactive(void *v)
 {
 	struct vop_inactive_args /* {
 		struct vnode *a_vp;
-		struct proc *a_l;
+		struct bool *a_recycle;
 	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
 
-	VOP_UNLOCK(ap->a_vp);
-	return (0);
+	KASSERT(vp->v_mount == dead_rootmount);
+	*ap->a_recycle = true;
+	VOP_UNLOCK(vp);
+	return 0;
+}
+
+int
+spec_reclaim(void *v)
+{
+	struct vop_reclaim_args /* {
+		struct vnode *a_vp;
+	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+
+	KASSERT(vp->v_mount == dead_rootmount);
+	vcache_remove(vp->v_mount, vp, sizeof(vp));
+	return 0;
 }
 
 /*

Index: src/sys/miscfs/specfs/specdev.h
diff -u src/sys/miscfs/specfs/specdev.h:1.43 src/sys/miscfs/specfs/specdev.h:1.44
--- src/sys/miscfs/specfs/specdev.h:1.43	Fri Jul 25 08:19:19 2014
+++ src/sys/miscfs/specfs/specdev.h	Tue Jun 23 10:42:35 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: specdev.h,v 1.43 2014/07/25 08:19:19 dholland Exp $	*/
+/*	$NetBSD: specdev.h,v 1.44 2015/06/23 10:42:35 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -138,8 +138,8 @@ int	spec_fsync(void *);
 #define	spec_readdir	genfs_badop
 #define	spec_readlink	genfs_badop
 #define	spec_abortop	genfs_badop
-#define	spec_reclaim	genfs_nullop
 int	spec_inactive(void *);
+int	spec_reclaim(void *);
 #define	spec_lock	genfs_nolock
 #define	spec_unlock	genfs_nounlock
 int	spec_bmap(void *);

Reply via email to