diff options
author | pjd <pjd@FreeBSD.org> | 2007-05-02 00:41:44 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-05-02 00:41:44 +0000 |
commit | 61f69851ce83b009950cd7d7a3adca479d83dd36 (patch) | |
tree | 165b0d16befe35ea2b412eeb1ae58afb49446c8a /sys | |
parent | c228d77c51a9260219543e18fc090604b681e325 (diff) | |
download | FreeBSD-src-61f69851ce83b009950cd7d7a3adca479d83dd36.zip FreeBSD-src-61f69851ce83b009950cd7d7a3adca479d83dd36.tar.gz |
When parent directory has to be unlocked, lock it back with the same lock
type. Before this change, if directory was shared-locked, it was relocked
exclusively.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 8 | ||||
-rw-r--r-- | sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 8 |
2 files changed, 12 insertions, 4 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 95a1da7..711321a 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -1109,11 +1109,15 @@ zfs_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct componentname *cnp, } } if (error == 0 && (nm[0] != '.' || nm[1] != '\0')) { - if (cnp->cn_flags & ISDOTDOT) + int ltype = 0; + + if (cnp->cn_flags & ISDOTDOT) { + ltype = VOP_ISLOCKED(dvp, td); VOP_UNLOCK(dvp, 0, td); + } error = vn_lock(*vpp, cnp->cn_lkflags, td); if (cnp->cn_flags & ISDOTDOT) - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(dvp, ltype | LK_RETRY, td); if (error != 0) { VN_RELE(*vpp); *vpp = NULL; diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 95a1da7..711321a 100644 --- a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -1109,11 +1109,15 @@ zfs_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct componentname *cnp, } } if (error == 0 && (nm[0] != '.' || nm[1] != '\0')) { - if (cnp->cn_flags & ISDOTDOT) + int ltype = 0; + + if (cnp->cn_flags & ISDOTDOT) { + ltype = VOP_ISLOCKED(dvp, td); VOP_UNLOCK(dvp, 0, td); + } error = vn_lock(*vpp, cnp->cn_lkflags, td); if (cnp->cn_flags & ISDOTDOT) - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(dvp, ltype | LK_RETRY, td); if (error != 0) { VN_RELE(*vpp); *vpp = NULL; |