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>