tmpfs: push VEXEC check into tmpfs_lookup()
vfs_cache_lookup() has already done the appropriate VEXEC check, therefore we must not re-check in VOP_CACHEDLOOKUP. This fixes O_SEARCH semantics on tmpfs and removes a redundant descent into VOP_ACCESS() in the common case. Reported-by: arichardson (via CheriBSD Jenkins CI) Reviewed-by: kib MFC-after: 3 days Differential Revision: https://reviews.freebsd.org/D28401
This commit is contained in:
parent
8a51f14a78
commit
0f919ed4ae
@ -91,14 +91,10 @@ tmpfs_lookup1(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)
|
||||
struct tmpfs_mount *tm;
|
||||
int error;
|
||||
|
||||
/* Caller assumes responsibility for ensuring access (VEXEC). */
|
||||
dnode = VP_TO_TMPFS_DIR(dvp);
|
||||
*vpp = NULLVP;
|
||||
|
||||
/* Check accessibility of requested node as a first step. */
|
||||
error = vn_dir_check_exec(dvp, cnp);
|
||||
if (error != 0)
|
||||
goto out;
|
||||
|
||||
/* We cannot be requesting the parent directory of the root node. */
|
||||
MPASS(IMPLIES(dnode->tn_type == VDIR &&
|
||||
dnode->tn_dir.tn_parent == dnode,
|
||||
@ -241,8 +237,17 @@ tmpfs_cached_lookup(struct vop_cachedlookup_args *v)
|
||||
static int
|
||||
tmpfs_lookup(struct vop_lookup_args *v)
|
||||
{
|
||||
struct vnode *dvp = v->a_dvp;
|
||||
struct vnode **vpp = v->a_vpp;
|
||||
struct componentname *cnp = v->a_cnp;
|
||||
int error;
|
||||
|
||||
return (tmpfs_lookup1(v->a_dvp, v->a_vpp, v->a_cnp));
|
||||
/* Check accessibility of requested node as a first step. */
|
||||
error = vn_dir_check_exec(dvp, cnp);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
return (tmpfs_lookup1(dvp, vpp, cnp));
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
x
Reference in New Issue
Block a user