From f17a6c0e1f0834f08f729a8196589bbcd634f7a3 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Mon, 23 Jun 2025 18:32:55 +0800 Subject: [PATCH] crimson/os/seastore/lba/btree_lba_manager: never downcast reserved ptrs Fixes: https://tracker.ceph.com/issues/71794 Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/lba/btree_lba_manager.cc | 6 +++++- src/crimson/os/seastore/lba/btree_lba_manager.h | 14 ++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.cc b/src/crimson/os/seastore/lba/btree_lba_manager.cc index 3fe901f8768..5baf4474700 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 aef7325a370..d5f2adb8129 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, -- 2.47.3