Change nilfs to vcache.
This commit is contained in:
parent
52473f33d5
commit
668c7daae4
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nilfs.h,v 1.4 2013/10/18 19:57:28 christos Exp $ */
|
||||
/* $NetBSD: nilfs.h,v 1.5 2014/10/15 09:05:46 hannken Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008, 2009 Reinoud Zandijk
|
||||
@ -172,11 +172,6 @@ struct nilfs_mount {
|
||||
/* instance values */
|
||||
struct nilfs_node *ifile_node;
|
||||
|
||||
/* hash table to lookup ino -> nilfs_node */
|
||||
kmutex_t ihash_lock;
|
||||
kmutex_t get_node_lock;
|
||||
LIST_HEAD(, nilfs_node) nilfs_nodes[NILFS_INODE_HASHSIZE];
|
||||
|
||||
/* lists */
|
||||
STAILQ_ENTRY(nilfs_mount) next_mount; /* in nilfs_device */
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nilfs_subr.c,v 1.11 2014/10/15 09:03:53 hannken Exp $ */
|
||||
/* $NetBSD: nilfs_subr.c,v 1.12 2014/10/15 09:05:46 hannken Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008, 2009 Reinoud Zandijk
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_subr.c,v 1.11 2014/10/15 09:03:53 hannken Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_subr.c,v 1.12 2014/10/15 09:05:46 hannken Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -125,13 +125,6 @@ crc32_le(uint32_t crc, const uint8_t *buf, size_t len)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
nilfs_calchash(uint64_t ino)
|
||||
{
|
||||
return (int) ino;
|
||||
}
|
||||
|
||||
|
||||
/* dev reading */
|
||||
static int
|
||||
nilfs_dev_bread(struct nilfs_device *nilfsdev, uint64_t blocknr,
|
||||
@ -354,7 +347,7 @@ nilfs_btree_nlookup(struct nilfs_node *node, uint64_t from, uint64_t blks,
|
||||
/* vtop operations */
|
||||
|
||||
/* translate index to a file block number and an entry */
|
||||
static void
|
||||
void
|
||||
nilfs_mdt_trans(struct nilfs_mdt *mdt, uint64_t index,
|
||||
uint64_t *blocknr, uint32_t *entry_in_block)
|
||||
{
|
||||
@ -667,143 +660,6 @@ nilfs_search_super_root(struct nilfs_device *nilfsdev)
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Genfs interfacing
|
||||
*
|
||||
* static const struct genfs_ops nilfs_genfsops = {
|
||||
* .gop_size = genfs_size,
|
||||
* size of transfers
|
||||
* .gop_alloc = nilfs_gop_alloc,
|
||||
* allocate len bytes at offset
|
||||
* .gop_write = genfs_gop_write,
|
||||
* putpages interface code
|
||||
* .gop_markupdate = nilfs_gop_markupdate,
|
||||
* set update/modify flags etc.
|
||||
* }
|
||||
*/
|
||||
|
||||
/*
|
||||
* Callback from genfs to allocate len bytes at offset off; only called when
|
||||
* filling up gaps in the allocation.
|
||||
*/
|
||||
static int
|
||||
nilfs_gop_alloc(struct vnode *vp, off_t off,
|
||||
off_t len, int flags, kauth_cred_t cred)
|
||||
{
|
||||
DPRINTF(NOTIMPL, ("nilfs_gop_alloc not implemented\n"));
|
||||
DPRINTF(ALLOC, ("nilfs_gop_alloc called for %"PRIu64" bytes\n", len));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* callback from genfs to update our flags
|
||||
*/
|
||||
static void
|
||||
nilfs_gop_markupdate(struct vnode *vp, int flags)
|
||||
{
|
||||
struct nilfs_node *nilfs_node = VTOI(vp);
|
||||
u_long mask = 0;
|
||||
|
||||
if ((flags & GOP_UPDATE_ACCESSED) != 0) {
|
||||
mask = IN_ACCESS;
|
||||
}
|
||||
if ((flags & GOP_UPDATE_MODIFIED) != 0) {
|
||||
if (vp->v_type == VREG) {
|
||||
mask |= IN_CHANGE | IN_UPDATE;
|
||||
} else {
|
||||
mask |= IN_MODIFY;
|
||||
}
|
||||
}
|
||||
if (mask) {
|
||||
nilfs_node->i_flags |= mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static const struct genfs_ops nilfs_genfsops = {
|
||||
.gop_size = genfs_size,
|
||||
.gop_alloc = nilfs_gop_alloc,
|
||||
.gop_write = genfs_gop_write_rwmap,
|
||||
.gop_markupdate = nilfs_gop_markupdate,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
nilfs_register_node(struct nilfs_node *node)
|
||||
{
|
||||
struct nilfs_mount *ump;
|
||||
uint32_t hashline;
|
||||
|
||||
ump = node->ump;
|
||||
mutex_enter(&ump->ihash_lock);
|
||||
|
||||
/* add to our hash table */
|
||||
hashline = nilfs_calchash(node->ino) & NILFS_INODE_HASHMASK;
|
||||
#ifdef DEBUG
|
||||
struct nilfs_node *chk;
|
||||
LIST_FOREACH(chk, &ump->nilfs_nodes[hashline], hashchain) {
|
||||
assert(chk);
|
||||
if (chk->ino == node->ino)
|
||||
panic("Double node entered\n");
|
||||
}
|
||||
#endif
|
||||
LIST_INSERT_HEAD(&ump->nilfs_nodes[hashline], node, hashchain);
|
||||
|
||||
mutex_exit(&ump->ihash_lock);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nilfs_deregister_node(struct nilfs_node *node)
|
||||
{
|
||||
struct nilfs_mount *ump;
|
||||
|
||||
ump = node->ump;
|
||||
mutex_enter(&ump->ihash_lock);
|
||||
|
||||
/* remove from hash list */
|
||||
LIST_REMOVE(node, hashchain);
|
||||
|
||||
mutex_exit(&ump->ihash_lock);
|
||||
}
|
||||
|
||||
|
||||
static struct nilfs_node *
|
||||
nilfs_hash_lookup(struct nilfs_mount *ump, ino_t ino)
|
||||
{
|
||||
struct nilfs_node *node;
|
||||
struct vnode *vp;
|
||||
uint32_t hashline;
|
||||
|
||||
loop:
|
||||
mutex_enter(&ump->ihash_lock);
|
||||
|
||||
/* search our hash table */
|
||||
hashline = nilfs_calchash(ino) & NILFS_INODE_HASHMASK;
|
||||
LIST_FOREACH(node, &ump->nilfs_nodes[hashline], hashchain) {
|
||||
assert(node);
|
||||
if (node->ino == ino) {
|
||||
vp = node->vnode;
|
||||
assert(vp);
|
||||
mutex_enter(vp->v_interlock);
|
||||
mutex_exit(&ump->ihash_lock);
|
||||
if (vget(vp, LK_EXCLUSIVE))
|
||||
goto loop;
|
||||
return node;
|
||||
}
|
||||
}
|
||||
mutex_exit(&ump->ihash_lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* node action implementators */
|
||||
extern int (**nilfs_vnodeop_p)(void *);
|
||||
|
||||
int
|
||||
nilfs_get_node_raw(struct nilfs_device *nilfsdev, struct nilfs_mount *ump,
|
||||
uint64_t ino, struct nilfs_inode *inode, struct nilfs_node **nodep)
|
||||
@ -841,127 +697,6 @@ nilfs_get_node_raw(struct nilfs_device *nilfsdev, struct nilfs_mount *ump,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nilfs_get_node(struct mount *mp, uint64_t ino, struct vnode **vpp)
|
||||
{
|
||||
struct nilfs_device *nilfsdev;
|
||||
struct nilfs_inode inode, *entry;
|
||||
struct nilfs_node *node;
|
||||
struct nilfs_mount *ump = VFSTONILFS(mp);
|
||||
struct vnode *nvp;
|
||||
struct buf *bp;
|
||||
uint64_t ivblocknr;
|
||||
uint32_t entry_in_block;
|
||||
int error;
|
||||
|
||||
/* lookup node in hash table */
|
||||
node = nilfs_hash_lookup(ump, ino);
|
||||
if (node) {
|
||||
*vpp = node->vnode;
|
||||
VOP_UNLOCK(*vpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* lock to disallow simultanious creation of same udf_node */
|
||||
mutex_enter(&ump->get_node_lock);
|
||||
|
||||
/* relookup since it could be created while waiting for the mutex */
|
||||
node = nilfs_hash_lookup(ump, ino);
|
||||
if (node) {
|
||||
*vpp = node->vnode;
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
VOP_UNLOCK(*vpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* create new inode; XXX check could be handier */
|
||||
if ((ino < NILFS_ATIME_INO) && (ino != NILFS_ROOT_INO)) {
|
||||
printf("nilfs_get_node: system ino %"PRIu64" not in mount "
|
||||
"point!\n", ino);
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
/* lookup inode in the ifile */
|
||||
DPRINTF(NODE, ("lookup ino %"PRIu64"\n", ino));
|
||||
|
||||
/* lookup inode structure in mountpoints ifile */
|
||||
nilfsdev = ump->nilfsdev;
|
||||
nilfs_mdt_trans(&nilfsdev->ifile_mdt, ino, &ivblocknr, &entry_in_block);
|
||||
|
||||
error = nilfs_bread(ump->ifile_node, ivblocknr, NOCRED, 0, &bp);
|
||||
if (error) {
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
/* get inode entry */
|
||||
entry = (struct nilfs_inode *) bp->b_data + entry_in_block;
|
||||
inode = *entry;
|
||||
brelse(bp, BC_AGE);
|
||||
|
||||
/* get node */
|
||||
error = nilfs_get_node_raw(ump->nilfsdev, ump, ino, &inode, &node);
|
||||
if (error) {
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return error;
|
||||
}
|
||||
|
||||
error = getnewvnode(VT_NILFS, mp, nilfs_vnodeop_p, NULL, &nvp);
|
||||
if (error) {
|
||||
nilfs_dispose_node(&node);
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return error;
|
||||
}
|
||||
|
||||
/* lock node */
|
||||
error = vn_lock(nvp, LK_EXCLUSIVE | LK_RETRY);
|
||||
if (error) {
|
||||
ungetnewvnode(nvp);
|
||||
nilfs_dispose_node(&node);
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return error;
|
||||
}
|
||||
|
||||
nvp->v_type = IFTOVT(inode.i_mode);
|
||||
switch (nvp->v_type) {
|
||||
case VREG:
|
||||
case VDIR:
|
||||
case VLNK:
|
||||
break;
|
||||
/* other types not yet supported. */
|
||||
default:
|
||||
nvp->v_type = VNON;
|
||||
VOP_UNLOCK(nvp);
|
||||
ungetnewvnode(nvp);
|
||||
nilfs_dispose_node(&node);
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
node->vnode = nvp;
|
||||
nvp->v_data = node;
|
||||
|
||||
/* initialise genfs */
|
||||
genfs_node_init(nvp, &nilfs_genfsops);
|
||||
|
||||
/* check if we're fetching the root */
|
||||
if (ino == NILFS_ROOT_INO)
|
||||
nvp->v_vflag |= VV_ROOT;
|
||||
|
||||
uvm_vnp_setsize(nvp, nilfs_rw64(inode.i_size));
|
||||
|
||||
nilfs_register_node(node);
|
||||
|
||||
mutex_exit(&ump->get_node_lock);
|
||||
|
||||
*vpp = nvp;
|
||||
VOP_UNLOCK(*vpp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nilfs_dispose_node(struct nilfs_node **nodep)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nilfs_subr.h,v 1.2 2014/10/15 09:03:53 hannken Exp $ */
|
||||
/* $NetBSD: nilfs_subr.h,v 1.3 2014/10/15 09:05:46 hannken Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008, 2009 Reinoud Zandijk
|
||||
@ -53,11 +53,10 @@ int nilfs_bread(struct nilfs_node *node, uint64_t blocknr, struct kauth_cred *cr
|
||||
int nilfs_btree_nlookup(struct nilfs_node *node, uint64_t from, uint64_t blks, uint64_t *l2vmap);
|
||||
|
||||
/* vtop operations */
|
||||
void nilfs_mdt_trans(struct nilfs_mdt *mdt, uint64_t index, uint64_t *blocknr, uint32_t *entry_in_block);
|
||||
int nilfs_nvtop(struct nilfs_node *node, uint64_t blks, uint64_t *l2vmap, uint64_t *v2pmap);
|
||||
|
||||
/* node action implementators */
|
||||
void nilfs_deregister_node(struct nilfs_node *);
|
||||
int nilfs_get_node(struct mount *mp, uint64_t ino, struct vnode **vpp);
|
||||
int nilfs_get_node_raw(struct nilfs_device *nilfsdev, struct nilfs_mount *ump, uint64_t ino, struct nilfs_inode *inode, struct nilfs_node **nodep);
|
||||
void nilfs_dispose_node(struct nilfs_node **node);
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nilfs_vfsops.c,v 1.17 2014/10/15 09:03:53 hannken Exp $ */
|
||||
/* $NetBSD: nilfs_vfsops.c,v 1.18 2014/10/15 09:05:46 hannken Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008, 2009 Reinoud Zandijk
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.17 2014/10/15 09:03:53 hannken Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.18 2014/10/15 09:05:46 hannken Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
|
||||
@ -86,6 +86,70 @@ static struct sysctllog *nilfs_sysctl_log;
|
||||
VFS_PROTOS(nilfs);
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Genfs interfacing
|
||||
*
|
||||
* static const struct genfs_ops nilfs_genfsops = {
|
||||
* .gop_size = genfs_size,
|
||||
* size of transfers
|
||||
* .gop_alloc = nilfs_gop_alloc,
|
||||
* allocate len bytes at offset
|
||||
* .gop_write = genfs_gop_write,
|
||||
* putpages interface code
|
||||
* .gop_markupdate = nilfs_gop_markupdate,
|
||||
* set update/modify flags etc.
|
||||
* }
|
||||
*/
|
||||
|
||||
/*
|
||||
* Callback from genfs to allocate len bytes at offset off; only called when
|
||||
* filling up gaps in the allocation.
|
||||
*/
|
||||
static int
|
||||
nilfs_gop_alloc(struct vnode *vp, off_t off,
|
||||
off_t len, int flags, kauth_cred_t cred)
|
||||
{
|
||||
DPRINTF(NOTIMPL, ("nilfs_gop_alloc not implemented\n"));
|
||||
DPRINTF(ALLOC, ("nilfs_gop_alloc called for %"PRIu64" bytes\n", len));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* callback from genfs to update our flags
|
||||
*/
|
||||
static void
|
||||
nilfs_gop_markupdate(struct vnode *vp, int flags)
|
||||
{
|
||||
struct nilfs_node *nilfs_node = VTOI(vp);
|
||||
u_long mask = 0;
|
||||
|
||||
if ((flags & GOP_UPDATE_ACCESSED) != 0) {
|
||||
mask = IN_ACCESS;
|
||||
}
|
||||
if ((flags & GOP_UPDATE_MODIFIED) != 0) {
|
||||
if (vp->v_type == VREG) {
|
||||
mask |= IN_CHANGE | IN_UPDATE;
|
||||
} else {
|
||||
mask |= IN_MODIFY;
|
||||
}
|
||||
}
|
||||
if (mask) {
|
||||
nilfs_node->i_flags |= mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static const struct genfs_ops nilfs_genfsops = {
|
||||
.gop_size = genfs_size,
|
||||
.gop_alloc = nilfs_gop_alloc,
|
||||
.gop_write = genfs_gop_write_rwmap,
|
||||
.gop_markupdate = nilfs_gop_markupdate,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/* predefine vnode-op list descriptor */
|
||||
@ -109,6 +173,7 @@ struct vfsops nilfs_vfsops = {
|
||||
.vfs_statvfs = nilfs_statvfs,
|
||||
.vfs_sync = nilfs_sync,
|
||||
.vfs_vget = nilfs_vget,
|
||||
.vfs_loadvnode = nilfs_loadvnode,
|
||||
.vfs_fhtovp = nilfs_fhtovp,
|
||||
.vfs_vptofh = nilfs_vptofh,
|
||||
.vfs_init = nilfs_init,
|
||||
@ -759,8 +824,6 @@ free_nilfs_mountinfo(struct mount *mp)
|
||||
if (ump == NULL)
|
||||
return;
|
||||
|
||||
mutex_destroy(&ump->ihash_lock);
|
||||
mutex_destroy(&ump->get_node_lock);
|
||||
MPFREE(ump, M_NILFSMNT);
|
||||
}
|
||||
#undef MPFREE
|
||||
@ -773,7 +836,7 @@ nilfs_mount(struct mount *mp, const char *path,
|
||||
struct nilfs_device *nilfsdev;
|
||||
struct nilfs_mount *ump;
|
||||
struct vnode *devvp;
|
||||
int lst, error;
|
||||
int error;
|
||||
|
||||
DPRINTF(VFSCALL, ("nilfs_mount called\n"));
|
||||
|
||||
@ -845,15 +908,6 @@ nilfs_mount(struct mount *mp, const char *path,
|
||||
/* allocate nilfs part of mount structure; malloc always succeeds */
|
||||
ump = malloc(sizeof(struct nilfs_mount), M_NILFSMNT, M_WAITOK | M_ZERO);
|
||||
|
||||
/* init locks */
|
||||
mutex_init(&ump->ihash_lock, MUTEX_DEFAULT, IPL_NONE);
|
||||
mutex_init(&ump->get_node_lock, MUTEX_DEFAULT, IPL_NONE);
|
||||
|
||||
/* init our hash table for inode lookup */
|
||||
for (lst = 0; lst < NILFS_INODE_HASHSIZE; lst++) {
|
||||
LIST_INIT(&ump->nilfs_nodes[lst]);
|
||||
}
|
||||
|
||||
/* set up linkage */
|
||||
mp->mnt_data = ump;
|
||||
ump->vfs_mountp = mp;
|
||||
@ -970,11 +1024,12 @@ nilfs_start(struct mount *mp, int flags)
|
||||
int
|
||||
nilfs_root(struct mount *mp, struct vnode **vpp)
|
||||
{
|
||||
uint64_t ino = NILFS_ROOT_INO;
|
||||
int error;
|
||||
|
||||
DPRINTF(NODE, ("nilfs_root called\n"));
|
||||
|
||||
error = nilfs_get_node(mp, NILFS_ROOT_INO, vpp);
|
||||
error = vcache_get(mp, &ino, sizeof(ino), vpp);
|
||||
if (error == 0) {
|
||||
error = vn_lock(*vpp, LK_EXCLUSIVE);
|
||||
if (error) {
|
||||
@ -1043,6 +1098,92 @@ nilfs_vget(struct mount *mp, ino_t ino,
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Read an inode from disk and initialize this vnode / inode pair.
|
||||
* Caller assures no other thread will try to load this inode.
|
||||
*/
|
||||
int
|
||||
nilfs_loadvnode(struct mount *mp, struct vnode *vp,
|
||||
const void *key, size_t key_len, const void **new_key)
|
||||
{
|
||||
uint64_t ino;
|
||||
struct nilfs_device *nilfsdev;
|
||||
struct nilfs_inode inode, *entry;
|
||||
struct nilfs_node *node;
|
||||
struct nilfs_mount *ump;
|
||||
struct buf *bp;
|
||||
uint64_t ivblocknr;
|
||||
uint32_t entry_in_block;
|
||||
int error;
|
||||
extern int (**nilfs_vnodeop_p)(void *);
|
||||
|
||||
KASSERT(key_len == sizeof(ino));
|
||||
memcpy(&ino, key, key_len);
|
||||
|
||||
ump = VFSTONILFS(mp);
|
||||
|
||||
/* create new inode; XXX check could be handier */
|
||||
if ((ino < NILFS_USER_INO) && (ino != NILFS_ROOT_INO)) {
|
||||
printf("nilfs_get_node: system ino %"PRIu64" not in mount "
|
||||
"point!\n", ino);
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
/* lookup inode in the ifile */
|
||||
DPRINTF(NODE, ("lookup ino %"PRIu64"\n", ino));
|
||||
|
||||
/* lookup inode structure in mountpoints ifile */
|
||||
nilfsdev = ump->nilfsdev;
|
||||
nilfs_mdt_trans(&nilfsdev->ifile_mdt, ino, &ivblocknr, &entry_in_block);
|
||||
|
||||
error = nilfs_bread(ump->ifile_node, ivblocknr, NOCRED, 0, &bp);
|
||||
if (error)
|
||||
return ENOENT;
|
||||
|
||||
/* get inode entry */
|
||||
entry = (struct nilfs_inode *) bp->b_data + entry_in_block;
|
||||
inode = *entry;
|
||||
brelse(bp, BC_AGE);
|
||||
|
||||
/* get node */
|
||||
error = nilfs_get_node_raw(ump->nilfsdev, ump, ino, &inode, &node);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
vp->v_type = IFTOVT(inode.i_mode);
|
||||
switch (vp->v_type) {
|
||||
case VREG:
|
||||
case VDIR:
|
||||
case VLNK:
|
||||
break;
|
||||
/* other types not yet supported. */
|
||||
default:
|
||||
vp->v_type = VNON;
|
||||
nilfs_dispose_node(&node);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
vp->v_tag = VT_NILFS;
|
||||
vp->v_op = nilfs_vnodeop_p;
|
||||
vp->v_data = node;
|
||||
node->vnode = vp;
|
||||
|
||||
/* initialise genfs */
|
||||
genfs_node_init(vp, &nilfs_genfsops);
|
||||
|
||||
/* check if we're fetching the root */
|
||||
if (ino == NILFS_ROOT_INO)
|
||||
vp->v_vflag |= VV_ROOT;
|
||||
|
||||
uvm_vnp_setsize(vp, nilfs_rw64(inode.i_size));
|
||||
*new_key = &node->ino;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Lookup vnode for file handle specified
|
||||
*/
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nilfs_vnops.c,v 1.29 2014/10/15 09:03:53 hannken Exp $ */
|
||||
/* $NetBSD: nilfs_vnops.c,v 1.30 2014/10/15 09:05:46 hannken Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008, 2009 Reinoud Zandijk
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.29 2014/10/15 09:03:53 hannken Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.30 2014/10/15 09:05:46 hannken Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
|
||||
@ -118,8 +118,8 @@ nilfs_reclaim(void *v)
|
||||
/* update note for closure */
|
||||
nilfs_update(vp, NULL, NULL, NULL, UPDATE_CLOSE);
|
||||
|
||||
/* remove from our hash lookup table */
|
||||
nilfs_deregister_node(nilfs_node);
|
||||
/* remove from vnode cache. */
|
||||
vcache_remove(vp->v_mount, &nilfs_node->ino, sizeof(nilfs_node->ino));
|
||||
|
||||
/* dispose all node knowledge */
|
||||
genfs_node_destroy(vp);
|
||||
@ -697,7 +697,7 @@ nilfs_lookup(void *v)
|
||||
if (error == 0) {
|
||||
DPRINTF(LOOKUP, ("\tfound '..'\n"));
|
||||
/* try to create/reuse the node */
|
||||
error = nilfs_get_node(mp, ino, vpp);
|
||||
error = vcache_get(mp, &ino, sizeof(ino), vpp);
|
||||
|
||||
if (!error) {
|
||||
DPRINTF(LOOKUP,
|
||||
@ -734,7 +734,7 @@ nilfs_lookup(void *v)
|
||||
/* done */
|
||||
} else {
|
||||
/* try to create/reuse the node */
|
||||
error = nilfs_get_node(mp, ino, vpp);
|
||||
error = vcache_get(mp, &ino, sizeof(ino), vpp);
|
||||
if (!error) {
|
||||
/*
|
||||
* If we are not at the last path component
|
||||
|
Loading…
Reference in New Issue
Block a user