Module Name:    src
Committed By:   hannken
Date:           Sun Jan 11 17:29:57 UTC 2015

Modified Files:
        src/sys/modules/chfs: Makefile
        src/sys/ufs: files.ufs
        src/sys/ufs/chfs: chfs.h chfs_inode.h chfs_vfsops.c chfs_vnode.c
            chfs_vnops.c
Removed Files:
        src/sys/ufs/chfs: chfs_ihash.c

Log Message:
Change chfs from hashlist to vcache.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/modules/chfs/Makefile
cvs rdiff -u -r1.38 -r1.39 src/sys/ufs/files.ufs
cvs rdiff -u -r1.8 -r1.9 src/sys/ufs/chfs/chfs.h
cvs rdiff -u -r1.3 -r0 src/sys/ufs/chfs/chfs_ihash.c
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/chfs/chfs_inode.h
cvs rdiff -u -r1.14 -r1.15 src/sys/ufs/chfs/chfs_vfsops.c
cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/chfs/chfs_vnode.c
cvs rdiff -u -r1.23 -r1.24 src/sys/ufs/chfs/chfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/modules/chfs/Makefile
diff -u src/sys/modules/chfs/Makefile:1.3 src/sys/modules/chfs/Makefile:1.4
--- src/sys/modules/chfs/Makefile:1.3	Thu Apr 12 15:31:01 2012
+++ src/sys/modules/chfs/Makefile	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.3 2012/04/12 15:31:01 ttoth Exp $
+#	$NetBSD: Makefile,v 1.4 2015/01/11 17:29:57 hannken Exp $
 
 .include "../Makefile.inc"
 
@@ -7,7 +7,7 @@
 CPPFLAGS+=	-DDIAGNOSTIC -DDEBUG -DLOCKDEBUG
 
 KMOD=	chfs
-SRCS=	ebh.c chfs_wbuf.c chfs_vnode_cache.c chfs_ihash.c
+SRCS=	ebh.c chfs_wbuf.c chfs_vnode_cache.c
 SRCS+=  chfs_gc.c
 SRCS+=  chfs_vnode.c chfs_erase.c chfs_write.c chfs_readinode.c
 SRCS+=  chfs_build.c chfs_scan.c chfs_nodeops.c chfs_malloc.c

Index: src/sys/ufs/files.ufs
diff -u src/sys/ufs/files.ufs:1.38 src/sys/ufs/files.ufs:1.39
--- src/sys/ufs/files.ufs:1.38	Sun Nov 16 16:01:39 2014
+++ src/sys/ufs/files.ufs	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: files.ufs,v 1.38 2014/11/16 16:01:39 manu Exp $
+#	$NetBSD: files.ufs,v 1.39 2015/01/11 17:29:57 hannken Exp $
 
 deffs					FFS
 deffs					EXT2FS
@@ -28,7 +28,6 @@ file	ufs/ext2fs/ext2fs_vnops.c	ext2fs
 
 define	chfs: vfs, ffs
 file	ufs/chfs/ebh.c			chfs
-file	ufs/chfs/chfs_ihash.c		chfs
 file	ufs/chfs/chfs_scan.c		chfs
 file	ufs/chfs/chfs_write.c		chfs
 file	ufs/chfs/chfs_vnode_cache.c	chfs

Index: src/sys/ufs/chfs/chfs.h
diff -u src/sys/ufs/chfs/chfs.h:1.8 src/sys/ufs/chfs/chfs.h:1.9
--- src/sys/ufs/chfs/chfs.h:1.8	Fri Oct 19 12:44:39 2012
+++ src/sys/ufs/chfs/chfs.h	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs.h,v 1.8 2012/10/19 12:44:39 ttoth Exp $	*/
+/*	$NetBSD: chfs.h,v 1.9 2015/01/11 17:29:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -571,18 +571,6 @@ int chfs_read_data(struct chfs_mount*, s
 /* chfs_erase.c */
 int chfs_remap_leb(struct chfs_mount *);
 
