From: Xuehan Xu Date: Fri, 22 Aug 2025 07:58:08 +0000 (+0000) Subject: crimson/os/seastore/lba_manager: add the interface method to remove X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=41fe057c57a89f42155b737644f744e675e1d6f1;p=ceph.git crimson/os/seastore/lba_manager: add the interface method to remove indirect mapping without touching the corresponding direct one Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba/btree_lba_manager.h b/src/crimson/os/seastore/lba/btree_lba_manager.h index c24d89b73e157..e91dc10270686 100644 --- a/src/crimson/os/seastore/lba/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba/btree_lba_manager.h @@ -225,6 +225,23 @@ public: }); } + ref_ret remove_indirect_mapping_only( + Transaction &t, + LBAMapping mapping) final { + assert(mapping.is_viewable()); + assert(mapping.is_indirect()); + return seastar::do_with( + std::move(mapping), + [&t, this](auto &mapping) { + return update_refcount(t, mapping.indirect_cursor.get(), -1 + ).si_then([](auto res) { + return ref_iertr::make_ready_future< + ref_update_result_t>(ref_update_result_t{ + std::move(res), std::nullopt}); + }); + }); + } + ref_ret remove_mapping( Transaction &t, LBAMapping mapping) final { diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index e6567b059040e..c551e5ea21f3c 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -184,6 +184,19 @@ public: Transaction &t, LBAMapping mapping) = 0; + /* + * remove_indirect_mapping_only + * + * Remove the indirect mapping without touch the corresponding + * direct one. + * + * @return returns the information about the removed + * indirect mapping. + */ + virtual ref_ret remove_indirect_mapping_only( + Transaction &t, + LBAMapping mapping) = 0; + /** * Increments ref count on extent * diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 454d01fc45078..82532a5657444 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -248,6 +248,18 @@ TransactionManager::remove( }); } +TransactionManager::ref_iertr::future +TransactionManager::_remove_indirect_mapping_only( + Transaction &t, + LBAMapping mapping) +{ + return lba_manager->remove_indirect_mapping_only( + t, std::move(mapping) + ).si_then([](auto result) { + return std::move(result.result.mapping); + }); +} + TransactionManager::ref_iertr::future< TransactionManager::_remove_mapping_result_t> TransactionManager::_remove_indirect_mapping( diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 95ad4febd2b65..2a35c7e34d10a 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -1380,6 +1380,10 @@ private: _remove_direct_mapping( Transaction &t, LBAMapping mapping); + ref_iertr::future + _remove_indirect_mapping_only( + Transaction &t, + LBAMapping mapping); rewrite_extent_ret rewrite_logical_extent( Transaction& t,