We can work on shared mechanics without requiring a full locking server.
We can stand up a simple layer which uses shared data structures in a
kernel image to lock between mounts in the same kernel.
On mount we add supers to a list. Held locks are tracked in a rbtree.
A lock attempt blocks until it doesn't conflict with anything in the
rbtree.
As locks are acquired we walk all the other supers and write/invaludate
any items they have which intersect with the acquired range. This is
easier to implement and less efficient than caching locks after they're
unlocked and implementing downconvert/blocking/revoke.
Signed-off-by: Zach Brown <zab@versity.com>