os/bluestore: fix a bug causing unexpected Onode's unpinned state.
There could be a race for Onodes put() and get() methods:
put()(pinned, nref=3)
int n = --nref; (nref = 2)
if (n == 2) {
..
std::lock_guard l(ocs->lock);
...
pinned = pinned && nref > 2; (= false)
... get()
if (r) { ++nref; (=3)
n = --nref; (nref = 2) return;
}
...
return
As a result nref = 2, pinned = false which is wrong
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit
ea0fc57ef57eddc1fb9610850ae766c9fd582bae)