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>