Module Name: src
Committed By: hannken
Date: Sun May 25 13:51:26 UTC 2014
Modified Files:
src/sys/miscfs/genfs: layer.h layer_extern.h layer_subr.c
layer_vfsops.c layer_vnops.c
src/sys/miscfs/nullfs: null_vfsops.c
src/sys/miscfs/overlay: overlay_vfsops.c
src/sys/miscfs/umapfs: umap_vfsops.c
src/sys/sys: vnode.h
Log Message:
Change layerfs from hashlist to vcache.
Make VI_LOCKSHARE public again.
Ride 6.99.43
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/miscfs/genfs/layer.h
cvs rdiff -u -r1.35 -r1.36 src/sys/miscfs/genfs/layer_extern.h \
src/sys/miscfs/genfs/layer_subr.c
cvs rdiff -u -r1.43 -r1.44 src/sys/miscfs/genfs/layer_vfsops.c
cvs rdiff -u -r1.57 -r1.58 src/sys/miscfs/genfs/layer_vnops.c
cvs rdiff -u -r1.88 -r1.89 src/sys/miscfs/nullfs/null_vfsops.c
cvs rdiff -u -r1.61 -r1.62 src/sys/miscfs/overlay/overlay_vfsops.c
cvs rdiff -u -r1.92 -r1.93 src/sys/miscfs/umapfs/umap_vfsops.c
cvs rdiff -u -r1.247 -r1.248 src/sys/sys/vnode.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/miscfs/genfs/layer.h
diff -u src/sys/miscfs/genfs/layer.h:1.14 src/sys/miscfs/genfs/layer.h:1.15
--- src/sys/miscfs/genfs/layer.h:1.14 Sun Jun 6 08:01:31 2010
+++ src/sys/miscfs/genfs/layer.h Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: layer.h,v 1.14 2010/06/06 08:01:31 hannken Exp $ */
+/* $NetBSD: layer.h,v 1.15 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -78,10 +78,6 @@ struct layer_args {
#ifdef _KERNEL
-struct layer_node;
-
-LIST_HEAD(layer_node_hashhead, layer_node);
-
struct layer_mount {
struct mount *layerm_vfs;
struct vnode *layerm_rootvp; /* Ref to root layer_node */
@@ -90,15 +86,8 @@ struct layer_mount {
enum vtype layerm_tag; /* vtag of our vnodes */
int /* bypass routine for this mount */
(*layerm_bypass)(void *);
- int (*layerm_alloc) /* alloc a new layer node */
- (struct mount *, struct vnode *,
- struct vnode **);
int (**layerm_vnodeop_p) /* ops for our nodes */
(void *);
- struct layer_node_hashhead /* head of hash list for layer_nodes */
- *layerm_node_hashtbl;
- u_long layerm_node_hash; /* hash mask for hash chain */
- kmutex_t layerm_hashlock; /* interlock for hash chain. */
};
#define LAYERFS_MFLAGS 0x00000fff /* reserved layer mount flags */
@@ -108,7 +97,6 @@ struct layer_mount {
* A cache of vnode references
*/
struct layer_node {
- LIST_ENTRY(layer_node) layer_hash; /* Hash list */
struct vnode *layer_lowervp; /* VREFed once */
struct vnode *layer_vnode; /* Back pointer */
unsigned int layer_flags; /* locking, etc. */
Index: src/sys/miscfs/genfs/layer_extern.h
diff -u src/sys/miscfs/genfs/layer_extern.h:1.35 src/sys/miscfs/genfs/layer_extern.h:1.36
--- src/sys/miscfs/genfs/layer_extern.h:1.35 Thu Feb 27 16:51:38 2014
+++ src/sys/miscfs/genfs/layer_extern.h Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: layer_extern.h,v 1.35 2014/02/27 16:51:38 hannken Exp $ */
+/* $NetBSD: layer_extern.h,v 1.36 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -76,14 +76,7 @@
/* Routines to manage nodes. */
void layerfs_init(void);
void layerfs_done(void);
-int layer_node_alloc(struct mount *, struct vnode *, struct vnode **);
int layer_node_create(struct mount *, struct vnode *, struct vnode **);
-struct vnode *layer_node_find(struct mount *, struct vnode *);
-
-#define LOG2_SIZEVNODE 7 /* log2(sizeof struct vnode) */
-#define LAYER_NHASH(lmp, vp) \
- (&((lmp)->layerm_node_hashtbl[(((u_long)vp)>>LOG2_SIZEVNODE) & \
- (lmp)->layerm_node_hash]))
/* VFS routines */
int layerfs_start(struct mount *, int);
@@ -91,6 +84,8 @@ int layerfs_root(struct mount *, struct
int layerfs_quotactl(struct mount *, struct quotactl_args *);
int layerfs_statvfs(struct mount *, struct statvfs *);
int layerfs_sync(struct mount *, int, struct kauth_cred *);
+int layerfs_loadvnode(struct mount *, struct vnode *,
+ const void *, size_t, const void **);
int layerfs_vget(struct mount *, ino_t, struct vnode **);
int layerfs_fhtovp(struct mount *, struct fid *, struct vnode **);
int layerfs_vptofh(struct vnode *, struct fid *, size_t *);
Index: src/sys/miscfs/genfs/layer_subr.c
diff -u src/sys/miscfs/genfs/layer_subr.c:1.35 src/sys/miscfs/genfs/layer_subr.c:1.36
--- src/sys/miscfs/genfs/layer_subr.c:1.35 Mon Feb 10 11:23:14 2014
+++ src/sys/miscfs/genfs/layer_subr.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: layer_subr.c,v 1.35 2014/02/10 11:23:14 hannken Exp $ */
+/* $NetBSD: layer_subr.c,v 1.36 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -69,7 +69,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_subr.c,v 1.35 2014/02/10 11:23:14 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_subr.c,v 1.36 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -81,7 +81,6 @@ __KERNEL_RCSID(0, "$NetBSD: layer_subr.c
#include <sys/kmem.h>
#include <sys/malloc.h>
-#include <miscfs/specfs/specdev.h>
#include <miscfs/genfs/layer.h>
#include <miscfs/genfs/layer_extern.h>
@@ -110,156 +109,18 @@ layerfs_done(void)
}
/*
- * layer_node_find: find and return alias for lower vnode or NULL.
- *
- * => Return alias vnode referenced. if already exists.
- * => The layermp's hashlock must be held on entry, we will unlock on success.
- */
-struct vnode *
-layer_node_find(struct mount *mp, struct vnode *lowervp)
-{
- struct layer_mount *lmp = MOUNTTOLAYERMOUNT(mp);
- struct layer_node_hashhead *hd;
- struct layer_node *a;
- struct vnode *vp;
- int error;
-
- /*
- * Find hash bucket and search the (two-way) linked list looking
- * for a layerfs node structure which is referencing the lower vnode.
- * If found, the increment the layer_node reference count, but NOT
- * the lower vnode's reference counter.
- */
- KASSERT(mutex_owned(&lmp->layerm_hashlock));
- hd = LAYER_NHASH(lmp, lowervp);
-loop:
- LIST_FOREACH(a, hd, layer_hash) {
- if (a->layer_lowervp != lowervp) {
- continue;
- }
- vp = LAYERTOV(a);
- if (vp->v_mount != mp) {
- continue;
- }
- mutex_enter(vp->v_interlock);
- mutex_exit(&lmp->layerm_hashlock);
- error = vget(vp, 0);
- if (error) {
- mutex_enter(&lmp->layerm_hashlock);
- goto loop;
- }
- return vp;
- }
- return NULL;
-}
-
-/*
- * layer_node_alloc: make a new layerfs vnode.
- *
- * => vp is the alias vnode, lowervp is the lower vnode.
- * => We will hold a reference to lowervp.
- */
-int
-layer_node_alloc(struct mount *mp, struct vnode *lowervp, struct vnode **vpp)
-{
- struct layer_mount *lmp = MOUNTTOLAYERMOUNT(mp);
- struct layer_node_hashhead *hd;
- struct layer_node *xp;
- struct vnode *vp, *nvp;
- int error;
-
- /* Get a new vnode and share its interlock with underlying vnode. */
- error = getnewvnode(lmp->layerm_tag, mp, lmp->layerm_vnodeop_p,
- lowervp->v_interlock, &vp);
- if (error) {
- return error;
- }
- vp->v_type = lowervp->v_type;
- mutex_enter(vp->v_interlock);
- vp->v_iflag |= VI_LAYER;
- mutex_exit(vp->v_interlock);
-
- xp = kmem_alloc(lmp->layerm_size, KM_SLEEP);
- if (xp == NULL) {
- ungetnewvnode(vp);
- return ENOMEM;
- }
- if (vp->v_type == VBLK || vp->v_type == VCHR) {
- spec_node_init(vp, lowervp->v_rdev);
- }
-
- /*
- * Before inserting the node into the hash, check if other thread
- * did not race with us. If so - return that node, destroy ours.
- */
- mutex_enter(&lmp->layerm_hashlock);
- if ((nvp = layer_node_find(mp, lowervp)) != NULL) {
- ungetnewvnode(vp);
- kmem_free(xp, lmp->layerm_size);
- *vpp = nvp;
- return 0;
- }
-
- vp->v_data = xp;
- vp->v_vflag = (vp->v_vflag & ~VV_MPSAFE) |
- (lowervp->v_vflag & VV_MPSAFE);
- xp->layer_vnode = vp;
- xp->layer_lowervp = lowervp;
- xp->layer_flags = 0;
-
- /*
- * Insert the new node into the hash.
- * Add a reference to the lower node.
- */
- vref(lowervp);
- hd = LAYER_NHASH(lmp, lowervp);
- LIST_INSERT_HEAD(hd, xp, layer_hash);
- uvm_vnp_setsize(vp, 0);
- mutex_exit(&lmp->layerm_hashlock);
-
- *vpp = vp;
- return 0;
-}
-
-/*
* layer_node_create: try to find an existing layerfs vnode refering to it,
* otherwise make a new vnode which contains a reference to the lower vnode.
- *
- * => Caller should lock the lower node.
*/
int
layer_node_create(struct mount *mp, struct vnode *lowervp, struct vnode **nvpp)
{
+ int error;
struct vnode *aliasvp;
- struct layer_mount *lmp = MOUNTTOLAYERMOUNT(mp);
- mutex_enter(&lmp->layerm_hashlock);
- aliasvp = layer_node_find(mp, lowervp);
- if (aliasvp != NULL) {
- /*
- * Note: layer_node_find() has taken another reference to
- * the alias vnode and moved the lock holding to aliasvp.
- */
-#ifdef LAYERFS_DIAGNOSTIC
- if (layerfs_debug)
- vprint("layer_node_create: exists", aliasvp);
-#endif
- } else {
- int error;
-
- mutex_exit(&lmp->layerm_hashlock);
- /*
- * Get a new vnode. Make it to reference the layer_node.
- * Note: aliasvp will be return with the reference held.
- */
- error = (lmp->layerm_alloc)(mp, lowervp, &aliasvp);
- if (error)
- return error;
-#ifdef LAYERFS_DIAGNOSTIC
- if (layerfs_debug)
- printf("layer_node_create: create new alias vnode\n");
-#endif
- }
+ error = vcache_get(mp, &lowervp, sizeof(lowervp), &aliasvp);
+ if (error)
+ return error;
/*
* Now that we acquired a reference on the upper vnode, release one
Index: src/sys/miscfs/genfs/layer_vfsops.c
diff -u src/sys/miscfs/genfs/layer_vfsops.c:1.43 src/sys/miscfs/genfs/layer_vfsops.c:1.44
--- src/sys/miscfs/genfs/layer_vfsops.c:1.43 Tue Feb 25 18:30:11 2014
+++ src/sys/miscfs/genfs/layer_vfsops.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: layer_vfsops.c,v 1.43 2014/02/25 18:30:11 pooka Exp $ */
+/* $NetBSD: layer_vfsops.c,v 1.44 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -74,7 +74,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.43 2014/02/25 18:30:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.44 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/sysctl.h>
@@ -86,6 +86,7 @@ __KERNEL_RCSID(0, "$NetBSD: layer_vfsops
#include <sys/kauth.h>
#include <sys/module.h>
+#include <miscfs/specfs/specdev.h>
#include <miscfs/genfs/layer.h>
#include <miscfs/genfs/layer_extern.h>
@@ -204,6 +205,43 @@ layerfs_sync(struct mount *mp, int waitf
}
int
+layerfs_loadvnode(struct mount *mp, struct vnode *vp,
+ const void *key, size_t key_len, const void **new_key)
+{
+ struct layer_mount *lmp = MOUNTTOLAYERMOUNT(mp);
+ struct vnode *lowervp;
+ struct layer_node *xp;
+
+ KASSERT(key_len == sizeof(struct vnode *));
+ memcpy(&lowervp, key, key_len);
+
+ xp = kmem_alloc(lmp->layerm_size, KM_SLEEP);
+ if (xp == NULL)
+ return ENOMEM;
+
+ /* Share the interlock with the lower node. */
+ mutex_obj_hold(lowervp->v_interlock);
+ uvm_obj_setlock(&vp->v_uobj, lowervp->v_interlock);
+ vp->v_iflag |= VI_LAYER | VI_LOCKSHARE;
+
+ vp->v_tag = lmp->layerm_tag;
+ vp->v_type = lowervp->v_type;
+ vp->v_op = lmp->layerm_vnodeop_p;
+ if (vp->v_type == VBLK || vp->v_type == VCHR)
+ spec_node_init(vp, lowervp->v_rdev);
+ vp->v_data = xp;
+ xp->layer_vnode = vp;
+ xp->layer_lowervp = lowervp;
+ xp->layer_flags = 0;
+ uvm_vnp_setsize(vp, 0);
+
+ /* Add a reference to the lower node. */
+ vref(lowervp);
+ *new_key = &xp->layer_lowervp;
+ return 0;
+}
+
+int
layerfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
{
struct vnode *vp;
Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.57 src/sys/miscfs/genfs/layer_vnops.c:1.58
--- src/sys/miscfs/genfs/layer_vnops.c:1.57 Mon Mar 24 13:42:40 2014
+++ src/sys/miscfs/genfs/layer_vnops.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: layer_vnops.c,v 1.57 2014/03/24 13:42:40 hannken Exp $ */
+/* $NetBSD: layer_vnops.c,v 1.58 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -170,7 +170,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.57 2014/03/24 13:42:40 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.58 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -694,11 +694,9 @@ layer_reclaim(void *v)
*/
lmp->layerm_rootvp = NULL;
}
+ vcache_remove(vp->v_mount, &lowervp, sizeof(lowervp));
/* After this assignment, this node will not be re-used. */
xp->layer_lowervp = NULL;
- mutex_enter(&lmp->layerm_hashlock);
- LIST_REMOVE(xp, layer_hash);
- mutex_exit(&lmp->layerm_hashlock);
kmem_free(vp->v_data, lmp->layerm_size);
vp->v_data = NULL;
vrele(lowervp);
Index: src/sys/miscfs/nullfs/null_vfsops.c
diff -u src/sys/miscfs/nullfs/null_vfsops.c:1.88 src/sys/miscfs/nullfs/null_vfsops.c:1.89
--- src/sys/miscfs/nullfs/null_vfsops.c:1.88 Wed Apr 16 18:55:19 2014
+++ src/sys/miscfs/nullfs/null_vfsops.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: null_vfsops.c,v 1.88 2014/04/16 18:55:19 maxv Exp $ */
+/* $NetBSD: null_vfsops.c,v 1.89 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999 National Aeronautics & Space Administration
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: null_vfsops.c,v 1.88 2014/04/16 18:55:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: null_vfsops.c,v 1.89 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -154,19 +154,13 @@ nullfs_mount(struct mount *mp, const cha
nmp->nullm_size = sizeof(struct null_node);
nmp->nullm_tag = VT_NULL;
nmp->nullm_bypass = layer_bypass;
- nmp->nullm_alloc = layer_node_alloc; /* the default alloc is fine */
nmp->nullm_vnodeop_p = null_vnodeop_p;
- mutex_init(&nmp->nullm_hashlock, MUTEX_DEFAULT, IPL_NONE);
- nmp->nullm_node_hashtbl = hashinit(desiredvnodes, HASH_LIST, true,
- &nmp->nullm_node_hash);
/* Setup a null node for root vnode. */
VOP_UNLOCK(lowerrootvp);
error = layer_node_create(mp, lowerrootvp, &vp);
if (error) {
vrele(lowerrootvp);
- hashdone(nmp->nullm_node_hashtbl, HASH_LIST,
- nmp->nullm_node_hash);
kmem_free(nmp, sizeof(struct null_mount));
return error;
}
@@ -205,8 +199,6 @@ nullfs_unmount(struct mount *mp, int mnt
vgone(null_rootvp);
/* Finally, destroy the mount point structures. */
- hashdone(nmp->nullm_node_hashtbl, HASH_LIST, nmp->nullm_node_hash);
- mutex_destroy(&nmp->nullm_hashlock);
kmem_free(mp->mnt_data, sizeof(struct null_mount));
mp->mnt_data = NULL;
return 0;
@@ -229,6 +221,7 @@ struct vfsops nullfs_vfsops = {
.vfs_quotactl = layerfs_quotactl,
.vfs_statvfs = layerfs_statvfs,
.vfs_sync = layerfs_sync,
+ .vfs_loadvnode = layerfs_loadvnode,
.vfs_vget = layerfs_vget,
.vfs_fhtovp = layerfs_fhtovp,
.vfs_vptofh = layerfs_vptofh,
Index: src/sys/miscfs/overlay/overlay_vfsops.c
diff -u src/sys/miscfs/overlay/overlay_vfsops.c:1.61 src/sys/miscfs/overlay/overlay_vfsops.c:1.62
--- src/sys/miscfs/overlay/overlay_vfsops.c:1.61 Wed Apr 16 18:55:19 2014
+++ src/sys/miscfs/overlay/overlay_vfsops.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: overlay_vfsops.c,v 1.61 2014/04/16 18:55:19 maxv Exp $ */
+/* $NetBSD: overlay_vfsops.c,v 1.62 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1999, 2000 National Aeronautics & Space Administration
@@ -74,7 +74,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: overlay_vfsops.c,v 1.61 2014/04/16 18:55:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: overlay_vfsops.c,v 1.62 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -163,11 +163,7 @@ ov_mount(struct mount *mp, const char *p
nmp->ovm_size = sizeof (struct overlay_node);
nmp->ovm_tag = VT_OVERLAY;
nmp->ovm_bypass = layer_bypass;
- nmp->ovm_alloc = layer_node_alloc; /* the default alloc is fine */
nmp->ovm_vnodeop_p = overlay_vnodeop_p;
- mutex_init(&nmp->ovm_hashlock, MUTEX_DEFAULT, IPL_NONE);
- nmp->ovm_node_hashtbl = hashinit(NOVERLAYNODECACHE, HASH_LIST, true,
- &nmp->ovm_node_hash);
/*
* Fix up overlay node for root vnode
@@ -179,7 +175,6 @@ ov_mount(struct mount *mp, const char *p
*/
if (error) {
vrele(lowerrootvp);
- hashdone(nmp->ovm_node_hashtbl, HASH_LIST, nmp->ovm_node_hash);
kmem_free(nmp, sizeof(struct overlay_mount));
return error;
}
@@ -236,8 +231,6 @@ ov_unmount(struct mount *mp, int mntflag
* Finally, throw away the overlay_mount structure
*/
omp = mp->mnt_data;
- mutex_destroy(&omp->ovm_hashlock);
- hashdone(omp->ovm_node_hashtbl, HASH_LIST, omp->ovm_node_hash);
kmem_free(omp, sizeof(struct overlay_mount));
mp->mnt_data = NULL;
return 0;
@@ -260,6 +253,7 @@ struct vfsops overlay_vfsops = {
.vfs_quotactl = layerfs_quotactl,
.vfs_statvfs = layerfs_statvfs,
.vfs_sync = layerfs_sync,
+ .vfs_loadvnode = layerfs_loadvnode,
.vfs_vget = layerfs_vget,
.vfs_fhtovp = layerfs_fhtovp,
.vfs_vptofh = layerfs_vptofh,
Index: src/sys/miscfs/umapfs/umap_vfsops.c
diff -u src/sys/miscfs/umapfs/umap_vfsops.c:1.92 src/sys/miscfs/umapfs/umap_vfsops.c:1.93
--- src/sys/miscfs/umapfs/umap_vfsops.c:1.92 Wed Apr 16 18:55:19 2014
+++ src/sys/miscfs/umapfs/umap_vfsops.c Sun May 25 13:51:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: umap_vfsops.c,v 1.92 2014/04/16 18:55:19 maxv Exp $ */
+/* $NetBSD: umap_vfsops.c,v 1.93 2014/05/25 13:51:25 hannken Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umap_vfsops.c,v 1.92 2014/04/16 18:55:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umap_vfsops.c,v 1.93 2014/05/25 13:51:25 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -197,12 +197,7 @@ umapfs_mount(struct mount *mp, const cha
amp->umapm_size = sizeof(struct umap_node);
amp->umapm_tag = VT_UMAP;
amp->umapm_bypass = umap_bypass;
- amp->umapm_alloc = layer_node_alloc; /* the default alloc is fine */
amp->umapm_vnodeop_p = umap_vnodeop_p;
- mutex_init(&->umapm_hashlock, MUTEX_DEFAULT, IPL_NONE);
- amp->umapm_node_hashtbl = hashinit(NUMAPNODECACHE, HASH_LIST, true,
- &->umapm_node_hash);
-
/*
* fix up umap node for root vnode.
@@ -214,8 +209,6 @@ umapfs_mount(struct mount *mp, const cha
*/
if (error) {
vrele(lowerrootvp);
- hashdone(amp->umapm_node_hashtbl, HASH_LIST,
- amp->umapm_node_hash);
kmem_free(amp, sizeof(struct umap_mount));
return error;
}
@@ -271,8 +264,6 @@ umapfs_unmount(struct mount *mp, int mnt
/*
* Finally, throw away the umap_mount structure
*/
- mutex_destroy(&->umapm_hashlock);
- hashdone(amp->umapm_node_hashtbl, HASH_LIST, amp->umapm_node_hash);
kmem_free(amp, sizeof(struct umap_mount));
mp->mnt_data = NULL;
return 0;
@@ -295,6 +286,7 @@ struct vfsops umapfs_vfsops = {
.vfs_quotactl = layerfs_quotactl,
.vfs_statvfs = layerfs_statvfs,
.vfs_sync = layerfs_sync,
+ .vfs_loadvnode = layerfs_loadvnode,
.vfs_vget = layerfs_vget,
.vfs_fhtovp = layerfs_fhtovp,
.vfs_vptofh = layerfs_vptofh,
Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.247 src/sys/sys/vnode.h:1.248
--- src/sys/sys/vnode.h:1.247 Thu May 8 08:21:53 2014
+++ src/sys/sys/vnode.h Sun May 25 13:51:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.h,v 1.247 2014/05/08 08:21:53 hannken Exp $ */
+/* $NetBSD: vnode.h,v 1.248 2014/05/25 13:51:26 hannken Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -207,8 +207,8 @@ typedef struct vnode vnode_t;
#define VI_MARKER 0x00008000 /* Dummy marker vnode */
#endif /* _VFS_VNODE_PRIVATE */
#define VI_LAYER 0x00020000 /* vnode is on a layer filesystem */
-#ifdef _VFS_VNODE_PRIVATE
#define VI_LOCKSHARE 0x00040000 /* v_interlock is shared */
+#ifdef _VFS_VNODE_PRIVATE
#define VI_CLEAN 0x00080000 /* has been reclaimed */
#define VI_CHANGING 0x00100000 /* vnode changes state */
#endif /* _VFS_VNODE_PRIVATE */