aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2020-12-28 00:12:28 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2020-12-28 01:53:27 +0000
commitff97bc034fcdf16207ed75e43622e9f0d91fa553 (patch)
treec1627507c49b14ecb697fc747f6ccf832d1a31a4
parent833dbf1e2288f72ce8338fa43dad6088c3f2010a (diff)
downloadsrc-ff97bc034fcdf16207ed75e43622e9f0d91fa553.tar.gz
src-ff97bc034fcdf16207ed75e43622e9f0d91fa553.zip
cache: simplify lockless dot lookups
-rw-r--r--sys/kern/vfs_cache.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 75c362534c91..22dfe01ac624 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -4317,19 +4317,18 @@ cache_fplookup_noentry(struct cache_fpl *fpl)
static int __noinline
cache_fplookup_dot(struct cache_fpl *fpl)
{
- struct vnode *dvp;
-
- dvp = fpl->dvp;
- fpl->tvp = dvp;
- fpl->tvp_seqc = vn_seqc_read_any(dvp);
- if (seqc_in_modify(fpl->tvp_seqc)) {
- return (cache_fpl_aborted(fpl));
- }
+ MPASS(!seqc_in_modify(fpl->dvp_seqc));
+ /*
+ * Just re-assign the value. seqc will be checked later for the first
+ * non-dot path component in line and/or before deciding to return the
+ * vnode.
+ */
+ fpl->tvp = fpl->dvp;
+ fpl->tvp_seqc = fpl->dvp_seqc;
counter_u64_add(dothits, 1);
- SDT_PROBE3(vfs, namecache, lookup, hit, dvp, ".", dvp);
-
+ SDT_PROBE3(vfs, namecache, lookup, hit, fpl->dvp, ".", fpl->dvp);
return (0);
}