Module Name: src Committed By: hannken Date: Thu Aug 7 08:24:23 UTC 2014
Modified Files: src/sys/fs/efs: efs_vfsops.c efs_vnops.c files.efs src/sys/modules/efs: Makefile src/sys/rump/fs/lib/libefs: Makefile Removed Files: src/sys/fs/efs: efs_ihash.c efs_ihash.h Log Message: Change efs from hashlist to vcache. To generate a diff of this commit: cvs rdiff -u -r1.10 -r0 src/sys/fs/efs/efs_ihash.c cvs rdiff -u -r1.1 -r0 src/sys/fs/efs/efs_ihash.h cvs rdiff -u -r1.25 -r1.26 src/sys/fs/efs/efs_vfsops.c cvs rdiff -u -r1.32 -r1.33 src/sys/fs/efs/efs_vnops.c cvs rdiff -u -r1.1 -r1.2 src/sys/fs/efs/files.efs cvs rdiff -u -r1.1 -r1.2 src/sys/modules/efs/Makefile cvs rdiff -u -r1.3 -r1.4 src/sys/rump/fs/lib/libefs/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/fs/efs/efs_vfsops.c diff -u src/sys/fs/efs/efs_vfsops.c:1.25 src/sys/fs/efs/efs_vfsops.c:1.26 --- src/sys/fs/efs/efs_vfsops.c:1.25 Wed Apr 16 18:55:18 2014 +++ src/sys/fs/efs/efs_vfsops.c Thu Aug 7 08:24:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: efs_vfsops.c,v 1.25 2014/04/16 18:55:18 maxv Exp $ */ +/* $NetBSD: efs_vfsops.c,v 1.26 2014/08/07 08:24:23 hannken Exp $ */ /* * Copyright (c) 2006 Stephen M. Rumble <rum...@ephemeral.org> @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: efs_vfsops.c,v 1.25 2014/04/16 18:55:18 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efs_vfsops.c,v 1.26 2014/08/07 08:24:23 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -47,7 +47,6 @@ __KERNEL_RCSID(0, "$NetBSD: efs_vfsops.c #include <fs/efs/efs_dinode.h> #include <fs/efs/efs_inode.h> #include <fs/efs/efs_subr.h> -#include <fs/efs/efs_ihash.h> MODULE(MODULE_CLASS_VFS, efs, NULL); @@ -341,74 +340,53 @@ efs_statvfs(struct mount *mp, struct sta /* * Obtain a locked vnode for the given on-disk inode number. * - * We currently allocate a new vnode from getnewnode(), tack it with - * our in-core inode structure (efs_inode), and read in the inode from - * disk. The returned inode must be locked. - * * Returns 0 on success. */ static int efs_vget(struct mount *mp, ino_t ino, struct vnode **vpp) { - int err; - struct vnode *vp; + int error; + + error = vcache_get(mp, &ino, sizeof(ino), vpp); + if (error) + return error; + error = vn_lock(*vpp, LK_EXCLUSIVE); + if (error) { + vrele(*vpp); + *vpp = NULL; + return error; + } + return 0; +} + +/* + * Initialize this vnode / inode pair. + * Caller assures no other thread will try to load this inode. + */ +static int +efs_loadvnode(struct mount *mp, struct vnode *vp, + const void *key, size_t key_len, const void **new_key) +{ + int error; + ino_t ino; struct efs_inode *eip; struct efs_mount *emp; + KASSERT(key_len == sizeof(ino)); + memcpy(&ino, key, key_len); emp = VFSTOEFS(mp); - while (true) { - *vpp = efs_ihashget(emp->em_dev, ino, LK_EXCLUSIVE); - if (*vpp != NULL) - return (0); - - err = getnewvnode(VT_EFS, mp, efs_vnodeop_p, NULL, &vp); - if (err) - return (err); - - eip = pool_get(&efs_inode_pool, PR_WAITOK); - - /* - * See if anybody has raced us here. If not, continue - * setting up the new inode, otherwise start over. - */ - efs_ihashlock(); - - if (efs_ihashget(emp->em_dev, ino, 0) == NULL) - break; - - efs_ihashunlock(); - ungetnewvnode(vp); - pool_put(&efs_inode_pool, eip); - } - - vp->v_vflag |= VV_LOCKSWORK; + eip = pool_get(&efs_inode_pool, PR_WAITOK); eip->ei_mode = 0; eip->ei_lockf = NULL; eip->ei_number = ino; eip->ei_dev = emp->em_dev; eip->ei_vp = vp; - vp->v_data = eip; - /* - * Place the vnode on the hash chain. Doing so will lock the - * vnode, so it's okay to drop the global lock and read in - * the inode from disk. - */ - efs_ihashins(eip); - efs_ihashunlock(); - - /* - * Init genfs early, otherwise we'll trip up on genfs_node_destroy - * in efs_reclaim when vput()ing in an error branch here. - */ - genfs_node_init(vp, &efs_genfsops); - - err = efs_read_inode(emp, ino, NULL, &eip->ei_di); - if (err) { - vput(vp); - *vpp = NULL; - return (err); + error = efs_read_inode(emp, ino, NULL, &eip->ei_di); + if (error) { + pool_put(&efs_inode_pool, eip); + return error; } efs_sync_dinode_to_inode(eip); @@ -416,9 +394,8 @@ efs_vget(struct mount *mp, ino_t ino, st if (ino == EFS_ROOTINO && !S_ISDIR(eip->ei_mode)) { printf("efs: root inode (%lu) is not a directory!\n", (ulong)EFS_ROOTINO); - vput(vp); - *vpp = NULL; - return (EIO); + pool_put(&efs_inode_pool, eip); + return EIO; } switch (eip->ei_mode & S_IFMT) { @@ -433,6 +410,7 @@ efs_vget(struct mount *mp, ino_t ino, st break; case S_IFDIR: vp->v_type = VDIR; + vp->v_op = efs_vnodeop_p; if (ino == EFS_ROOTINO) vp->v_vflag |= VV_ROOT; break; @@ -443,27 +421,30 @@ efs_vget(struct mount *mp, ino_t ino, st break; case S_IFREG: vp->v_type = VREG; + vp->v_op = efs_vnodeop_p; break; case S_IFLNK: vp->v_type = VLNK; + vp->v_op = efs_vnodeop_p; break; case S_IFSOCK: vp->v_type = VSOCK; + vp->v_op = efs_vnodeop_p; break; default: printf("efs: invalid mode 0x%x in inode %lu on mount %s\n", eip->ei_mode, (ulong)ino, mp->mnt_stat.f_mntonname); - vput(vp); - *vpp = NULL; - return (EIO); + pool_put(&efs_inode_pool, eip); + return EIO; } + vp->v_tag = VT_EFS; + vp->v_vflag |= VV_LOCKSWORK; + vp->v_data = eip; + genfs_node_init(vp, &efs_genfsops); uvm_vnp_setsize(vp, eip->ei_size); - *vpp = vp; - - KASSERT(VOP_ISLOCKED(vp)); - - return (0); + *new_key = &eip->ei_number; + return 0; } /* @@ -537,7 +518,6 @@ efs_init(void) malloc_type_attach(M_EFSMNT); malloc_type_attach(M_EFSINO); malloc_type_attach(M_EFSTMP); - efs_ihashinit(); pool_init(&efs_inode_pool, sizeof(struct efs_inode), 0, 0, 0, "efsinopl", &pool_allocator_nointr, IPL_NONE); } @@ -549,7 +529,6 @@ static void efs_reinit(void) { - efs_ihashreinit(); } /* @@ -560,7 +539,6 @@ efs_done(void) { pool_destroy(&efs_inode_pool); - efs_ihashdone(); malloc_type_detach(M_EFSMNT); malloc_type_detach(M_EFSINO); malloc_type_detach(M_EFSTMP); @@ -588,6 +566,7 @@ struct vfsops efs_vfsops = { .vfs_statvfs = efs_statvfs, .vfs_sync = (void *)nullop, .vfs_vget = efs_vget, + .vfs_loadvnode = efs_loadvnode, .vfs_fhtovp = efs_fhtovp, .vfs_vptofh = efs_vptofh, .vfs_init = efs_init, Index: src/sys/fs/efs/efs_vnops.c diff -u src/sys/fs/efs/efs_vnops.c:1.32 src/sys/fs/efs/efs_vnops.c:1.33 --- src/sys/fs/efs/efs_vnops.c:1.32 Fri Jul 25 08:20:51 2014 +++ src/sys/fs/efs/efs_vnops.c Thu Aug 7 08:24:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: efs_vnops.c,v 1.32 2014/07/25 08:20:51 dholland Exp $ */ +/* $NetBSD: efs_vnops.c,v 1.33 2014/08/07 08:24:23 hannken Exp $ */ /* * Copyright (c) 2006 Stephen M. Rumble <rum...@ephemeral.org> @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.32 2014/07/25 08:20:51 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.33 2014/08/07 08:24:23 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -46,7 +46,6 @@ __KERNEL_RCSID(0, "$NetBSD: efs_vnops.c, #include <fs/efs/efs_dinode.h> #include <fs/efs/efs_inode.h> #include <fs/efs/efs_subr.h> -#include <fs/efs/efs_ihash.h> MALLOC_DECLARE(M_EFSTMP); @@ -79,30 +78,17 @@ efs_lookup(void *v) } /* - * Handle the three lookup types: '.', '..', and everything else. + * Handle the lookup types: '.' or everything else. */ if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') { vref(ap->a_dvp); *ap->a_vpp = ap->a_dvp; - } else if (cnp->cn_flags & ISDOTDOT) { - err = efs_inode_lookup(VFSTOEFS(ap->a_dvp->v_mount), - EFS_VTOI(ap->a_dvp), ap->a_cnp, &ino); - if (err) - return (err); - - VOP_UNLOCK(ap->a_dvp); /* preserve lock order */ - - err = VFS_VGET(ap->a_dvp->v_mount, ino, &vp); - if (err) { - vn_lock(ap->a_dvp, LK_EXCLUSIVE | LK_RETRY); - return (err); - } - vn_lock(ap->a_dvp, LK_EXCLUSIVE | LK_RETRY); - *ap->a_vpp = vp; } else { err = efs_inode_lookup(VFSTOEFS(ap->a_dvp->v_mount), EFS_VTOI(ap->a_dvp), ap->a_cnp, &ino); if (err) { + if (cnp->cn_flags & ISDOTDOT) + return (err); if (err == ENOENT && nameiop != CREATE) cache_enter(ap->a_dvp, NULL, cnp->cn_nameptr, cnp->cn_namelen, cnp->cn_flags); @@ -116,7 +102,7 @@ efs_lookup(void *v) } return (err); } - err = VFS_VGET(ap->a_dvp->v_mount, ino, &vp); + err = vcache_get(ap->a_dvp->v_mount, &ino, sizeof(ino), &vp); if (err) return (err); *ap->a_vpp = vp; @@ -125,9 +111,6 @@ efs_lookup(void *v) cache_enter(ap->a_dvp, *ap->a_vpp, cnp->cn_nameptr, cnp->cn_namelen, cnp->cn_flags); - if (*ap->a_vpp != ap->a_dvp) - VOP_UNLOCK(*ap->a_vpp); - return 0; } @@ -598,10 +581,11 @@ efs_reclaim(void *v) struct vnode *a_vp; } */ *ap = v; struct vnode *vp = ap->a_vp; + struct efs_inode *eip = EFS_VTOI(vp); - efs_ihashrem(EFS_VTOI(vp)); + vcache_remove(vp->v_mount, &eip->ei_number, sizeof(eip->ei_number)); genfs_node_destroy(vp); - pool_put(&efs_inode_pool, vp->v_data); + pool_put(&efs_inode_pool, eip); vp->v_data = NULL; return (0); Index: src/sys/fs/efs/files.efs diff -u src/sys/fs/efs/files.efs:1.1 src/sys/fs/efs/files.efs:1.2 --- src/sys/fs/efs/files.efs:1.1 Fri Jun 29 23:30:30 2007 +++ src/sys/fs/efs/files.efs Thu Aug 7 08:24:23 2014 @@ -1,9 +1,8 @@ -# $NetBSD: files.efs,v 1.1 2007/06/29 23:30:30 rumble Exp $ +# $NetBSD: files.efs,v 1.2 2014/08/07 08:24:23 hannken Exp $ deffs EFS file fs/efs/efs_genfs.c efs -file fs/efs/efs_ihash.c efs file fs/efs/efs_subr.c efs file fs/efs/efs_vnops.c efs file fs/efs/efs_vfsops.c efs Index: src/sys/modules/efs/Makefile diff -u src/sys/modules/efs/Makefile:1.1 src/sys/modules/efs/Makefile:1.2 --- src/sys/modules/efs/Makefile:1.1 Sat Jun 28 16:11:35 2008 +++ src/sys/modules/efs/Makefile Thu Aug 7 08:24:23 2014 @@ -1,10 +1,10 @@ -# $NetBSD: Makefile,v 1.1 2008/06/28 16:11:35 rumble Exp $ +# $NetBSD: Makefile,v 1.2 2014/08/07 08:24:23 hannken Exp $ .include "../Makefile.inc" .PATH: ${S}/fs/efs KMOD= efs -SRCS= efs_genfs.c efs_ihash.c efs_subr.c efs_vfsops.c efs_vnops.c +SRCS= efs_genfs.c efs_subr.c efs_vfsops.c efs_vnops.c .include <bsd.kmodule.mk> Index: src/sys/rump/fs/lib/libefs/Makefile diff -u src/sys/rump/fs/lib/libefs/Makefile:1.3 src/sys/rump/fs/lib/libefs/Makefile:1.4 --- src/sys/rump/fs/lib/libefs/Makefile:1.3 Tue Jul 29 13:17:42 2008 +++ src/sys/rump/fs/lib/libefs/Makefile Thu Aug 7 08:24:23 2014 @@ -1,11 +1,11 @@ -# $NetBSD: Makefile,v 1.3 2008/07/29 13:17:42 pooka Exp $ +# $NetBSD: Makefile,v 1.4 2014/08/07 08:24:23 hannken Exp $ # .PATH: ${.CURDIR}/../../../../fs/efs LIB= rumpfs_efs -SRCS= efs_genfs.c efs_ihash.c efs_subr.c efs_vfsops.c efs_vnops.c +SRCS= efs_genfs.c efs_subr.c efs_vfsops.c efs_vnops.c .include <bsd.lib.mk> .include <bsd.klinks.mk>