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/77637167e201
branches: trunk
changeset: 805666:77637167e201
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 350dfec7d245 -r 77637167e201 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 350dfec7d245 -r 77637167e201 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 350dfec7d245 -r 77637167e201 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 350dfec7d245 -r 77637167e201 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 350dfec7d245 -r 77637167e201 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