]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../lba_manager: convert remap_mappings to use cursors
authorSamuel Just <sjust@redhat.com>
Tue, 21 Oct 2025 21:59:58 +0000 (21:59 +0000)
committerSamuel Just <sjust@redhat.com>
Tue, 10 Mar 2026 17:11:33 +0000 (10:11 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/lba/btree_lba_manager.h
src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/transaction_manager.h

index b87defb72aebb9b38b8b3efca6fbec8800fc3689..c33b66513b6f174e1817d8f2642788c50819f889 100644 (file)
@@ -990,36 +990,36 @@ BtreeLBAManager::get_end_mapping(
 BtreeLBAManager::remap_ret
 BtreeLBAManager::remap_mappings(
   Transaction &t,
-  LBAMapping mapping,
+  LBACursorRef cursor,
   std::vector<remap_entry_t> remaps)
 {
   LOG_PREFIX(BtreeLBAManager::remap_mappings);
-  DEBUGT("{}", t, mapping);
-  assert(mapping.is_viewable());
-  assert(mapping.is_indirect() == mapping.is_complete_indirect());
+  DEBUGT("{}", t, *cursor);
+  assert(cursor->is_viewable());
+  auto orig_indirect = cursor->is_indirect();
+  auto orig_laddr = cursor->get_laddr();
+  auto orig_len = cursor->get_length();
   auto c = get_context(t);
   auto btree = co_await get_btree<LBABtree>(cache, c);
-  auto iter = btree.make_partial_iter(c, mapping.get_effective_cursor());
-  std::vector<LBAMapping> ret;
-  auto val = iter.get_val();
-  assert(val.refcount == EXTENT_DEFAULT_REF_COUNT);
-  assert(mapping.is_indirect() ||
-        (val.pladdr.is_paddr() &&
-         val.pladdr.get_paddr().is_absolute()));
-  auto old_key = mapping.get_key();
-  auto old_length = mapping.get_length();
-  auto old_indirect = mapping.is_indirect();
-  auto updated_cursor = co_await update_mapping_refcount(
-    c.trans, mapping.get_effective_cursor_ref(), -1);
-  iter = btree.make_partial_iter(c, *updated_cursor);
+  auto iter = btree.make_partial_iter(c, *cursor);
+  auto orig_val = iter.get_val();
+  std::vector<LBACursorRef> ret;
+  assert(orig_val.refcount == EXTENT_DEFAULT_REF_COUNT);
+  assert(orig_indirect ||
+        (orig_val.pladdr.is_paddr() &&
+         orig_val.pladdr.get_paddr().is_absolute()));
+  cursor = co_await update_mapping_refcount(
+    c.trans, cursor, -1);
+  iter = btree.make_partial_iter(c, *cursor);
   for (auto &remap : remaps) {
-    assert(remap.offset + remap.len <= old_length);
-    assert((bool)remap.extent == !old_indirect);
-    lba_map_val_t val;
-    auto new_key = (old_key + remap.offset).checked_to_laddr();
+    assert(remap.offset + remap.len <= orig_len);
+    assert((bool)remap.extent == !orig_indirect);
+    lba_map_val_t val = orig_val;
+    auto new_key = (orig_laddr + remap.offset).checked_to_laddr();
     val.len = remap.len;
     if (val.pladdr.is_laddr()) {
       auto laddr = val.pladdr.get_laddr();
+      DEBUGT("{} + {:#x}", t, laddr, remap.offset);
       val.pladdr = (laddr + remap.offset).checked_to_laddr();
     } else {
       auto paddr = val.pladdr.get_paddr();
@@ -1031,38 +1031,18 @@ BtreeLBAManager::remap_mappings(
     // committing the transaction
     auto p = co_await btree.insert(
       c, iter, new_key, std::move(val),
-      old_indirect
+      orig_indirect
         ? get_reserved_ptr<LBALeafNode, laddr_t>()
         : remap.extent);
     auto &[it, inserted] = p;
     ceph_assert(inserted);
-    if (old_indirect) {
-      ret.push_back(
-       LBAMapping::create_indirect(nullptr, it.get_cursor(c)));
-    } else {
-      ret.push_back(
-       LBAMapping::create_direct(it.get_cursor(c)));
-    }
-    it = co_await it.next(c);
-    iter = std::move(it);
-  }
-  if (mapping.is_indirect()) {
-    co_await mapping.direct_cursor->refresh();
-    for (auto &m : ret) {
-      m.direct_cursor = mapping.direct_cursor;
-    }
-  }
-  if (remaps.size() > 1 && mapping.is_indirect()) {
-    assert(mapping.direct_cursor->is_viewable());
-    co_await update_mapping_refcount(c.trans, mapping.direct_cursor, 1);
+    ret.push_back(it.get_cursor(c));
+    iter = co_await it.next(c);
   }
   co_await trans_intr::parallel_for_each(
     ret,
-    [](auto &remapped_mapping) {
-      return remapped_mapping.refresh(
-      ).si_then([&remapped_mapping](auto mapping) {
-       remapped_mapping = std::move(mapping);
-      });
+    [](auto &cursor) {
+      return cursor->refresh();
     });
   co_return ret;
 }
index 87c59c2a111d0cf841fce78b141fcef26ba749af..5ea1b88128065dde058dd487c4e9b84e6388815c 100644 (file)
@@ -198,7 +198,7 @@ public:
 
   remap_ret remap_mappings(
     Transaction &t,
-    LBAMapping mapping,
+    LBACursorRef mapping,
     std::vector<remap_entry_t> remaps) final;
 
   /**
index ba00f37a88cacc9a26fff61802027914e1f8bbf0..89f9a3dd6cd552a19885c6dbfd5d48b6871ce769 100644 (file)
@@ -159,7 +159,7 @@ public:
     {}
   };
   using remap_iertr = ref_iertr;
-  using remap_ret = remap_iertr::future<std::vector<LBAMapping>>;
+  using remap_ret = remap_iertr::future<std::vector<LBACursorRef>>;
 
   /**
    * remap_mappings
@@ -169,7 +169,7 @@ public:
    */
   virtual remap_ret remap_mappings(
     Transaction &t,
-    LBAMapping orig_mapping,
+    LBACursorRef orig_mapping,
     std::vector<remap_entry_t> remaps
     ) = 0;
 
index c3a8bbdb6a6508f6ed784fe1cb41ac1f97f2124a..11e171f70e634d4c17db1338e4a8a4cb38b96b6b 100644 (file)
@@ -1328,19 +1328,50 @@ private:
         remapped_extent->set_seen_by_users();
         remap.extent = remapped_extent.get();
       }
-     }
-
-     SUBTRACET(seastore_tm, "remapping pins...", t);
-     auto mapping_vec = co_await lba_manager->remap_mappings(
-       t,
-       pin,
-       std::vector<remap_entry_t>(remaps.begin(), remaps.end())
-       ).handle_error_interruptible(remap_pin_iertr::pass_further{},
-         crimson::ct_error::assert_all{
-         "TransactionManager::remap_pin hit invalid error"}
-       );
-       SUBDEBUGT(seastore_tm, "remapped {} pins", t, mapping_vec.size());
-       co_return std::move(mapping_vec);
+    }
+
+    auto cursors = co_await lba_manager->remap_mappings(
+      t,
+      pin.get_effective_cursor_ref(),
+      std::vector<remap_entry_t>(remaps.begin(), remaps.end())
+    ).handle_error_interruptible(
+      remap_pin_iertr::pass_further{},
+      crimson::ct_error::assert_all{
+       "TransactionManager::remap_pin hit invalid error"
+      }
+    );
+
+    std::vector<LBAMapping> ret;
+    if (pin.is_indirect()) {
+      co_await pin.direct_cursor->refresh();
+      for (auto &cursor : cursors) {
+       ret.push_back(
+         LBAMapping::create_indirect(
+           pin.direct_cursor,
+           cursor));
+      }
+    } else {
+      for (auto &cursor : cursors) {
+       ret.push_back(
+         LBAMapping::create_direct(
+           cursor));
+      }
+    }
+    if (remaps.size() > 1 && pin.is_indirect()) {
+      assert(pin.direct_cursor->is_viewable());
+      co_await lba_manager->update_mapping_refcount(
+       t, pin.direct_cursor, 1);
+    }
+    co_await trans_intr::parallel_for_each(
+      ret,
+      [](auto &remapped_mapping) {
+       return remapped_mapping.refresh(
+       ).si_then([&remapped_mapping](auto mapping) {
+         remapped_mapping = std::move(mapping);
+       });
+      });
+    SUBDEBUGT(seastore_tm, "remapped {} pins", t, ret.size());
+    co_return ret;
   }
 
   ref_iertr::future<LBAMapping> _remove(