From bab78dc3bf80c800d4d57eeeb855f3d74052ce47 Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Thu, 25 May 2023 19:20:51 +0000 Subject: [PATCH] os/bluestore: Add lock in ExtentMap::dup _dup_writing requires locking of BufferCacheShard Signed-off-by: Adam Kupczyk --- src/os/bluestore/BlueStore.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 0378dbf555f0..060b6e2f3f06 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -2551,6 +2551,16 @@ void BlueStore::ExtentMap::dump(Formatter* f) const void BlueStore::ExtentMap::dup(BlueStore* b, TransContext* txc, CollectionRef& c, OnodeRef& oldo, OnodeRef& newo, uint64_t& srcoff, uint64_t& length, uint64_t& dstoff) { + //_dup_writing needs cache lock + BufferCacheShard* coll_cache; + do { + coll_cache = c->cache; + coll_cache->lock.lock(); + if (coll_cache == c->cache) { + break; + } + coll_cache->lock.unlock(); + } while (true); auto cct = onode->c->store->cct; bool inject_21040 = @@ -2662,6 +2672,8 @@ void BlueStore::ExtentMap::dup(BlueStore* b, TransContext* txc, newo->onode.size = dstoff + length; } newo->extent_map.dirty_range(dstoff, length); + //_dup_writing needs cache lock + coll_cache->lock.unlock(); } void BlueStore::ExtentMap::update(KeyValueDB::Transaction t, bool force) -- 2.47.3