Module Name:    src
Committed By:   hannken
Date:           Sun Jul 20 13:58:05 UTC 2014

Modified Files:
        src/sys/miscfs/kernfs: files.kernfs kernfs.h kernfs_vfsops.c
            kernfs_vnops.c
        src/sys/modules/kernfs: Makefile
        src/sys/rump/fs/lib/libkernfs: Makefile
Removed Files:
        src/sys/miscfs/kernfs: kernfs_subr.c

Log Message:
Change kernfs from hashlist to vcache.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/miscfs/kernfs/files.kernfs
cvs rdiff -u -r1.39 -r1.40 src/sys/miscfs/kernfs/kernfs.h
cvs rdiff -u -r1.28 -r0 src/sys/miscfs/kernfs/kernfs_subr.c
cvs rdiff -u -r1.94 -r1.95 src/sys/miscfs/kernfs/kernfs_vfsops.c
cvs rdiff -u -r1.152 -r1.153 src/sys/miscfs/kernfs/kernfs_vnops.c
cvs rdiff -u -r1.1 -r1.2 src/sys/modules/kernfs/Makefile
cvs rdiff -u -r1.1 -r1.2 src/sys/rump/fs/lib/libkernfs/Makefile

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

Modified files:

Index: src/sys/miscfs/kernfs/files.kernfs
diff -u src/sys/miscfs/kernfs/files.kernfs:1.4 src/sys/miscfs/kernfs/files.kernfs:1.5
--- src/sys/miscfs/kernfs/files.kernfs:1.4	Wed Mar  3 01:26:01 2010
+++ src/sys/miscfs/kernfs/files.kernfs	Sun Jul 20 13:58:04 2014
@@ -1,7 +1,6 @@
-#	$NetBSD: files.kernfs,v 1.4 2010/03/03 01:26:01 pooka Exp $
+#	$NetBSD: files.kernfs,v 1.5 2014/07/20 13:58:04 hannken Exp $
 
 deffs					KERNFS
 
-file	miscfs/kernfs/kernfs_subr.c	kernfs
 file	miscfs/kernfs/kernfs_vfsops.c	kernfs
 file	miscfs/kernfs/kernfs_vnops.c	kernfs

Index: src/sys/miscfs/kernfs/kernfs.h
diff -u src/sys/miscfs/kernfs/kernfs.h:1.39 src/sys/miscfs/kernfs/kernfs.h:1.40
--- src/sys/miscfs/kernfs/kernfs.h:1.39	Sun Jul 20 13:17:37 2014
+++ src/sys/miscfs/kernfs/kernfs.h	Sun Jul 20 13:58:04 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: kernfs.h,v 1.39 2014/07/20 13:17:37 hannken Exp $	*/
+/*	$NetBSD: kernfs.h,v 1.40 2014/07/20 13:58:04 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -39,6 +39,7 @@
 #ifdef _KERNEL
 #include <sys/queue.h>
 #include <sys/tree.h>
+#include <sys/mutex.h>
 
 /*
  * The different types of node in a kernfs filesystem
@@ -122,15 +123,10 @@ extern const int static_nkern_targets;
 extern int (**kernfs_vnodeop_p)(void *);
 extern struct vfsops kernfs_vfsops;
 extern dev_t rrootdev;
+extern kmutex_t kfs_lock;
 
 int kernfs_root(struct mount *, struct vnode **);
 
-void kernfs_hashinit(void);
-void kernfs_hashreinit(void);
-void kernfs_hashdone(void);
-int kernfs_freevp(struct vnode *);
-int kernfs_allocvp(struct mount *, struct vnode **, const struct kern_target *);
-
 /*
  * Data types for the kernfs file operations.
  */

Index: src/sys/miscfs/kernfs/kernfs_vfsops.c
diff -u src/sys/miscfs/kernfs/kernfs_vfsops.c:1.94 src/sys/miscfs/kernfs/kernfs_vfsops.c:1.95
--- src/sys/miscfs/kernfs/kernfs_vfsops.c:1.94	Thu Jul 17 08:21:34 2014
+++ src/sys/miscfs/kernfs/kernfs_vfsops.c	Sun Jul 20 13:58:04 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: kernfs_vfsops.c,v 1.94 2014/07/17 08:21:34 hannken Exp $	*/
+/*	$NetBSD: kernfs_vfsops.c,v 1.95 2014/07/20 13:58:04 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993, 1995
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kernfs_vfsops.c,v 1.94 2014/07/17 08:21:34 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kernfs_vfsops.c,v 1.95 2014/07/20 13:58:04 hannken Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -68,6 +68,7 @@ MODULE(MODULE_CLASS_VFS, kernfs, NULL);
 MALLOC_JUSTDEFINE(M_KERNFSMNT, "kernfs mount", "kernfs mount structures");
 
 dev_t rrootdev = NODEV;
+kmutex_t kfs_lock;
 
 VFS_PROTOS(kernfs);
 
@@ -80,20 +81,20 @@ kernfs_init(void)
 {
 
 	malloc_type_attach(M_KERNFSMNT);
-	kernfs_hashinit();
+	mutex_init(&kfs_lock, MUTEX_DEFAULT, IPL_NONE);
 }
 
 void
 kernfs_reinit(void)
 {
-	kernfs_hashreinit();
+
 }
 
 void
 kernfs_done(void)
 {
 
-	kernfs_hashdone();
+	mutex_destroy(&kfs_lock);
 	malloc_type_detach(M_KERNFSMNT);
 }
 
@@ -190,9 +191,20 @@ kernfs_unmount(struct mount *mp, int mnt
 int
 kernfs_root(struct mount *mp, struct vnode **vpp)
 {
+	const struct kern_target *root_target = &kern_targets[0];
+	int error;
 
 	/* setup "." */
