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);