aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_syscalls.c
diff options
context:
space:
mode:
authorIan Dowse <iedowse@FreeBSD.org>2002-06-28 20:06:47 +0000
committerIan Dowse <iedowse@FreeBSD.org>2002-06-28 20:06:47 +0000
commit84b2995b2f288b8e37a7da86eeb0f816a33cb44b (patch)
treebae8117b476354108de4855889b02267fea89758 /sys/kern/vfs_syscalls.c
parent0080a004d7c5ee42728876b1111cd3b04e8cf898 (diff)
downloadsrc-84b2995b2f288b8e37a7da86eeb0f816a33cb44b.tar.gz
src-84b2995b2f288b8e37a7da86eeb0f816a33cb44b.zip
In vn_mkdir(), use vrele() instead of vput() on the parent directory
vnode in the case that the target exists and is the same vnode as the parent (i.e. "mkdir ."). The namei() call does not leave the vnode locked in this case even though you might expect it to. This bug was mostly harmless in practice because unlocking an already unlocked vnode currently does not trigger any panics or warnings. Reviewed by: jeff
Notes
Notes: svn path=/head/; revision=98984
Diffstat (limited to 'sys/kern/vfs_syscalls.c')
-rw-r--r--sys/kern/vfs_syscalls.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 05e4fb65ec8b..41e4d285a8b6 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3652,7 +3652,15 @@ restart:
if (vp != NULL) {
NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(vp);
- vput(nd.ni_dvp);
+ /*
+ * XXX namei called with LOCKPARENT but not LOCKLEAF has
+ * the strange behaviour of leaving the vnode unlocked
+ * if the target is the same vnode as the parent.
+ */
+ if (vp == nd.ni_dvp)
+ vrele(nd.ni_dvp);
+ else
+ vput(nd.ni_dvp);
return (EEXIST);
}
if (vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) {