return (true);
}
-static int
+static int __noinline
cache_fplookup_dirfd(struct cache_fpl *fpl, struct vnode **vpp)
{
struct nameidata *ndp;
+ struct componentname *cnp;
int error;
bool fsearch;
ndp = fpl->ndp;
+ cnp = fpl->cnp;
+
error = fgetvp_lookup_smr(ndp->ni_dirfd, ndp, vpp, &fsearch);
if (__predict_false(error != 0)) {
return (cache_fpl_aborted(fpl));
}
fpl->fsearch = fsearch;
+ if ((*vpp)->v_type != VDIR) {
+ if (!((cnp->cn_flags & EMPTYPATH) != 0 && cnp->cn_pnbuf[0] == '\0')) {
+ cache_fpl_smr_exit(fpl);
+ return (cache_fpl_handled_error(fpl, ENOTDIR));
+ }
+ }
return (0);
}