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>

Reply via email to