diff options
author | jh <jh@FreeBSD.org> | 2010-03-26 11:33:12 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2010-03-26 11:33:12 +0000 |
commit | 7a3d363cfe96b48669f0ff7bdfa679eb4ae844b6 (patch) | |
tree | 99dc3084e3b62033c4808aef4bb84822ac5066e6 /sys | |
parent | 019a98ec0a78ed8abd2bba367347a5b41ac1864f (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/vfs_lookup.c | 20 |
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; |