]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba/btree_lba_manager: never downcast reserved ptrs 64109/head
authorXuehan Xu <xuxuehan@qianxin.com>
Mon, 23 Jun 2025 10:32:55 +0000 (18:32 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 23 Jun 2025 10:33:37 +0000 (18:33 +0800)
Fixes: https://tracker.ceph.com/issues/71794
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/lba/btree_lba_manager.h

index 3fe901f8768bbdf58868533933d85a94360a0cb3..5baf44747007cd75661186c6362022c83836034f 100644 (file)
@@ -436,9 +436,13 @@ BtreeLBAManager::insert_mappings(
        ceph_assert(p.second);
        iter = std::move(p.first);
        auto &leaf_node = *iter.get_leaf_node();
+       bool need_reserved_ptr =
+         info.is_indirect_mapping() || info.is_zero_mapping();
        leaf_node.insert_child_ptr(
          iter.get_leaf_pos(),
-         info.extent,
+         need_reserved_ptr
+           ? get_reserved_ptr<LBALeafNode, laddr_t>()
+           : static_cast<BaseChildNode<LBALeafNode, laddr_t>*>(info.extent),
          leaf_node.get_size() - 1 /*the size before the insert*/);
        if (is_valid_child_ptr(info.extent)) {
          ceph_assert(info.value.pladdr.is_paddr());
index aef7325a370cd588a3dc073b8d54a26c33f8ed44..d5f2adb8129d1f923cbfb76f1088709c7ec23011 100644 (file)
@@ -286,6 +286,14 @@ private:
     lba_map_val_t value;
     LogicalChildNode* extent = nullptr;
 
+    bool is_zero_mapping() const {
+      return value.pladdr.is_paddr() && value.pladdr.get_paddr().is_zero();
+    }
+
+    bool is_indirect_mapping() const {
+      return value.pladdr.is_laddr();
+    }
+
     static alloc_mapping_info_t create_zero(extent_len_t len) {
       return {
        L_ADDR_NULL,
@@ -294,8 +302,7 @@ private:
          pladdr_t(P_ADDR_ZERO),
          EXTENT_DEFAULT_REF_COUNT,
          0
-       },
-       static_cast<LogicalChildNode*>(get_reserved_ptr<LBALeafNode, laddr_t>())};
+       }};
     }
     static alloc_mapping_info_t create_indirect(
       laddr_t laddr,
@@ -309,8 +316,7 @@ private:
          EXTENT_DEFAULT_REF_COUNT,
          0     // crc will only be used and checked with LBA direct mappings
                // also see pin_to_extent(_by_type)
-       },
-       static_cast<LogicalChildNode*>(get_reserved_ptr<LBALeafNode, laddr_t>())};
+       }};
     }
     static alloc_mapping_info_t create_direct(
       laddr_t laddr,