]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: duplicate_for_write() to move set_laddr() into Cache
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 20 Mar 2025 06:39:20 +0000 (14:39 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 21 Mar 2025 03:19:28 +0000 (11:19 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/transaction_manager.h

index 86f816e1648960baff6c4d83f933f9e3ee54158c..2a2488d64cd0fbc8eaaafaa88954455f36adaa85 100644 (file)
@@ -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<LogicalCachedExtent&>(*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<LogicalCachedExtent&>(*i);
+    assert(lextent.has_laddr());
+    assert(ret->is_logical());
+    static_cast<LogicalCachedExtent&>(*ret).set_laddr(lextent.get_laddr());
+  }
   DEBUGT("{} -> {}", t, *i, *ret);
   return ret;
 }
index 5bb06b4d02a79b50a8fe2d7502837060525a185d..978e28d99c403cab0d490b9d5fd11f2fa3836eaa 100644 (file)
@@ -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<LogicalChildNode>();
-    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<LogicalChildNode>();
   }
 
   using ref_iertr = LBAManager::ref_iertr;