-/* chfs_ihash.c */
-void chfs_ihashinit(void);
-void chfs_ihashreinit(void);
-void chfs_ihashdone(void);
-struct vnode *chfs_ihashlookup(dev_t, ino_t);
-struct vnode *chfs_ihashget(dev_t, ino_t, int);
-void chfs_ihashins(struct chfs_inode *);
-void chfs_ihashrem(struct chfs_inode *);
-
-extern kmutex_t	chfs_ihash_lock;
-extern kmutex_t	chfs_hashlock;
-
 /* chfs_gc.c */
 void chfs_gc_trigger(struct chfs_mount *);
 int chfs_gc_thread_should_wake(struct chfs_mount *);

Index: src/sys/ufs/chfs/chfs_inode.h
diff -u src/sys/ufs/chfs/chfs_inode.h:1.9 src/sys/ufs/chfs/chfs_inode.h:1.10
--- src/sys/ufs/chfs/chfs_inode.h:1.9	Mon May 26 19:16:39 2014
+++ src/sys/ufs/chfs/chfs_inode.h	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs_inode.h,v 1.9 2014/05/26 19:16:39 dholland Exp $	*/
+/*	$NetBSD: chfs_inode.h,v 1.10 2015/01/11 17:29:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -77,8 +77,6 @@ struct chfs_inode
 	struct genfs_node	gnode;
 	kmutex_t inode_lock;		/* lock the fields of chfs_inode */
 
-	LIST_ENTRY(chfs_inode) hash_entry;	/* hash chain */
-
 	struct ufsmount *ump;		/* ufs mount - TODO we should remove it */
 	struct chfs_mount *chmp;	/* chfs mount point - TODO we should remove it */
 

Index: src/sys/ufs/chfs/chfs_vfsops.c
diff -u src/sys/ufs/chfs/chfs_vfsops.c:1.14 src/sys/ufs/chfs/chfs_vfsops.c:1.15
--- src/sys/ufs/chfs/chfs_vfsops.c:1.14	Sun Nov  9 18:23:28 2014
+++ src/sys/ufs/chfs/chfs_vfsops.c	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs_vfsops.c,v 1.14 2014/11/09 18:23:28 maxv Exp $	*/
+/*	$NetBSD: chfs_vfsops.c,v 1.15 2015/01/11 17:29:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -70,6 +70,8 @@ MODULE(MODULE_CLASS_VFS, chfs, "flash");
 static int chfs_mount(struct mount *, const char *, void *, size_t *);
 static int chfs_unmount(struct mount *, int);
 static int chfs_root(struct mount *, struct vnode **);
+static int chfs_loadvnode(struct mount *, struct vnode *,
+    const void *, size_t, const void **);
 static int chfs_vget(struct mount *, ino_t, struct vnode **);
 static int chfs_fhtovp(struct mount *, struct fid *, struct vnode **);
 static int chfs_vptofh(struct vnode *, struct fid *, size_t *);
@@ -447,71 +449,49 @@ chfs_root(struct mount *mp, struct vnode
 extern rb_tree_ops_t frag_rbtree_ops;
 
 static int
-chfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
+chfs_loadvnode(struct mount *mp, struct vnode *vp,
+    const void *key, size_t key_len, const void **new_key)
 {
 	struct chfs_mount *chmp;
 	struct chfs_inode *ip;
 	struct ufsmount *ump;
-	struct vnode *vp;
 	dev_t dev;
 	int error;
 	struct chfs_vnode_cache* chvc = NULL;
 	struct chfs_node_ref* nref = NULL;
 	struct buf *bp;
+	ino_t ino;
+
+	KASSERT(key_len == sizeof(ino));
+	memcpy(&ino, key, key_len);
 
 	dbg("vget() | ino: %llu\n", (unsigned long long)ino);
 
 	ump = VFSTOUFS(mp);
 	dev = ump->um_dev;
-retry:
-	if (!vpp) {
-		vpp = kmem_alloc(sizeof(struct vnode*), KM_SLEEP);
-	}
 
-	/* Get node from inode hash. */
-	if ((*vpp = chfs_ihashget(dev, ino, LK_EXCLUSIVE)) != NULL) {
-		return 0;
-	}
-
-	/* Allocate a new vnode/inode. */
-	if ((error = getnewvnode(VT_CHFS,
-		    mp, chfs_vnodeop_p, NULL, &vp)) != 0) {
-		*vpp = NULL;
-		return (error);
-	}
 	ip = pool_get(&chfs_inode_pool, PR_WAITOK);
 
