cache: only evict negative entries on CREATE when ISLASTCN is set

This commit is contained in:
Mateusz Guzik 2020-08-26 12:50:57 +00:00
parent 935e15187c
commit 32f3d0821c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=364812

View File

@ -1398,15 +1398,17 @@ cache_lookup_dotdot(struct vnode *dvp, struct vnode **vpp, struct componentname
return (-1);
negative_success:
if (__predict_false(cnp->cn_nameiop == CREATE)) {
counter_u64_add(numnegzaps, 1);
error = cache_zap_locked_vnode(ncp, dvp);
if (__predict_false(error != 0)) {
zap_and_exit_bucket_fail2++;
cache_maybe_yield();
goto retry;
if (cnp->cn_flags & ISLASTCN) {
counter_u64_add(numnegzaps, 1);
error = cache_zap_locked_vnode(ncp, dvp);
if (__predict_false(error != 0)) {
zap_and_exit_bucket_fail2++;
cache_maybe_yield();
goto retry;
}
cache_free(ncp);
return (0);
}
cache_free(ncp);
return (0);
}
SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp, ncp->nc_name);
@ -1603,15 +1605,17 @@ cache_lookup_fallback(struct vnode *dvp, struct vnode **vpp, struct componentnam
negative_success:
/* We found a negative match, and want to create it, so purge */
if (__predict_false(cnp->cn_nameiop == CREATE)) {
counter_u64_add(numnegzaps, 1);
error = cache_zap_rlocked_bucket(ncp, cnp, hash, blp);
if (__predict_false(error != 0)) {
zap_and_exit_bucket_fail2++;
cache_maybe_yield();
goto retry;
if (cnp->cn_flags & ISLASTCN) {
counter_u64_add(numnegzaps, 1);
error = cache_zap_locked_vnode(ncp, dvp);
if (__predict_false(error != 0)) {
zap_and_exit_bucket_fail2++;
cache_maybe_yield();
goto retry;
}
cache_free(ncp);
return (0);
}
cache_free(ncp);
return (0);
}
SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp, ncp->nc_name);
@ -1658,13 +1662,6 @@ cache_lookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp,
return (0);
}
/*
* TODO: we only fallback becasue if a negative entry is found it will
* need to be purged.
*/
if (cnp->cn_nameiop == CREATE)
goto out_fallback;
hash = cache_get_hash(cnp->cn_nameptr, cnp->cn_namelen, dvp);
vfs_smr_enter();
@ -1723,6 +1720,13 @@ cache_lookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp,
return (-1);
negative_success:
if (__predict_false(cnp->cn_nameiop == CREATE)) {
if (cnp->cn_flags & ISLASTCN) {
vfs_smr_exit();
goto out_fallback;
}
}
SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp, ncp->nc_name);
cache_out_ts(ncp, tsp, ticksp);
counter_u64_add(numneghits, 1);