diff options
author | pjd <pjd@FreeBSD.org> | 2007-05-02 00:22:12 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-05-02 00:22:12 +0000 |
commit | fa150c55a86f72ad68f53e40190228793e1a973f (patch) | |
tree | 8369e5a748e01b5367683557d628ac6f8d91be46 /sys/contrib | |
parent | 3e897aef92670da689ea8422af97cc9347571042 (diff) | |
download | FreeBSD-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.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 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 */ |