diff options
author | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2007-05-02 00:22:12 +0000 |
---|---|---|
committer | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2007-05-02 00:22:12 +0000 |
commit | 04748b1b2e9cadccd8fc5a764647cd4c34358c48 (patch) | |
tree | 8369e5a748e01b5367683557d628ac6f8d91be46 /sys/contrib/opensolaris | |
parent | 0775674bbc3ccbcf2e6ebad5d19e1322dcff5435 (diff) | |
download | src-04748b1b2e9cadccd8fc5a764647cd4c34358c48.tar.gz src-04748b1b2e9cadccd8fc5a764647cd4c34358c48.zip |
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.
Notes
Notes:
svn path=/head/; revision=169196
Diffstat (limited to 'sys/contrib/opensolaris')
-rw-r--r-- | sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c | 12 |
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 d9eec310a618..f7077933b796 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 */ |