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 <[email protected]>
@@ -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 <[email protected]>
@@ -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>