From: Igor Fedotov Date: Fri, 19 Mar 2021 09:53:20 +0000 (+0300) Subject: os/bluestore: acquire proper lock in split_cache() X-Git-Tag: v15.2.13~13^2~3^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F40441%2Fhead;p=ceph.git os/bluestore: acquire proper lock in split_cache() Fixes: https://tracker.ceph.com/issues/49900 Signed-off-by: Igor Fedotov (cherry picked from commit 35a3f7be8f2f204ad3b5e720d0534ca3e2a8587c) --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 3dab8041fbe8e..5a723876165fe 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4028,10 +4028,15 @@ void BlueStore::Collection::split_cache( { ldout(store->cct, 10) << __func__ << " to " << dest << dendl; - // lock (one or both) cache shards - std::lock(cache->lock, dest->cache->lock); - std::lock_guard l(cache->lock, std::adopt_lock); - std::lock_guard l2(dest->cache->lock, std::adopt_lock); + auto *ocache = get_onode_cache(); + auto *ocache_dest = dest->get_onode_cache(); + + // lock cache shards + std::lock(ocache->lock, ocache_dest->lock, cache->lock, dest->cache->lock); + std::lock_guard l(ocache->lock, std::adopt_lock); + std::lock_guard l2(ocache_dest->lock, std::adopt_lock); + std::lock_guard l3(cache->lock, std::adopt_lock); + std::lock_guard l4(dest->cache->lock, std::adopt_lock); int destbits = dest->cnode.bits; spg_t destpg;