With reduced span cache time the block service cache
is no longer needed. We also don't need to fetch
changed block services from registry as we'll get
it as part of span fetches.
Things not done because probably disruptive:
* kmod filesystem string
* sysctl/debugfs/trace
* metrics names
* xmon instance names
Some of these might be renamed too, but starting with a relatively
safe set.
This saves quite a bit of space in the span structure. I'm doing this
in preparation for stripe-level span cache, since I plan to just tie
the span metadata lifetime to the inode lifetime, so space savings
in `struct eggsfs_span` are a good thing.
I think it also makes good sense, block service updates are propagated
instantly.
And hopefully reduce the likelihood of bugs. On the write end, given
that we do things less asynchronously, things might be a bit slower,
but I think the simplification is worth it for now.
Also, fix/improve a bunch of other stuff.
With seqcount with the current locking strategy we can get into
subtle nasty situations. For now, just be "dumb" with a rw semaphore.
For example, consider the case where we get the span in the
seqcount protected section in get_span. Between getting the
span and acquiring it the reclaimer might free it.
Ideally we'd do something similar to what Paweł planned (seqcount
and RCU protection) but let's start with something simple which
seems to work.
Also, shard the LRU by 128, to reduce contention, and fix a couple
of unrelated bugs.
Initial version really by Pawel, but many changes in between.
Big outstanding issues:
* span cache reclamation (unbounded memory otherwise...)
* bad block service detection and workarounds
* corrupted blocks detection and workaround
Co-authored-by: Paweł Dziepak <pawel.dziepak@xtxmarkets.com>