diff options
author | mjg <mjg@FreeBSD.org> | 2015-07-04 15:46:39 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2015-07-04 15:46:39 +0000 |
commit | 5f11a6efee734d04b8fe17a08d8874aaf21e9584 (patch) | |
tree | 7622309a0bb0e8a95f1b826ef0c52474e7b09a33 | |
parent | a0dcef47a21a3f97f54486d540a1c1c4ef230c3f (diff) | |
download | FreeBSD-src-5f11a6efee734d04b8fe17a08d8874aaf21e9584.zip FreeBSD-src-5f11a6efee734d04b8fe17a08d8874aaf21e9584.tar.gz |
vfs: use shared vnode locking when looking up ".." in vop_stdvptocnp
Briefly discussed with: kib
-rw-r--r-- | sys/kern/vfs_default.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index d6b3765..d70b685 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -810,7 +810,7 @@ vop_stdvptocnp(struct vop_vptocnp_args *ap) VREF(vp); locked = VOP_ISLOCKED(vp); VOP_UNLOCK(vp, 0); - NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, + NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE, "..", vp, td); flags = FREAD; error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL); @@ -830,7 +830,7 @@ vop_stdvptocnp(struct vop_vptocnp_args *ap) VOP_UNLOCK(mvp, 0); vn_close(mvp, FREAD, cred, td); VREF(*dvp); - vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY); + vn_lock(*dvp, LK_SHARED | LK_RETRY); covered = 1; } @@ -859,15 +859,15 @@ vop_stdvptocnp(struct vop_vptocnp_args *ap) (dp->d_fileno == fileno)) { if (covered) { VOP_UNLOCK(*dvp, 0); - vn_lock(mvp, LK_EXCLUSIVE | LK_RETRY); + vn_lock(mvp, LK_SHARED | LK_RETRY); if (dirent_exists(mvp, dp->d_name, td)) { error = ENOENT; VOP_UNLOCK(mvp, 0); - vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY); + vn_lock(*dvp, LK_SHARED | LK_RETRY); goto out; } VOP_UNLOCK(mvp, 0); - vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY); + vn_lock(*dvp, LK_SHARED | LK_RETRY); } i -= dp->d_namlen; |