Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/vfs_cache.c
Show First 20 Lines • Show All 3,023 Lines • ▼ Show 20 Lines | if (mac_vnode_check_lookup_enabled()) { | ||||
cache_fpl_aborted(fpl); | cache_fpl_aborted(fpl); | ||||
return (false); | return (false); | ||||
} | } | ||||
#endif | #endif | ||||
if ((cnp->cn_flags & ~CACHE_FPL_SUPPORTED_CN_FLAGS) != 0) { | if ((cnp->cn_flags & ~CACHE_FPL_SUPPORTED_CN_FLAGS) != 0) { | ||||
cache_fpl_aborted(fpl); | cache_fpl_aborted(fpl); | ||||
return (false); | return (false); | ||||
} | } | ||||
if ((cnp->cn_flags & LOCKLEAF) == 0) { | |||||
cache_fpl_aborted(fpl); | |||||
return (false); | |||||
} | |||||
if (cnp->cn_nameiop != LOOKUP) { | if (cnp->cn_nameiop != LOOKUP) { | ||||
cache_fpl_aborted(fpl); | cache_fpl_aborted(fpl); | ||||
return (false); | return (false); | ||||
} | } | ||||
if (ndp->ni_dirfd != AT_FDCWD) { | if (ndp->ni_dirfd != AT_FDCWD) { | ||||
cache_fpl_aborted(fpl); | cache_fpl_aborted(fpl); | ||||
return (false); | return (false); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | cache_fplookup_final(struct cache_fpl *fpl) | ||||
cnp = fpl->cnp; | cnp = fpl->cnp; | ||||
dvp = fpl->dvp; | dvp = fpl->dvp; | ||||
dvp_seqc = fpl->dvp_seqc; | dvp_seqc = fpl->dvp_seqc; | ||||
tvp = fpl->tvp; | tvp = fpl->tvp; | ||||
tvp_seqc = fpl->tvp_seqc; | tvp_seqc = fpl->tvp_seqc; | ||||
VNPASS(cache_fplookup_vnode_supported(dvp), dvp); | VNPASS(cache_fplookup_vnode_supported(dvp), dvp); | ||||
MPASS((cnp->cn_flags & LOCKLEAF) != 0); | |||||
tvs = vget_prep_smr(tvp); | tvs = vget_prep_smr(tvp); | ||||
if (tvs == VGET_NONE) { | if (tvs == VGET_NONE) { | ||||
return (cache_fpl_partial(fpl)); | return (cache_fpl_partial(fpl)); | ||||
} | } | ||||
if (!vn_seqc_consistent(dvp, dvp_seqc)) { | if (!vn_seqc_consistent(dvp, dvp_seqc)) { | ||||
cache_fpl_smr_exit(fpl); | cache_fpl_smr_exit(fpl); | ||||
vget_abort(tvp, tvs); | vget_abort(tvp, tvs); | ||||
return (cache_fpl_aborted(fpl)); | return (cache_fpl_aborted(fpl)); | ||||
} | } | ||||
cache_fpl_smr_exit(fpl); | cache_fpl_smr_exit(fpl); | ||||
if ((cnp->cn_flags & LOCKLEAF) != 0) { | |||||
error = vget_finish(tvp, cnp->cn_lkflags, tvs); | error = vget_finish(tvp, cnp->cn_lkflags, tvs); | ||||
if (error != 0) { | if (error != 0) { | ||||
return (cache_fpl_aborted(fpl)); | return (cache_fpl_aborted(fpl)); | ||||
} | } | ||||
} else { | |||||
vget_finish_ref(tvp, tvs); | |||||
} | |||||
if (!vn_seqc_consistent(tvp, tvp_seqc)) { | if (!vn_seqc_consistent(tvp, tvp_seqc)) { | ||||
if ((cnp->cn_flags & LOCKLEAF) != 0) | |||||
vput(tvp); | vput(tvp); | ||||
else | |||||
vrele(tvp); | |||||
return (cache_fpl_aborted(fpl)); | return (cache_fpl_aborted(fpl)); | ||||
} | } | ||||
return (cache_fpl_handled(fpl, 0)); | return (cache_fpl_handled(fpl, 0)); | ||||
} | } | ||||
static int | static int | ||||
cache_fplookup_next(struct cache_fpl *fpl) | cache_fplookup_next(struct cache_fpl *fpl) | ||||
▲ Show 20 Lines • Show All 551 Lines • Show Last 20 Lines |