summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_lookup.c
diff options
context:
space:
mode:
authorjh <jh@FreeBSD.org>2010-03-26 11:33:12 +0000
committerjh <jh@FreeBSD.org>2010-03-26 11:33:12 +0000
commit7a3d363cfe96b48669f0ff7bdfa679eb4ae844b6 (patch)
tree99dc3084e3b62033c4808aef4bb84822ac5066e6 /sys/kern/vfs_lookup.c
parent019a98ec0a78ed8abd2bba367347a5b41ac1864f (diff)
downloadFreeBSD-src-7a3d363cfe96b48669f0ff7bdfa679eb4ae844b6.zip
FreeBSD-src-7a3d363cfe96b48669f0ff7bdfa679eb4ae844b6.tar.gz
Support only LOOKUP operation for "/" in relookup() because lookup()
can't succeed for CREATE, DELETE and RENAME. Discussed with: bde
Diffstat (limited to 'sys/kern/vfs_lookup.c')
-rw-r--r--sys/kern/vfs_lookup.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index 6f10b49..5b6ccf6 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -948,19 +948,17 @@ relookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)
#endif
/*
- * Check for degenerate name (e.g. / or "")
- * which is a way of talking about a directory,
- * e.g. like "/." or ".".
+ * Check for "" which represents the root directory after slash
+ * removal.
*/
if (cnp->cn_nameptr[0] == '\0') {
- if (cnp->cn_nameiop != LOOKUP || wantparent) {
- error = EISDIR;
- goto bad;
- }
- if (dp->v_type != VDIR) {
- error = ENOTDIR;
- goto bad;
- }
+ /*
+ * Support only LOOKUP for "/" because lookup()
+ * can't succeed for CREATE, DELETE and RENAME.
+ */
+ KASSERT(cnp->cn_nameiop == LOOKUP, ("nameiop must be LOOKUP"));
+ KASSERT(dp->v_type == VDIR, ("dp is not a directory"));
+
if (!(cnp->cn_flags & LOCKLEAF))
VOP_UNLOCK(dp, 0);
*vpp = dp;
OpenPOWER on IntegriCloud