From: Yingxin Cheng Date: Thu, 20 Mar 2025 06:39:20 +0000 (+0800) Subject: crimson/os/seastore: duplicate_for_write() to move set_laddr() into Cache X-Git-Tag: v20.3.0~283^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c6b58b1502d8c656c53535a038f7dd00fffcb0f9;p=ceph.git crimson/os/seastore: duplicate_for_write() to move set_laddr() into Cache Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 86f816e1648..2a2488d64cd 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1155,10 +1155,13 @@ CachedExtentRef Cache::duplicate_for_write( LOG_PREFIX(Cache::duplicate_for_write); assert(i->is_fully_loaded()); - if (i->is_mutable()) + if (i->is_mutable()) { return i; + } if (i->is_exist_clean()) { + assert(i->is_logical()); + assert(static_cast(*i).has_laddr()); i->version++; i->state = CachedExtent::extent_state_t::EXIST_MUTATION_PENDING; i->last_committed_crc = i->calc_crc32c(); @@ -1189,6 +1192,12 @@ CachedExtentRef Cache::duplicate_for_write( ret->version++; ret->state = CachedExtent::extent_state_t::MUTATION_PENDING; + if (i->is_logical()) { + auto& lextent = static_cast(*i); + assert(lextent.has_laddr()); + assert(ret->is_logical()); + static_cast(*ret).set_laddr(lextent.get_laddr()); + } DEBUGT("{} -> {}", t, *i, *ret); return ret; } diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 5bb06b4d02a..978e28d99c4 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -322,18 +322,7 @@ public: /// Obtain mutable copy of extent LogicalChildNodeRef get_mutable_extent(Transaction &t, LogicalChildNodeRef ref) { - LOG_PREFIX(TransactionManager::get_mutable_extent); - auto ret = cache->duplicate_for_write( - t, - ref)->cast(); - if (!ret->has_laddr()) { - SUBDEBUGT(seastore_tm, "duplicate from {}", t, *ref); - ret->set_laddr(ref->get_laddr()); - } else { - assert(ref->is_mutable()); - assert(&*ref == &*ret); - } - return ret; + return cache->duplicate_for_write(t, ref)->cast(); } using ref_iertr = LBAManager::ref_iertr;