Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Change chfs from hashlist to vcache.



details:   https://anonhg.NetBSD.org/src/rev/8f5a5f928f67
branches:  trunk
changeset: 335524:8f5a5f928f67
user:      hannken <hannken%NetBSD.org@localhost>
date:      Sun Jan 11 17:29:57 2015 +0000

description:
Change chfs from hashlist to vcache.

diffstat:

 sys/modules/chfs/Makefile  |    4 +-
 sys/ufs/chfs/chfs.h        |   14 +--
 sys/ufs/chfs/chfs_ihash.c  |  214 ---------------------------------------------
 sys/ufs/chfs/chfs_inode.h  |    4 +-
 sys/ufs/chfs/chfs_vfsops.c |  110 +++++++++++-----------
 sys/ufs/chfs/chfs_vnode.c  |    4 +-
 sys/ufs/chfs/chfs_vnops.c  |    4 +-
 sys/ufs/files.ufs          |    3 +-
 8 files changed, 62 insertions(+), 295 deletions(-)

diffs (truncated from 578 to 300 lines):

diff -r b22174ab5f7c -r 8f5a5f928f67 sys/modules/chfs/Makefile
--- a/sys/modules/chfs/Makefile Sun Jan 11 17:28:22 2015 +0000
+++ b/sys/modules/chfs/Makefile Sun Jan 11 17:29:57 2015 +0000
@@ -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
diff -r b22174ab5f7c -r 8f5a5f928f67 sys/ufs/chfs/chfs.h
--- a/sys/ufs/chfs/chfs.h       Sun Jan 11 17:28:22 2015 +0000
+++ b/sys/ufs/chfs/chfs.h       Sun Jan 11 17:29:57 2015 +0000
@@ -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 @@
 /* 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 *);
diff -r b22174ab5f7c -r 8f5a5f928f67 sys/ufs/chfs/chfs_ihash.c
--- a/sys/ufs/chfs/chfs_ihash.c Sun Jan 11 17:28:22 2015 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-/*     $NetBSD: chfs_ihash.c,v 1.3 2014/02/27 16:51:39 hannken Exp $   */
-
-/*-
- * Copyright (c) 2010 Department of Software Engineering,
- *                   University of Szeged, Hungary
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by the Department of Software Engineering, University of Szeged, Hungary
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "chfs.h"
-/*
- * Structures associated with inode cacheing.
- */
-static LIST_HEAD(ihashhead, chfs_inode) *chfs_ihashtbl;
-static u_long  chfs_ihash;             /* size of hash table - 1 */
-#define INOHASH(device, inum)  (((device) + (inum)) & chfs_ihash)
-
-kmutex_t       chfs_ihash_lock;
-kmutex_t       chfs_hashlock;
-
-/*
- * Initialize inode hash table.
- */
-void
-chfs_ihashinit(void)
-{
-       dbg("initing\n");
-
-       mutex_init(&chfs_hashlock, MUTEX_DEFAULT, IPL_NONE);
-       mutex_init(&chfs_ihash_lock, MUTEX_DEFAULT, IPL_NONE);
-       chfs_ihashtbl = hashinit(desiredvnodes,
-           HASH_LIST, true, &chfs_ihash);
-}
-
-/*
- * Reinitialize inode hash table.
- */
-
-void
-chfs_ihashreinit(void)
-{
-       struct chfs_inode *ip;
-       struct ihashhead *oldhash, *hash;
-       u_long oldmask, mask, val;
-       int i;
-
-       dbg("reiniting\n");
-
-       hash = hashinit(desiredvnodes, HASH_LIST, true, &mask);
-       mutex_enter(&chfs_ihash_lock);
-       oldhash = chfs_ihashtbl;
-       oldmask = chfs_ihash;
-       chfs_ihashtbl = hash;
-       chfs_ihash = mask;
-       for (i = 0; i <= oldmask; i++) {
-               while ((ip = LIST_FIRST(&oldhash[i])) != NULL) {
-                       LIST_REMOVE(ip, hash_entry);
-                       val = INOHASH(ip->dev, ip->ino);
-                       LIST_INSERT_HEAD(&hash[val], ip, hash_entry);
-               }
-       }
-       mutex_exit(&chfs_ihash_lock);
-       hashdone(oldhash, HASH_LIST, oldmask);
-}
-
-/*
- * Free inode hash table.
- */
-void
-chfs_ihashdone(void)
-{
-       dbg("destroying\n");
-
-       hashdone(chfs_ihashtbl, HASH_LIST, chfs_ihash);
-       mutex_destroy(&chfs_hashlock);
-       mutex_destroy(&chfs_ihash_lock);
-}
-
-/*
- * Use the device/inum pair to find the incore inode, and return a pointer
- * to it. If it is in core, return it, even if it is locked.
- */
-struct vnode *
-chfs_ihashlookup(dev_t dev, ino_t inum)
-{
-       struct chfs_inode *ip;
-       struct ihashhead *ipp;
-
-       dbg("dev: %ju, inum: %ju\n", (uintmax_t )dev, (uintmax_t )inum);
-
-       KASSERT(mutex_owned(&chfs_ihash_lock));
-
-       ipp = &chfs_ihashtbl[INOHASH(dev, inum)];
-       LIST_FOREACH(ip, ipp, hash_entry) {
-               if (inum == ip->ino && dev == ip->dev) {
-                       break;
-               }
-       }
-
-       if (ip) {
-               return (ITOV(ip));
-       }
-
-       return (NULLVP);
-}
-
-/*
- * Use the device/inum pair to find the incore inode, and return a pointer
- * to it. If it is in core, but locked, wait for it.
- */
-struct vnode *
-chfs_ihashget(dev_t dev, ino_t inum, int flags)
-{
-       struct ihashhead *ipp;
-       struct chfs_inode *ip;
-       struct vnode *vp;
-
-       dbg("search for ino\n");
-
-loop:
-       mutex_enter(&chfs_ihash_lock);
-       ipp = &chfs_ihashtbl[INOHASH(dev, inum)];
-       dbg("ipp: %p, chfs_ihashtbl: %p, ihash: %lu\n",
-           ipp, chfs_ihashtbl, chfs_ihash);
-       LIST_FOREACH(ip, ipp, hash_entry) {
-               dbg("ip: %p\n", ip);
-               if (inum == ip->ino && dev == ip->dev) {
-                       vp = ITOV(ip);
-                       KASSERT(vp != NULL);
-                       if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE) {
-                               mutex_exit(&chfs_ihash_lock);
-                               goto loop;
-                       }
-                       /*
-                       if (VOP_ISLOCKED(vp))
-                               dbg("locked\n");
-                       else
-                               dbg("isn't locked\n");
-                       */
-                       if (flags == 0) {
-                               mutex_exit(&chfs_ihash_lock);
-                       } else {
-                               mutex_enter(vp->v_interlock);
-                               mutex_exit(&chfs_ihash_lock);
-                               if (vget(vp, flags)) {
-                                       goto loop;
-                               }
-                       }
-                       return (vp);
-               }
-       }
-       mutex_exit(&chfs_ihash_lock);
-       return (NULL);
-}
-
-/*
- * Insert the inode into the hash table, and return it locked.
- */
-void
-chfs_ihashins(struct chfs_inode *ip)
-{
-       struct ihashhead *ipp;
-       int error __diagused;
-
-       dbg("ip: %p\n", ip);
-
-       KASSERT(mutex_owned(&chfs_hashlock));
-
-       /* lock the inode, then put it on the appropriate hash list */
-       error = VOP_LOCK(ITOV(ip), LK_EXCLUSIVE);
-       KASSERT(error == 0);
-
-       mutex_enter(&chfs_ihash_lock);
-       ipp = &chfs_ihashtbl[INOHASH(ip->dev, ip->ino)];
-       LIST_INSERT_HEAD(ipp, ip, hash_entry);
-       mutex_exit(&chfs_ihash_lock);
-}
-
-/*
- * Remove the inode from the hash table.
- */
-void
-chfs_ihashrem(struct chfs_inode *ip)
-{
-       dbg("ip: %p\n", ip);
-
-       mutex_enter(&chfs_ihash_lock);
-       LIST_REMOVE(ip, hash_entry);
-       mutex_exit(&chfs_ihash_lock);
-}
-
diff -r b22174ab5f7c -r 8f5a5f928f67 sys/ufs/chfs/chfs_inode.h
--- a/sys/ufs/chfs/chfs_inode.h Sun Jan 11 17:28:22 2015 +0000
+++ b/sys/ufs/chfs/chfs_inode.h Sun Jan 11 17:29:57 2015 +0000
@@ -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 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 */
 
diff -r b22174ab5f7c -r 8f5a5f928f67 sys/ufs/chfs/chfs_vfsops.c
--- a/sys/ufs/chfs/chfs_vfsops.c        Sun Jan 11 17:28:22 2015 +0000
+++ b/sys/ufs/chfs/chfs_vfsops.c        Sun Jan 11 17:29:57 2015 +0000
@@ -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 @@
 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 *);



Home | Main Index | Thread Index | Old Index