-	mutex_enter(&chfs_hashlock);
-	if ((*vpp = chfs_ihashget(dev, ino, LK_EXCLUSIVE)) != NULL) {
-		mutex_exit(&chfs_hashlock);
-		ungetnewvnode(vp);
-		pool_put(&chfs_inode_pool, ip);
-		goto retry;
-	}
-
-	vp->v_vflag |= VV_LOCKSWORK;
-
 	/* Initialize vnode/inode. */
 	memset(ip, 0, sizeof(*ip));
-	vp->v_data = ip;
 	ip->vp = vp;
-	ip->ch_type = VTTOCHT(vp->v_type);
 	ip->ump = ump;
 	ip->chmp = chmp = ump->um_chfs;
 	ip->dev = dev;
 	ip->ino = ino;
-	vp->v_mount = mp;
-	genfs_node_init(vp, &chfs_genfsops);
 
 	rb_tree_init(&ip->fragtree, &frag_rbtree_ops);
 
-	chfs_ihashins(ip);
-	mutex_exit(&chfs_hashlock);
+	vp->v_tag = VT_CHFS;
+	vp->v_op = chfs_vnodeop_p;
+	vp->v_vflag |= VV_LOCKSWORK;
+	if (ino == CHFS_ROOTINO)
+		vp->v_vflag |= VV_ROOT;
+	vp->v_data = ip;
 
 	/* Set root inode. */
 	if (ino == CHFS_ROOTINO) {
 		dbg("SETROOT\n");
-		vp->v_vflag |= VV_ROOT;
 		vp->v_type = VDIR;
 		ip->ch_type = CHT_DIR;
 		ip->mode = IFMT | IEXEC | IWRITE | IREAD;
@@ -553,6 +533,7 @@ retry:
 
 		mutex_enter(&chmp->chm_lock_mountfields);
 		/* Initialize type specific things. */
+		error = 0;
 		switch (ip->ch_type) {
 		case CHT_DIR:
 			/* Read every dirent. */
@@ -571,24 +552,14 @@ retry:
 			dbg("read_inode_internal | ino: %llu\n",
 				(unsigned long long)ip->ino);
 			error = chfs_read_inode(chmp, ip);
-			if (error) {
-				vput(vp);
-				*vpp = NULL;
-				mutex_exit(&chmp->chm_lock_mountfields);
-				return (error);
-			}
 			break;
 		case CHT_LNK:
 			/* Collect data. */
 			dbg("read_inode_internal | ino: %llu\n",
 				(unsigned long long)ip->ino);
 			error = chfs_read_inode_internal(chmp, ip);
-			if (error) {
-				vput(vp);
-				*vpp = NULL;
-				mutex_exit(&chmp->chm_lock_mountfields);
-				return (error);
-			}
+			if (error)
+				break;
 
 			/* Set link. */
 			dbg("size: %llu\n", (unsigned long long)ip->size);
@@ -615,12 +586,8 @@ retry:
 			dbg("read_inode_internal | ino: %llu\n",
 				(unsigned long long)ip->ino);
 			error = chfs_read_inode_internal(chmp, ip);
-			if (error) {
-				vput(vp);
-				*vpp = NULL;
-				mutex_exit(&chmp->chm_lock_mountfields);
-				return (error);
-			}
+			if (error)
+				break;
 
 			/* Set device. */
 			bp = getiobuf(vp, true);
@@ -648,21 +615,52 @@ retry:
 			break;
 		}
 		mutex_exit(&chmp->chm_lock_mountfields);
+		if (error) {
+			vp->v_data = NULL;
+			KASSERT(TAILQ_FIRST(&ip->dents) == NULL);
+			pool_put(&chfs_inode_pool, ip);
+			return error;
+		}
 
 	}
 
 	/* Finish inode initalization. */
