]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
os/bluestore: fix a bug causing unexpected Onode's unpinned state. 39041/head
authorIgor Fedotov <ifedotov@suse.com>
Sat, 23 Jan 2021 17:33:13 +0000 (20:33 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Tue, 2 Feb 2021 09:25:00 +0000 (12:25 +0300)
commitea0fc57ef57eddc1fb9610850ae766c9fd582bae
treed420f4376af0f1ada09e3670ca30c0336658e05f
parent541b85e6ec8bda736f57a988d38661f6ce74a39a
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>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h