From: Adam Kupczyk Date: Thu, 25 May 2023 19:20:51 +0000 (+0000) Subject: os/bluestore: Add lock in ExtentMap::dup X-Git-Tag: v19.0.0~486^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bab78dc3bf80c800d4d57eeeb855f3d74052ce47;p=ceph.git os/bluestore: Add lock in ExtentMap::dup _dup_writing requires locking of BufferCacheShard Signed-off-by: Adam Kupczyk --- 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)