summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2007-05-02 00:22:12 +0000
committerpjd <pjd@FreeBSD.org>2007-05-02 00:22:12 +0000
commitfa150c55a86f72ad68f53e40190228793e1a973f (patch)
tree8369e5a748e01b5367683557d628ac6f8d91be46 /sys/contrib
parent3e897aef92670da689ea8422af97cc9347571042 (diff)
downloadFreeBSD-src-fa150c55a86f72ad68f53e40190228793e1a973f.zip
FreeBSD-src-fa150c55a86f72ad68f53e40190228793e1a973f.tar.gz
The getnewvnode() function sets LK_NOSHARE by default, so if we want to
support shared vnodes locking, we need to remove that flag. Also add LK_CANRECURSE flag as found in nfsclient.
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
index d9eec31..f707793 100644
--- a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
@@ -106,14 +106,18 @@ static int
zfs_znode_cache_constructor(void *buf, void *cdrarg, int kmflags)
{
znode_t *zp = buf;
+ vnode_t *vp;
vfs_t *vfsp = cdrarg;
int error;
if (cdrarg != NULL) {
- error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &zp->z_vnode);
+ error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp);
ASSERT(error == 0);
- zp->z_vnode->v_data = (caddr_t)zp;
- vhold(zp->z_vnode);
+ zp->z_vnode = vp;
+ vp->v_data = (caddr_t)zp;
+ vhold(vp);
+ vp->v_vnlock->lk_flags |= LK_CANRECURSE;
+ vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
} else {
zp->z_vnode = NULL;
}
@@ -598,6 +602,8 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
vp = ZTOV(zp);
vp->v_data = (caddr_t)zp;
vhold(vp);
+ vp->v_vnlock->lk_flags |= LK_CANRECURSE;
+ vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
vp->v_type = IFTOVT((mode_t)zp->z_phys->zp_mode);
if (vp->v_type == VDIR)
zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */
OpenPOWER on IntegriCloud