Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/fs/filecorefs Change filecore to vcache.
details: https://anonhg.NetBSD.org/src/rev/d424df446a54
branches: trunk
changeset: 332697:d424df446a54
user: hannken <hannken%NetBSD.org@localhost>
date: Sat Oct 04 13:27:24 2014 +0000
description:
Change filecore to vcache.
Compile-tested only, was not able to get my hands on a readable fs image.
diffstat:
sys/fs/filecorefs/filecore_lookup.c | 60 ++----------
sys/fs/filecorefs/filecore_node.c | 161 +++++++++++++++++------------------
sys/fs/filecorefs/filecore_node.h | 8 +-
sys/fs/filecorefs/filecore_vfsops.c | 119 ++------------------------
4 files changed, 104 insertions(+), 244 deletions(-)
diffs (truncated from 518 to 300 lines):
diff -r f043592845a4 -r d424df446a54 sys/fs/filecorefs/filecore_lookup.c
--- a/sys/fs/filecorefs/filecore_lookup.c Sat Oct 04 13:18:34 2014 +0000
+++ b/sys/fs/filecorefs/filecore_lookup.c Sat Oct 04 13:27:24 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: filecore_lookup.c,v 1.20 2014/06/03 19:30:30 joerg Exp $ */
+/* $NetBSD: filecore_lookup.c,v 1.21 2014/10/04 13:27:24 hannken Exp $ */
/*-
* Copyright (c) 1989, 1993, 1994 The Regents of the University of California.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: filecore_lookup.c,v 1.20 2014/06/03 19:30:30 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: filecore_lookup.c,v 1.21 2014/10/04 13:27:24 hannken Exp $");
#include <sys/param.h>
#include <sys/namei.h>
@@ -128,8 +128,6 @@
struct buf *bp; /* a buffer of directory entries */
struct filecore_direntry *de;
int numdirpasses; /* strategy for directory search */
- struct vnode *pdp; /* saved dp during symlink work */
- struct vnode *tdp; /* returned by filecore_vget_internal */
int error;
u_short namelen;
int res;
@@ -259,54 +257,24 @@
if ((flags & ISLASTCN) && nameiop == LOOKUP)
dp->i_diroff = i;
- /*
- * Step through the translation in the name. We do not `iput' the
- * directory because we may need it again if a symbolic link
- * is relative to the current directory. Instead we save it
- * unlocked as "pdp". We must get the target inode before unlocking
- * the directory to insure that the inode will not be removed
- * before we get it. We prevent deadlock by always fetching
- * inodes from the root, moving down the directory tree. Thus
- * when following backward pointers ".." we must unlock the
- * parent directory before getting the requested directory.
- * There is a potential race condition here if both the current
- * and parent directories are removed before the `iget' for the
- * inode associated with ".." returns. We hope that this occurs
- * infrequently since we cannot avoid this race condition without
- * implementing a sophisticated deadlock detection algorithm.
- * Note also that this simple deadlock detection scheme will not
- * work if the file system has any hard links other than ".."
- * that point backwards in the directory structure.
- */
- pdp = vdp;
-
- /*
- * If ino is different from dp->i_ino,
- * it's a relocated directory.
- */
- if (flags & ISDOTDOT) {
- ino_t pin = filecore_getparent(dp);
-
- VOP_UNLOCK(pdp); /* race to get the inode */
- error = VFS_VGET(vdp->v_mount, pin, &tdp);
- vn_lock(pdp, LK_EXCLUSIVE | LK_RETRY);
- if (error) {
- return error;
- }
- *vpp = tdp;
- } else if (name[0] == '.' && namelen == 1) {
+ if (name[0] == '.' && namelen == 1) {
vref(vdp); /* we want ourself, ie "." */
*vpp = vdp;
} else {
+ ino_t ino;
+
+ if (flags & ISDOTDOT) {
+ ino = filecore_getparent(dp);
+ } else {
+ ino = dp->i_dirent.addr | (i << FILECORE_INO_INDEX);
#ifdef FILECORE_DEBUG_BR
printf("brelse(%p) lo4\n", bp);
#endif
- brelse(bp, 0);
- error = VFS_VGET(vdp->v_mount, dp->i_dirent.addr |
- (i << FILECORE_INO_INDEX), &tdp);
+ brelse(bp, 0);
+ }
+ error = vcache_get(vdp->v_mount, &ino, sizeof(ino), vpp);
if (error)
- return (error);
- *vpp = tdp;
+ return error;
}
/*
@@ -314,7 +282,5 @@
*/
cache_enter(vdp, *vpp, cnp->cn_nameptr, cnp->cn_namelen,
cnp->cn_flags);
- if (*vpp != vdp)
- VOP_UNLOCK(*vpp);
return 0;
}
diff -r f043592845a4 -r d424df446a54 sys/fs/filecorefs/filecore_node.c
--- a/sys/fs/filecorefs/filecore_node.c Sat Oct 04 13:18:34 2014 +0000
+++ b/sys/fs/filecorefs/filecore_node.c Sat Oct 04 13:27:24 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: filecore_node.c,v 1.26 2014/02/27 16:51:38 hannken Exp $ */
+/* $NetBSD: filecore_node.c,v 1.27 2014/10/04 13:27:24 hannken Exp $ */
/*-
* Copyright (c) 1982, 1986, 1989, 1994
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: filecore_node.c,v 1.26 2014/02/27 16:51:38 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: filecore_node.c,v 1.27 2014/10/04 13:27:24 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -87,19 +87,14 @@
#include <fs/filecorefs/filecore_node.h>
#include <fs/filecorefs/filecore_mount.h>
-/*
- * Structures associated with filecore_node caching.
- */
-static LIST_HEAD(ihashhead, filecore_node) *filecorehashtbl;
-static u_long filecorehash;
-
-#define INOHASH(device, inum) (((device) + ((inum)>>12)) & filecorehash)
-
-static kmutex_t filecore_ihash_lock;
struct pool filecore_node_pool;
extern int prtactive; /* 1 => print out reclaim of active vnodes */
+static const struct genfs_ops filecore_genfsops = {
+ .gop_size = genfs_size,
+};
+
/*
* Initialize hash links for inodes and dnodes.
*/
@@ -107,11 +102,8 @@
filecore_init(void)
{
- mutex_init(&filecore_ihash_lock, MUTEX_DEFAULT, IPL_NONE);
pool_init(&filecore_node_pool, sizeof(struct filecore_node), 0, 0, 0,
"filecrnopl", &pool_allocator_nointr, IPL_NONE);
- filecorehashtbl = hashinit(desiredvnodes, HASH_LIST, true,
- &filecorehash);
}
/*
@@ -120,27 +112,7 @@
void
filecore_reinit(void)
{
- struct filecore_node *ip;
- struct ihashhead *oldhash, *hash;
- u_long oldmask, mask, val;
- int i;
- hash = hashinit(desiredvnodes, HASH_LIST, true, &mask);
-
- mutex_enter(&filecore_ihash_lock);
- oldhash = filecorehashtbl;
- oldmask = filecorehash;
- filecorehashtbl = hash;
- filecorehash = mask;
- for (i = 0; i <= oldmask; i++) {
- while ((ip = LIST_FIRST(&oldhash[i])) != NULL) {
- LIST_REMOVE(ip, i_hash);
- val = INOHASH(ip->i_dev, ip->i_number);
- LIST_INSERT_HEAD(&hash[val], ip, i_hash);
- }
- }
- mutex_exit(&filecore_ihash_lock);
- hashdone(oldhash, HASH_LIST, oldmask);
}
/*
@@ -150,64 +122,88 @@
filecore_done(void)
{
- hashdone(filecorehashtbl, HASH_LIST, filecorehash);
pool_destroy(&filecore_node_pool);
- mutex_destroy(&filecore_ihash_lock);
}
/*
- * 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.
+ * Initialize this vnode / filecore node pair.
+ * Caller assures no other thread will try to load this node.
*/
-struct vnode *
-filecore_ihashget(dev_t dev, ino_t inum)
+int
+filecore_loadvnode(struct mount *mp, struct vnode *vp,
+ const void *key, size_t key_len, const void **new_key)
{
+ ino_t ino;
+ struct filecore_mnt *fcmp;
struct filecore_node *ip;
- struct vnode *vp;
+ struct buf *bp;
+ int error;
+
+ KASSERT(key_len == sizeof(ino));
+ memcpy(&ino, key, key_len);
+ fcmp = VFSTOFILECORE(mp);
-loop:
- mutex_enter(&filecore_ihash_lock);
- LIST_FOREACH(ip, &filecorehashtbl[INOHASH(dev, inum)], i_hash) {
- if (inum == ip->i_number && dev == ip->i_dev) {
- vp = ITOV(ip);
- mutex_enter(vp->v_interlock);
- mutex_exit(&filecore_ihash_lock);
- if (vget(vp, LK_EXCLUSIVE))
- goto loop;
- return (vp);
- }
- }
- mutex_exit(&filecore_ihash_lock);
- return (NULL);
-}
+ ip = pool_get(&filecore_node_pool, PR_WAITOK);
+ memset(ip, 0, sizeof(struct filecore_node));
+ ip->i_vnode = vp;
+ ip->i_dev = fcmp->fc_dev;
+ ip->i_number = ino;
+ ip->i_block = -1;
+ ip->i_parent = -2;
+
+ if (ino == FILECORE_ROOTINO) {
+ /* Here we need to construct a root directory inode */
+ memcpy(ip->i_dirent.name, "root", 4);
+ ip->i_dirent.load = 0;
+ ip->i_dirent.exec = 0;
+ ip->i_dirent.len = FILECORE_DIR_SIZE;
+ ip->i_dirent.addr = fcmp->drec.root;
+ ip->i_dirent.attr = FILECORE_ATTR_DIR | FILECORE_ATTR_READ;
-/*
- * Insert the inode into the hash table, and return it locked.
- */
-void
-filecore_ihashins(struct filecore_node *ip)
-{
- struct ihashhead *ipp;
- int error __diagused;
+ } else {
+ /* Read in Data from Directory Entry */
+ if ((error = filecore_bread(fcmp, ino & FILECORE_INO_MASK,
+ FILECORE_DIR_SIZE, NOCRED, &bp)) != 0) {
+ pool_put(&filecore_node_pool, ip);
+ return error;
+ }
- mutex_enter(&filecore_ihash_lock);
- ipp = &filecorehashtbl[INOHASH(ip->i_dev, ip->i_number)];
- LIST_INSERT_HEAD(ipp, ip, i_hash);
- mutex_exit(&filecore_ihash_lock);
+ memcpy(&ip->i_dirent,
+ fcdirentry(bp->b_data, ino >> FILECORE_INO_INDEX),
+ sizeof(struct filecore_direntry));
+#ifdef FILECORE_DEBUG_BR
+ printf("brelse(%p) vf5\n", bp);
+#endif
+ brelse(bp, 0);
+ }
+
+ ip->i_mnt = fcmp;
+ ip->i_devvp = fcmp->fc_devvp;
+ ip->i_diroff = 0;
+ vref(ip->i_devvp);
- error = VOP_LOCK(ITOV(ip), LK_EXCLUSIVE);
- KASSERT(error == 0);
-}
+ /*
+ * Initialize the associated vnode
+ */
-/*
- * Remove the inode from the hash table.
- */
-void
-filecore_ihashrem(struct filecore_node *ip)
-{
- mutex_enter(&filecore_ihash_lock);
- LIST_REMOVE(ip, i_hash);
- mutex_exit(&filecore_ihash_lock);
+ vp->v_tag = VT_FILECORE;
+ vp->v_op = filecore_vnodeop_p;
+ vp->v_data = ip;
Home |
Main Index |
Thread Index |
Old Index