Module Name: src
Committed By: hannken
Date: Mon Apr 6 08:39:23 UTC 2015
Modified Files:
src/sys/fs/udf: udf.h udf_subr.c udf_vfsops.c udf_vnops.c
Log Message:
Change udf to vcache, keyed on udf_node->loc.loc.
To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/sys/fs/udf/udf.h
cvs rdiff -u -r1.128 -r1.129 src/sys/fs/udf/udf_subr.c
cvs rdiff -u -r1.67 -r1.68 src/sys/fs/udf/udf_vfsops.c
cvs rdiff -u -r1.99 -r1.100 src/sys/fs/udf/udf_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/fs/udf/udf.h
diff -u src/sys/fs/udf/udf.h:1.47 src/sys/fs/udf/udf.h:1.48
--- src/sys/fs/udf/udf.h:1.47 Wed Sep 17 19:47:05 2014
+++ src/sys/fs/udf/udf.h Mon Apr 6 08:39:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf.h,v 1.47 2014/09/17 19:47:05 reinoud Exp $ */
+/* $NetBSD: udf.h,v 1.48 2015/04/06 08:39:23 hannken Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -94,6 +94,7 @@ extern int udf_verbose;
#define DPRINTFIF(name, cond, arg) {}
#endif
+VFS_PROTOS(udf);
/* constants to identify what kind of identifier we are dealing with */
#define UDF_REGID_DOMAIN 1
@@ -339,7 +340,6 @@ struct udf_mount {
/* rb tree for lookup icb to udf_node and sorted list for sync */
kmutex_t ihash_lock;
- kmutex_t get_node_lock;
struct rb_tree udf_node_tree;
/* syncing */
Index: src/sys/fs/udf/udf_subr.c
diff -u src/sys/fs/udf/udf_subr.c:1.128 src/sys/fs/udf/udf_subr.c:1.129
--- src/sys/fs/udf/udf_subr.c:1.128 Sat Feb 7 04:18:03 2015
+++ src/sys/fs/udf/udf_subr.c Mon Apr 6 08:39:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.c,v 1.128 2015/02/07 04:18:03 christos Exp $ */
+/* $NetBSD: udf_subr.c,v 1.129 2015/04/06 08:39:23 hannken Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.128 2015/02/07 04:18:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.129 2015/04/06 08:39:23 hannken Exp $");
#endif /* not lint */
@@ -3444,31 +3444,6 @@ udf_init_nodes_tree(struct udf_mount *um
}
-static struct udf_node *
-udf_node_lookup(struct udf_mount *ump, struct long_ad *icbptr)
-{
- struct udf_node *udf_node;
- struct vnode *vp;
-
-loop:
- mutex_enter(&ump->ihash_lock);
-
- udf_node = rb_tree_find_node(&ump->udf_node_tree, icbptr);
- if (udf_node) {
- vp = udf_node->vnode;
- assert(vp);
- mutex_enter(vp->v_interlock);
- mutex_exit(&ump->ihash_lock);
- if (vget(vp, LK_EXCLUSIVE))
- goto loop;
- return udf_node;
- }
- mutex_exit(&ump->ihash_lock);
-
- return NULL;
-}
-
-
static void
udf_register_node(struct udf_node *udf_node)
{
@@ -5279,44 +5254,33 @@ error_out:
*/
int
-udf_get_node(struct udf_mount *ump, struct long_ad *node_icb_loc,
- struct udf_node **udf_noderes)
+udf_loadvnode(struct mount *mp, struct vnode *vp,
+ const void *key, size_t key_len, const void **new_key)
{
union dscrptr *dscr;
+ struct udf_mount *ump;
struct udf_node *udf_node;
- struct vnode *nvp;
- struct long_ad icb_loc, next_icb_loc, last_fe_icb_loc;
+ struct long_ad node_icb_loc, icb_loc, next_icb_loc, last_fe_icb_loc;
uint64_t file_size;
uint32_t lb_size, sector, dummy;
int udf_file_type, dscr_type, strat, strat4096, needs_indirect;
int slot, eof, error;
int num_indir_followed = 0;
- DPRINTF(NODE, ("udf_get_node called\n"));
- *udf_noderes = udf_node = NULL;
-
- /* lock to disallow simultanious creation of same udf_node */
- mutex_enter(&ump->get_node_lock);
-
- DPRINTF(NODE, ("\tlookup in hash table\n"));
- /* lookup in hash table */
- assert(ump);
- assert(node_icb_loc);
- udf_node = udf_node_lookup(ump, node_icb_loc);
- if (udf_node) {
- DPRINTF(NODE, ("\tgot it from the hash!\n"));
- /* vnode is returned locked */
- *udf_noderes = udf_node;
- mutex_exit(&ump->get_node_lock);
- return 0;
- }
+ DPRINTF(NODE, ("udf_loadvnode called\n"));
+ udf_node = NULL;
+ ump = VFSTOUDF(mp);
+
+ KASSERT(key_len == sizeof(node_icb_loc.loc));
+ memset(&node_icb_loc, 0, sizeof(node_icb_loc));
+ node_icb_loc.len = ump->logical_vol->lb_size;
+ memcpy(&node_icb_loc.loc, key, key_len);
/* garbage check: translate udf_node_icb_loc to sectornr */
- error = udf_translate_vtop(ump, node_icb_loc, §or, &dummy);
+ error = udf_translate_vtop(ump, &node_icb_loc, §or, &dummy);
if (error) {
DPRINTF(NODE, ("\tcan't translate icb address!\n"));
/* no use, this will fail anyway */
- mutex_exit(&ump->get_node_lock);
return EINVAL;
}
@@ -5324,33 +5288,18 @@ udf_get_node(struct udf_mount *ump, stru
udf_node = pool_get(&udf_node_pool, PR_WAITOK);
memset(udf_node, 0, sizeof(struct udf_node));
- DPRINTF(NODE, ("\tget new vnode\n"));
- /* give it a vnode */
- error = getnewvnode(VT_UDF, ump->vfs_mountp, udf_vnodeop_p, NULL, &nvp);
- if (error) {
- pool_put(&udf_node_pool, udf_node);
- mutex_exit(&ump->get_node_lock);
- return error;
- }
-
- /* always return locked vnode */
- if ((error = vn_lock(nvp, LK_EXCLUSIVE | LK_RETRY))) {
- /* recycle vnode and unlock; simultaneous will fail too */
- ungetnewvnode(nvp);
- pool_put(&udf_node_pool, udf_node);
- mutex_exit(&ump->get_node_lock);
- return error;
- }
+ vp->v_tag = VT_UDF;
+ vp->v_op = udf_vnodeop_p;
+ vp->v_data = udf_node;
/* initialise crosslinks, note location of fe/efe for hashing */
udf_node->ump = ump;
- udf_node->vnode = nvp;
- nvp->v_data = udf_node;
- udf_node->loc = *node_icb_loc;
+ udf_node->vnode = vp;
+ udf_node->loc = node_icb_loc;
udf_node->lockf = 0;
mutex_init(&udf_node->node_mutex, MUTEX_DEFAULT, IPL_NONE);
cv_init(&udf_node->node_lock, "udf_nlk");
- genfs_node_init(nvp, &udf_genfsops); /* inititise genfs */
+ genfs_node_init(vp, &udf_genfsops); /* inititise genfs */
udf_node->outstanding_bufs = 0;
udf_node->outstanding_nodedscr = 0;
udf_node->uncommitted_lbs = 0;
@@ -5359,15 +5308,12 @@ udf_get_node(struct udf_mount *ump, stru
if (ump->fileset_desc)
if (memcmp(&udf_node->loc, &ump->fileset_desc->rootdir_icb,
sizeof(struct long_ad)) == 0)
- nvp->v_vflag |= VV_ROOT;
+ vp->v_vflag |= VV_ROOT;
/* insert into the hash lookup */
udf_register_node(udf_node);
- /* safe to unlock, the entry is in the hash table, vnode is locked */
- mutex_exit(&ump->get_node_lock);
-
- icb_loc = *node_icb_loc;
+ icb_loc = node_icb_loc;
needs_indirect = 0;
strat4096 = 0;
udf_file_type = UDF_ICB_FILETYPE_UNKNOWN;
@@ -5471,10 +5417,6 @@ udf_get_node(struct udf_mount *ump, stru
/* recycle udf_node */
udf_dispose_node(udf_node);
- VOP_UNLOCK(nvp);
- nvp->v_data = NULL;
- ungetnewvnode(nvp);
-
return EINVAL; /* error code ok? */
}
DPRINTF(NODE, ("\tnode fe/efe read in fine\n"));
@@ -5567,10 +5509,6 @@ udf_get_node(struct udf_mount *ump, stru
/* recycle udf_node */
udf_dispose_node(udf_node);
- VOP_UNLOCK(nvp);
- nvp->v_data = NULL;
- ungetnewvnode(nvp);
-
return EINVAL; /* error code ok? */
}
@@ -5587,49 +5525,69 @@ udf_get_node(struct udf_mount *ump, stru
switch (udf_file_type) {
case UDF_ICB_FILETYPE_DIRECTORY :
case UDF_ICB_FILETYPE_STREAMDIR :
- nvp->v_type = VDIR;
+ vp->v_type = VDIR;
break;
case UDF_ICB_FILETYPE_BLOCKDEVICE :
- nvp->v_type = VBLK;
+ vp->v_type = VBLK;
break;
case UDF_ICB_FILETYPE_CHARDEVICE :
- nvp->v_type = VCHR;
+ vp->v_type = VCHR;
break;
case UDF_ICB_FILETYPE_SOCKET :
- nvp->v_type = VSOCK;
+ vp->v_type = VSOCK;
break;
case UDF_ICB_FILETYPE_FIFO :
- nvp->v_type = VFIFO;
+ vp->v_type = VFIFO;
break;
case UDF_ICB_FILETYPE_SYMLINK :
- nvp->v_type = VLNK;
+ vp->v_type = VLNK;
break;
case UDF_ICB_FILETYPE_VAT :
case UDF_ICB_FILETYPE_META_MAIN :
case UDF_ICB_FILETYPE_META_MIRROR :
- nvp->v_type = VNON;
+ vp->v_type = VNON;
break;
case UDF_ICB_FILETYPE_RANDOMACCESS :
case UDF_ICB_FILETYPE_REALTIME :
- nvp->v_type = VREG;
+ vp->v_type = VREG;
break;
default:
/* YIKES, something else */
- nvp->v_type = VNON;
+ vp->v_type = VNON;
}
/* TODO specfs, fifofs etc etc. vnops setting */
/* don't forget to set vnode's v_size */
- uvm_vnp_setsize(nvp, file_size);
+ uvm_vnp_setsize(vp, file_size);
/* TODO ext attr and streamdir udf_nodes */
- *udf_noderes = udf_node;
+ *new_key = &udf_node->loc.loc;
return 0;
}
+int
+udf_get_node(struct udf_mount *ump, struct long_ad *node_icb_loc,
+ struct udf_node **udf_noderes)
+{
+ int error;
+ struct vnode *vp;
+
+ error = vcache_get(ump->vfs_mountp, &node_icb_loc->loc,
+ sizeof(node_icb_loc->loc), &vp);
+ if (error)
+ return error;
+ error = vn_lock(vp, LK_EXCLUSIVE);
+ if (error) {
+ vrele(vp);
+ return error;
+ }
+ *udf_noderes = VTOI(vp);
+ return 0;
+}
+
/* --------------------------------------------------------------------- */
int
@@ -5759,19 +5717,19 @@ udf_dispose_node(struct udf_node *udf_no
/*
- * create a new node using the specified vnodeops, vap and cnp but with the
- * udf_file_type. This allows special files to be created. Use with care.
+ * create a new node using the specified dvp, vap and cnp.
+ * This allows special files to be created. Use with care.
*/
-static int
-udf_create_node_raw(struct vnode *dvp, struct vnode **vpp, int udf_file_type,
- int (**vnodeops)(void *), struct vattr *vap, struct componentname *cnp)
+int
+udf_newvnode(struct mount *mp, struct vnode *dvp, struct vnode *vp,
+ struct vattr *vap, kauth_cred_t cred,
+ size_t *key_len, const void **new_key)
{
union dscrptr *dscr;
struct udf_node *dir_node = VTOI(dvp);
struct udf_node *udf_node;
struct udf_mount *ump = dir_node->ump;
- struct vnode *nvp;
struct long_ad node_icb_loc;
uint64_t parent_unique_id;
uint64_t lmapping;
@@ -5779,28 +5737,65 @@ udf_create_node_raw(struct vnode *dvp, s
uint16_t vpart_num;
uid_t uid;
gid_t gid, parent_gid;
- int fid_size, error;
+ int (**vnodeops)(void *);
+ int udf_file_type, fid_size, error;
- lb_size = udf_rw32(ump->logical_vol->lb_size);
- *vpp = NULL;
+ vnodeops = udf_vnodeop_p;
+ udf_file_type = UDF_ICB_FILETYPE_RANDOMACCESS;
- /* allocate vnode */
- error = getnewvnode(VT_UDF, ump->vfs_mountp, vnodeops, NULL, &nvp);
- if (error)
- return error;
+ switch (vap->va_type) {
+ case VREG :
+ udf_file_type = UDF_ICB_FILETYPE_RANDOMACCESS;
+ break;
+ case VDIR :
+ udf_file_type = UDF_ICB_FILETYPE_DIRECTORY;
+ break;
+ case VLNK :
+ udf_file_type = UDF_ICB_FILETYPE_SYMLINK;
+ break;
+ case VBLK :
+ udf_file_type = UDF_ICB_FILETYPE_BLOCKDEVICE;
+ /* specfs */
+ return ENOTSUP;
+ break;
+ case VCHR :
+ udf_file_type = UDF_ICB_FILETYPE_CHARDEVICE;
+ /* specfs */
+ return ENOTSUP;
+ break;
+ case VFIFO :
+ udf_file_type = UDF_ICB_FILETYPE_FIFO;
+ /* fifofs */
+ return ENOTSUP;
+ break;
+ case VSOCK :
+ udf_file_type = UDF_ICB_FILETYPE_SOCKET;
+ return ENOTSUP;
+ break;
+ case VNON :
+ case VBAD :
+ default :
+ /* nothing; can we even create these? */
+ return EINVAL;
+ }
+
+ lb_size = udf_rw32(ump->logical_vol->lb_size);
/* reserve space for one logical block */
vpart_num = ump->node_part;
error = udf_reserve_space(ump, NULL, UDF_C_NODE,
vpart_num, 1, /* can_fail */ true);
if (error)
- goto error_out_unget;
+ return error;
/* allocate node */
error = udf_allocate_space(ump, NULL, UDF_C_NODE,
vpart_num, 1, &lmapping);
- if (error)
- goto error_out_unreserve;
+ if (error) {
+ udf_do_unreserve_space(ump, NULL, vpart_num, 1);
+ return error;
+ }
+
lb_num = lmapping;
/* initialise pointer to location */
@@ -5816,8 +5811,8 @@ udf_create_node_raw(struct vnode *dvp, s
/* initialise crosslinks, note location of fe/efe for hashing */
/* bugalert: synchronise with udf_get_node() */
udf_node->ump = ump;
- udf_node->vnode = nvp;
- nvp->v_data = udf_node;
+ udf_node->vnode = vp;
+ vp->v_data = udf_node;
udf_node->loc = node_icb_loc;
udf_node->write_loc = node_icb_loc;
udf_node->lockf = 0;
@@ -5827,8 +5822,11 @@ udf_create_node_raw(struct vnode *dvp, s
udf_node->outstanding_nodedscr = 0;
udf_node->uncommitted_lbs = 0;
+ vp->v_tag = VT_UDF;
+ vp->v_op = vnodeops;
+
/* initialise genfs */
- genfs_node_init(nvp, &udf_genfsops);
+ genfs_node_init(vp, &udf_genfsops);
/* insert into the hash lookup */
udf_register_node(udf_node);
@@ -5861,25 +5859,49 @@ udf_create_node_raw(struct vnode *dvp, s
KASSERT(dscr->tag.tag_loc == udf_node->loc.loc.lb_num);
/* update vnode's size and type */
- nvp->v_type = vap->va_type;
- uvm_vnp_setsize(nvp, fid_size);
+ vp->v_type = vap->va_type;
+ uvm_vnp_setsize(vp, fid_size);
/* set access mode */
udf_setaccessmode(udf_node, vap->va_mode);
/* set ownership */
- uid = kauth_cred_geteuid(cnp->cn_cred);
+ uid = kauth_cred_geteuid(cred);
gid = parent_gid;
udf_setownership(udf_node, uid, gid);
+ *key_len = sizeof(udf_node->loc.loc);;
+ *new_key = &udf_node->loc.loc;
+
+ return 0;
+}
+
+
+int
+udf_create_node(struct vnode *dvp, struct vnode **vpp, struct vattr *vap,
+ struct componentname *cnp)
+{
+ struct udf_node *udf_node, *dir_node = VTOI(dvp);
+ struct udf_mount *ump = dir_node->ump;
+ int error;
+
+ error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, vpp);
+ if (error)
+ return error;
+
+ udf_node = VTOI(*vpp);
error = udf_dir_attach(ump, dir_node, udf_node, vap, cnp);
if (error) {
+ struct long_ad *node_icb_loc = &udf_node->loc;
+ uint32_t lb_num = udf_rw32(node_icb_loc->loc.lb_num);
+ uint16_t vpart_num = udf_rw16(node_icb_loc->loc.part_num);
+
/* free disc allocation for node */
udf_free_allocated_space(ump, lb_num, vpart_num, 1);
/* recycle udf_node */
udf_dispose_node(udf_node);
- vrele(nvp);
+ vrele(*vpp);
*vpp = NULL;
return error;
@@ -5888,76 +5910,7 @@ udf_create_node_raw(struct vnode *dvp, s
/* adjust file count */
udf_adjust_filecount(udf_node, 1);
- /* return result */
- *vpp = nvp;
-
return 0;
-
-error_out_unreserve:
- udf_do_unreserve_space(ump, NULL, vpart_num, 1);
-
-error_out_unget:
- nvp->v_data = NULL;
- ungetnewvnode(nvp);
-
- return error;
-}
-
-
-int
-udf_create_node(struct vnode *dvp, struct vnode **vpp, struct vattr *vap,
- struct componentname *cnp)
-{
- int (**vnodeops)(void *);
- int udf_file_type;
-
- DPRINTF(NODE, ("udf_create_node called\n"));
-
- /* what type are we creating ? */
- vnodeops = udf_vnodeop_p;
- /* start with a default */
- udf_file_type = UDF_ICB_FILETYPE_RANDOMACCESS;
-
- *vpp = NULL;
-
- switch (vap->va_type) {
- case VREG :
- udf_file_type = UDF_ICB_FILETYPE_RANDOMACCESS;
- break;
- case VDIR :
- udf_file_type = UDF_ICB_FILETYPE_DIRECTORY;
- break;
- case VLNK :
- udf_file_type = UDF_ICB_FILETYPE_SYMLINK;
- break;
- case VBLK :
- udf_file_type = UDF_ICB_FILETYPE_BLOCKDEVICE;
- /* specfs */
- return ENOTSUP;
- break;
- case VCHR :
- udf_file_type = UDF_ICB_FILETYPE_CHARDEVICE;
- /* specfs */
- return ENOTSUP;
- break;
- case VFIFO :
- udf_file_type = UDF_ICB_FILETYPE_FIFO;
- /* specfs */
- return ENOTSUP;
- break;
- case VSOCK :
- udf_file_type = UDF_ICB_FILETYPE_SOCKET;
- /* specfs */
- return ENOTSUP;
- break;
- case VNON :
- case VBAD :
- default :
- /* nothing; can we even create these? */
- return EINVAL;
- }
-
- return udf_create_node_raw(dvp, vpp, udf_file_type, vnodeops, vap, cnp);
}
/* --------------------------------------------------------------------- */
Index: src/sys/fs/udf/udf_vfsops.c
diff -u src/sys/fs/udf/udf_vfsops.c:1.67 src/sys/fs/udf/udf_vfsops.c:1.68
--- src/sys/fs/udf/udf_vfsops.c:1.67 Wed Apr 16 18:55:19 2014
+++ src/sys/fs/udf/udf_vfsops.c Mon Apr 6 08:39:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vfsops.c,v 1.67 2014/04/16 18:55:19 maxv Exp $ */
+/* $NetBSD: udf_vfsops.c,v 1.68 2015/04/06 08:39:23 hannken Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.67 2014/04/16 18:55:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.68 2015/04/06 08:39:23 hannken Exp $");
#endif /* not lint */
@@ -79,9 +79,6 @@ MALLOC_JUSTDEFINE(M_UDFVOLD, "UDF volsp
MALLOC_JUSTDEFINE(M_UDFTEMP, "UDF temp", "UDF scrap space");
struct pool udf_node_pool;
-/* supported functions predefined */
-VFS_PROTOS(udf);
-
static struct sysctllog *udf_sysctl_log;
/* internal functions */
@@ -111,6 +108,8 @@ struct vfsops udf_vfsops = {
.vfs_statvfs = udf_statvfs,
.vfs_sync = udf_sync,
.vfs_vget = udf_vget,
+ .vfs_loadvnode = udf_loadvnode,
+ .vfs_newvnode = udf_newvnode,
.vfs_fhtovp = udf_fhtovp,
.vfs_vptofh = udf_vptofh,
.vfs_init = udf_init,
@@ -261,7 +260,6 @@ free_udf_mountinfo(struct mount *mp)
MPFREE(ump->la_lmapping, M_TEMP);
mutex_destroy(&ump->ihash_lock);
- mutex_destroy(&ump->get_node_lock);
mutex_destroy(&ump->logvol_mutex);
mutex_destroy(&ump->allocate_mutex);
cv_destroy(&ump->dirtynodes_cv);
@@ -584,7 +582,6 @@ udf_mountfs(struct vnode *devvp, struct
/* init locks */
mutex_init(&ump->logvol_mutex, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&ump->ihash_lock, MUTEX_DEFAULT, IPL_NONE);
- mutex_init(&ump->get_node_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&ump->allocate_mutex, MUTEX_DEFAULT, IPL_NONE);
cv_init(&ump->dirtynodes_cv, "udfsync2");
Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.99 src/sys/fs/udf/udf_vnops.c:1.100
--- src/sys/fs/udf/udf_vnops.c:1.99 Mon Apr 6 08:38:25 2015
+++ src/sys/fs/udf/udf_vnops.c Mon Apr 6 08:39:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.99 2015/04/06 08:38:25 hannken Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.100 2015/04/06 08:39:23 hannken Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.99 2015/04/06 08:38:25 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.100 2015/04/06 08:39:23 hannken Exp $");
#endif /* not lint */
@@ -129,8 +129,6 @@ udf_inactive(void *v)
/* --------------------------------------------------------------------- */
-int udf_sync(struct mount *mp, int waitfor, kauth_cred_t cred, struct lwp *lwp);
-
int
udf_reclaim(void *v)
{
@@ -176,6 +174,9 @@ udf_reclaim(void *v)
tsleep(&udf_node->outstanding_nodedscr, PRIBIO, "recl wait", hz/8);
}
+ vcache_remove(vp->v_mount, &udf_node->loc.loc,
+ sizeof(udf_node->loc.loc));
+
/* dispose all node knowledge */
udf_dispose_node(udf_node);