-	return (kernfs_allocvp(mp, vpp, &kern_targets[0]));
+	error = vcache_get(mp, &root_target, sizeof(root_target), vpp);
+	if (error)
+		return error;
+	error = vn_lock(*vpp, LK_EXCLUSIVE);
+	if (error) {
+		vrele(*vpp);
+		*vpp = NULL;
+		return error;
+	}
+	return 0;
 }
 
 /*ARGSUSED*/
@@ -216,6 +228,70 @@ kernfs_vget(struct mount *mp, ino_t ino,
 	return (EOPNOTSUPP);
 }
 
+int
+kernfs_loadvnode(struct mount *mp, struct vnode *vp,
+    const void *key, size_t key_len, const void **new_key)
+{
+	const struct kern_target *kt;
+	struct kernfs_node *kfs, *kfsp;
+	long *cookie;
+
+	KASSERT(key_len == sizeof(kt));
+	memcpy(&kt, key, key_len);
+
+	kfs = kmem_zalloc(sizeof(struct kernfs_node), KM_SLEEP);
+	cookie = &(VFSTOKERNFS(mp)->fileno_cookie);
+	mutex_enter(&kfs_lock);
+again:
+	TAILQ_FOREACH(kfsp, &VFSTOKERNFS(mp)->nodelist, kfs_list) {
+		if (kfsp->kfs_cookie == *cookie) {
+			(*cookie) ++;
+			goto again;
+		}
+		if (TAILQ_NEXT(kfsp, kfs_list)) {
+			if (kfsp->kfs_cookie < *cookie &&
+			    *cookie < TAILQ_NEXT(kfsp, kfs_list)->kfs_cookie)
+				break;
+			if (kfsp->kfs_cookie + 1 <
+			    TAILQ_NEXT(kfsp, kfs_list)->kfs_cookie) {
+				*cookie = kfsp->kfs_cookie + 1;
+				break;
+			}
+		}
+	}
+
+	kfs->kfs_cookie = *cookie;
+
+	if (kfsp)
+		TAILQ_INSERT_AFTER(&VFSTOKERNFS(mp)->nodelist, kfsp, kfs,
+		    kfs_list);
+	else
+		TAILQ_INSERT_TAIL(&VFSTOKERNFS(mp)->nodelist, kfs, kfs_list);
+
+	kfs->kfs_type = kt->kt_tag;
+	kfs->kfs_vnode = vp;
+	kfs->kfs_fileno = KERNFS_FILENO(kt, kt->kt_tag, kfs->kfs_cookie);
+	kfs->kfs_kt = kt;
+	kfs->kfs_mode = kt->kt_mode;
+	vp->v_tag = VT_KERNFS;
+	vp->v_op = kernfs_vnodeop_p;
+	vp->v_data = kfs;
+	vp->v_type = kt->kt_vtype;
+	mutex_exit(&kfs_lock);
+
+	if (kt->kt_tag == KFSkern)
+		vp->v_vflag = VV_ROOT;
+
+	if (kt->kt_tag == KFSdevice) {
+		spec_node_init(vp, *(dev_t *)kt->kt_data);
+	}
+
+	uvm_vnp_setsize(vp, 0);
+
+	*new_key = &kfs->kfs_kt;
+	return 0;
+}
+
 extern const struct vnodeopv_desc kernfs_vnodeop_opv_desc;
 
 const struct vnodeopv_desc * const kernfs_vnodeopv_descs[] = {
@@ -234,6 +310,7 @@ struct vfsops kernfs_vfsops = {
 	.vfs_statvfs = genfs_statvfs,
 	.vfs_sync = kernfs_sync,
 	.vfs_vget = kernfs_vget,
+	.vfs_loadvnode = kernfs_loadvnode,
 	.vfs_fhtovp = (void *)eopnotsupp,
 	.vfs_vptofh = (void *)eopnotsupp,
 	.vfs_init = kernfs_init,

Index: src/sys/miscfs/kernfs/kernfs_vnops.c
diff -u src/sys/miscfs/kernfs/kernfs_vnops.c:1.152 src/sys/miscfs/kernfs/kernfs_vnops.c:1.153
--- src/sys/miscfs/kernfs/kernfs_vnops.c:1.152	Thu Jul 17 08:21:34 2014
+++ src/sys/miscfs/kernfs/kernfs_vnops.c	Sun Jul 20 13:58:04 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: kernfs_vnops.c,v 1.152 2014/07/17 08:21:34 hannken Exp $	*/
+/*	$NetBSD: kernfs_vnops.c,v 1.153 2014/07/20 13:58:04 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.152 2014/07/17 08:21:34 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.153 2014/07/20 13:58:04 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -520,11 +520,8 @@ kernfs_lookup(void *v)
 		break;
 
 	found:
-		error = kernfs_allocvp(dvp->v_mount, vpp, kt);
-		if (error)
-			return error;
-		VOP_UNLOCK(*vpp);
-		return 0;
+		error = vcache_get(dvp->v_mount, &kt, sizeof(kt), vpp);
+		return error;
 
 	case KFSsubdir:
 		ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data;
@@ -834,11 +831,11 @@ kernfs_setdirentfileno_kt(struct dirent 
 	struct vnode *vp;
 	int error;
 
-	if ((error = kernfs_allocvp(ap->a_vp->v_mount, &vp, kt)) != 0)
+	if ((error = vcache_get(ap->a_vp->v_mount, &kt, sizeof(kt), &vp)) != 0)
 		return error;
 	kfs = VTOKERN(vp);
 	d->d_fileno = kfs->kfs_fileno;
-	vput(vp);
+	vrele(vp);
 	return 0;
 }
 
@@ -1079,8 +1076,17 @@ kernfs_reclaim(void *v)
 	struct vop_reclaim_args /* {
 		struct vnode *a_vp;
 	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+	struct kernfs_node *kfs = VTOKERN(vp);
+
+	vp->v_data = NULL;
+	vcache_remove(vp->v_mount, &kfs->kfs_kt, sizeof(kfs->kfs_kt));
+	mutex_enter(&kfs_lock);
+	TAILQ_REMOVE(&VFSTOKERNFS(vp->v_mount)->nodelist, kfs, kfs_list);
+	mutex_exit(&kfs_lock);
+	kmem_free(kfs, sizeof(struct kernfs_node));
 
-	return (kernfs_freevp(ap->a_vp));
+	return 0;
 }
 
 /*

Index: src/sys/modules/kernfs/Makefile
diff -u src/sys/modules/kernfs/Makefile:1.1 src/sys/modules/kernfs/Makefile:1.2
--- src/sys/modules/kernfs/Makefile:1.1	Sat Jun 28 16:11:36 2008
+++ src/sys/modules/kernfs/Makefile	Sun Jul 20 13:58:05 2014
@@ -1,10 +1,10 @@
-#	$NetBSD: Makefile,v 1.1 2008/06/28 16:11:36 rumble Exp $
+#	$NetBSD: Makefile,v 1.2 2014/07/20 13:58:05 hannken Exp $
 
 .include "../Makefile.inc"
 
 .PATH:	${S}/miscfs/kernfs
 
 KMOD=	kernfs
-SRCS=	kernfs_vfsops.c kernfs_vnops.c kernfs_subr.c
+SRCS=	kernfs_vfsops.c kernfs_vnops.c
 
 .include <bsd.kmodule.mk>

Index: src/sys/rump/fs/lib/libkernfs/Makefile
diff -u src/sys/rump/fs/lib/libkernfs/Makefile:1.1 src/sys/rump/fs/lib/libkernfs/Makefile:1.2
--- src/sys/rump/fs/lib/libkernfs/Makefile:1.1	Wed Mar 31 14:18:33 2010
+++ src/sys/rump/fs/lib/libkernfs/Makefile	Sun Jul 20 13:58:05 2014
@@ -1,11 +1,11 @@
-#	$NetBSD: Makefile,v 1.1 2010/03/31 14:18:33 pooka Exp $
+#	$NetBSD: Makefile,v 1.2 2014/07/20 13:58:05 hannken Exp $
 #
 
 .PATH:  ${.CURDIR}/../../../../miscfs/kernfs
 
 LIB=	rumpfs_kernfs
 
-SRCS=	kernfs_subr.c kernfs_vfsops.c kernfs_vnops.c
+SRCS=	kernfs_vfsops.c kernfs_vnops.c
 
 .include <bsd.lib.mk>
 .include <bsd.klinks.mk>

Reply via email to