]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.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, 9 Dec 2025 03:44:34 +0000 (19:44 -0800)
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 09c3283053b67d28fff874ceffa77b2430bd9307..4f43f7b37a1da865381cb24228b802190a3fd095 100644 (file)
@@ -928,34 +928,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 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 <= mapping.get_length());
-    assert((bool)remap.extent == !mapping.is_indirect());
-    lba_map_val_t val;
-    auto old_key = mapping.get_key();
-    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();
@@ -968,42 +970,21 @@ BtreeLBAManager::remap_mappings(
     auto &[it, inserted] = p;
     ceph_assert(inserted);
     auto &leaf_node = *it.get_leaf_node();
-    if (mapping.is_indirect()) {
+    if (orig_indirect) {
       leaf_node.insert_child_ptr(
        it.get_leaf_pos(),
        get_reserved_ptr<LBALeafNode, laddr_t>(),
        leaf_node.get_size() - 1 /*the size before the insert*/);
-      ret.push_back(
-       LBAMapping::create_indirect(nullptr, it.get_cursor(c)));
+      ret.push_back(it.get_cursor(c));
     } else {
       leaf_node.insert_child_ptr(
        it.get_leaf_pos(),
        remap.extent,
        leaf_node.get_size() - 1 /*the size before the insert*/);
-      ret.push_back(
-       LBAMapping::create_direct(it.get_cursor(c)));
+      ret.push_back(it.get_cursor(c));
     }
-    it = co_await it.next(c);
-    iter = std::move(it);
+    iter = co_await it.next(c);
   }
-  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);
-  }
-  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);
-      });
-    });
   co_return ret;
 }
 
index 1c1ef64458fc7549d9767192e200ed5a34f27229..dcfde3aba0982acb2a509d79b3b1fc5cef2e509d 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 e69fc03bea05c1403034e4bf77bb24e59460efcd..65fc098b1167d2e2c9f3656e36c61b4af5267c20 100644 (file)
@@ -156,7 +156,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
@@ -166,7 +166,7 @@ public:
    */
   virtual remap_ret remap_mappings(
     Transaction &t,
-    LBAMapping orig_mapping,
+    LBACursorRef orig_mapping,
     std::vector<remap_entry_t> remaps
     ) = 0;
 
index 78c122a385cad155cdc0cc8e144881d95d5e0d8e..9e95b600438a50ea18908968d326ca5684013ff5 100644 (file)
@@ -1314,9 +1314,10 @@ private:
        remap.extent = extent.get();
       }
     }
-    auto ret = co_await lba_manager->remap_mappings(
+
+    auto cursors = co_await lba_manager->remap_mappings(
       t,
-      std::move(pin),
+      pin.get_effective_cursor_ref(),
       std::vector<remap_entry_t>(remaps.begin(), remaps.end())
     ).handle_error_interruptible(
       remap_pin_iertr::pass_further{},
@@ -1324,6 +1325,36 @@ private:
        "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;
   }