From: Xuehan Xu Date: Mon, 23 Jun 2025 10:32:55 +0000 (+0800) Subject: crimson/os/seastore/lba/btree_lba_manager: never downcast reserved ptrs X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f17a6c0e1f0834f08f729a8196589bbcd634f7a3;p=ceph.git crimson/os/seastore/lba/btree_lba_manager: never downcast reserved ptrs Fixes: https://tracker.ceph.com/issues/71794 Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.cc b/src/crimson/os/seastore/lba/btree_lba_manager.cc index 3fe901f8768b..5baf44747007 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba/btree_lba_manager.cc @@ -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() + : static_cast*>(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()); diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index aef7325a370c..d5f2adb8129d 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -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(get_reserved_ptr())}; + }}; } 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(get_reserved_ptr())}; + }}; } static alloc_mapping_info_t create_direct( laddr_t laddr,