summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2007-05-02 00:41:44 +0000
committerpjd <pjd@FreeBSD.org>2007-05-02 00:41:44 +0000
commit61f69851ce83b009950cd7d7a3adca479d83dd36 (patch)
tree165b0d16befe35ea2b412eeb1ae58afb49446c8a
parentc228d77c51a9260219543e18fc090604b681e325 (diff)
downloadFreeBSD-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.
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c8
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c8
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;
OpenPOWER on IntegriCloud