+	ip->ch_type = VTTOCHT(vp->v_type);
 	ip->devvp = ump->um_devvp;
 	vref(ip->devvp);
 
+	genfs_node_init(vp, &chfs_genfsops);
 	uvm_vnp_setsize(vp, ip->size);
-	*vpp = vp;
+	
+	*new_key = &ip->ino;
+
+	return 0;
+}
+
+/* --------------------------------------------------------------------- */
+
+static int
+chfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
+{
+	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;
 }
 
 /* --------------------------------------------------------------------- */
 
+
 static int
 chfs_fhtovp(struct mount *mp, struct fid *fhp, struct vnode **vpp)
 {
@@ -735,7 +733,6 @@ chfs_init(void)
 {
 	/* Initialize pools and inode hash. */
 	chfs_alloc_pool_caches();
-	chfs_ihashinit();
 	pool_init(&chfs_inode_pool, sizeof(struct chfs_inode), 0, 0, 0,
 	    "chfsinopl", &pool_allocator_nointr, IPL_NONE);
 	ufs_init();
@@ -746,7 +743,6 @@ chfs_init(void)
 static void
 chfs_reinit(void)
 {
-	chfs_ihashreinit();
 	ufs_reinit();
 }
 
@@ -756,7 +752,6 @@ static void
 chfs_done(void)
 {
 	ufs_done();
-	chfs_ihashdone();
 	pool_destroy(&chfs_inode_pool);
 	chfs_destroy_pool_caches();
 }
@@ -798,6 +793,7 @@ struct vfsops chfs_vfsops = {
 	.vfs_statvfs = chfs_statvfs,
 	.vfs_sync = chfs_sync,
 	.vfs_vget = chfs_vget,
+	.vfs_loadvnode = chfs_loadvnode,
 	.vfs_fhtovp = chfs_fhtovp,
 	.vfs_vptofh = chfs_vptofh,
 	.vfs_init = chfs_init,

Index: src/sys/ufs/chfs/chfs_vnode.c
diff -u src/sys/ufs/chfs/chfs_vnode.c:1.13 src/sys/ufs/chfs/chfs_vnode.c:1.14
--- src/sys/ufs/chfs/chfs_vnode.c:1.13	Sun Jan 11 17:28:22 2015
+++ src/sys/ufs/chfs/chfs_vnode.c	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs_vnode.c,v 1.13 2015/01/11 17:28:22 hannken Exp $	*/
+/*	$NetBSD: chfs_vnode.c,v 1.14 2015/01/11 17:29:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -244,7 +244,7 @@ chfs_makeinode(int mode, struct vnode *d
 	ip->target = NULL;
 
 	ip->mode = mode;
-	vp->v_type = type;		/* Rest init'd in getnewvnode(). */
+	vp->v_type = type;		/* Rest init'd in chfs_loadvnode(). */
 	ip->ch_type = VTTOCHT(vp->v_type);
 
 	/* authorize setting SGID if needed */

Index: src/sys/ufs/chfs/chfs_vnops.c
diff -u src/sys/ufs/chfs/chfs_vnops.c:1.23 src/sys/ufs/chfs/chfs_vnops.c:1.24
--- src/sys/ufs/chfs/chfs_vnops.c:1.23	Sun Jan 11 17:27:54 2015
+++ src/sys/ufs/chfs/chfs_vnops.c	Sun Jan 11 17:29:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs_vnops.c,v 1.23 2015/01/11 17:27:54 hannken Exp $	*/
+/*	$NetBSD: chfs_vnops.c,v 1.24 2015/01/11 17:29:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -1514,11 +1514,11 @@ chfs_reclaim(void *v)
 	}
 
 	cache_purge(vp);
+	vcache_remove(vp->v_mount, &ip->ino, sizeof(ip->ino));
 	if (ip->devvp) {
 		vrele(ip->devvp);
 		ip->devvp = 0;
 	}
-	chfs_ihashrem(ip);
 
 	genfs_node_destroy(vp);
 	pool_put(&chfs_inode_pool, vp->v_data);

Reply via email to