]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/transaction_manager: prevent paddr from
authorXuehan Xu <xuxuehan@qianxin.com>
Sun, 24 May 2026 07:27:04 +0000 (15:27 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Thu, 28 May 2026 13:32:13 +0000 (21:32 +0800)
 being passed across coroutines.

This is because rewrite transactions no longer invalidates other
transactions, so if paddr get passed across coroutines, it may
become outdated.

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/transaction_manager.h

index e549572bd1491172dca8325d5a89920236ad30de..eefba35366663de1b2ecd087e22d0e4e91723b14 100644 (file)
@@ -1508,10 +1508,10 @@ private:
     }
 #endif
 
+    co_await pin.co_refresh();
     if (pin.is_indirect()) {
       SUBDEBUGT(seastore_tm, "{} into {} remaps ...",
         t, pin, remaps.size());
-      co_await pin.co_refresh();
       pin = co_await complete_mapping(t, std::move(pin));
     } else {
       laddr_t original_laddr = pin.get_key();
@@ -1522,7 +1522,6 @@ private:
       ceph_assert(!pin.is_clone());
 
       TCachedExtentRef<T> extent;
-      co_await pin.co_refresh();
       if (full_extent_integrity_check) {
         SUBTRACET(seastore_tm, "{} reading pin...", t, pin);
         // read the entire extent from disk (See: pin_to_extent)
@@ -1544,7 +1543,7 @@ private:
           auto &child_pos = ret.get_child_pos();
           auto laddr = pin.get_key();
           auto ext = cache->retire_absent_extent_addr_by_type(
-            t, laddr, original_paddr, original_len, pin.get_extent_type(),
+            t, laddr, pin.get_val(), original_len, pin.get_extent_type(),
             [&child_pos, laddr](auto &extent) mutable {
               auto lextent = extent.template cast<LogicalChildNode>();
               assert(extent.is_logical());
@@ -1585,7 +1584,7 @@ private:
         SUBDEBUGT(seastore_tm, "extent fully loaded...", t);
         ceph_assert(extent->is_data_stable());
         ceph_assert(extent->get_length() >= original_len);
-        ceph_assert(extent->get_paddr() == original_paddr);
+        ceph_assert(extent->get_paddr() == pin.get_val());
         original_bptr = extent->get_bptr();
       }
       if (extent) {
@@ -1597,7 +1596,7 @@ private:
         auto remap_offset = remap.offset;
         auto remap_len = remap.len;
         auto remap_laddr = (original_laddr + remap_offset).checked_to_laddr();
-        auto remap_paddr = original_paddr.add_offset(remap_offset);
+        auto remap_paddr = pin.get_val().add_offset(remap_offset);
         auto shadow_paddr = P_ADDR_NULL;
         if (pin.has_shadow_val()) {
           assert(pin.get_shadow_val() != P_ADDR_NULL);