- from SharedBlob::put(), we try to remove ourselves from the set, but
have to deal with a racing lookup, so the removal is conditional on
nref still being 0.
- from split_cache(), we move the SharedBlob to another collection
- from make_blob_unshared(), we remove the entry when we clear the sbid.
The problem is that the condtiional remove() (for the first case) was being
used for all three cases, and in the second two cases nref is always != 0,
so it doesn't actually happen. This can lead to a crash during cache
shutdown.
Fix by making two variants: remove() that is unconditional, and
try_remove() that is conditional.
Set the sb->coll pointer after because remove() asserts the parent matches
where we are unregistering.
Fixes: http://tracker.ceph.com/issues/22039 Signed-off-by: Sage Weil <sage@redhat.com>