From ee9195d09efa6773a1abe2390de9d29543228c81 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Wed, 13 Jul 2022 20:45:05 +0800 Subject: [PATCH] crimson/os/seastore: fix bug of Transaction::is_retired The retired extent may exist as a RetiredExtentPlaceholder, casting this extent to LogicalCachedExtent will cause undefined behavior. Signed-off-by: Zhang Song --- src/crimson/os/seastore/transaction.h | 11 +++++------ src/crimson/os/seastore/transaction_manager.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 78150ddb58661..4cb6273217ed6 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -261,7 +261,7 @@ public: return retired_set; } - bool is_retired(laddr_t laddr, extent_len_t len, paddr_t paddr) { + bool is_retired(paddr_t paddr, extent_len_t len) { if (retired_set.empty()) { return false; } @@ -271,11 +271,10 @@ public: assert(iter != retired_set.begin()); --iter; } - - auto lextent = (*iter)->cast(); - auto ext_laddr = lextent->get_laddr(); - return ext_laddr <= laddr && - ext_laddr + lextent->get_length() >= laddr + len; + auto retired_paddr = (*iter)->get_paddr(); + auto retired_length = (*iter)->get_length(); + return retired_paddr <= paddr && + retired_paddr.add_offset(retired_length) >= paddr.add_offset(len); } bool should_record_release(paddr_t addr) { diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 2bfb7c69e9ac5..d5c153df43cf9 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -386,7 +386,7 @@ public: reclaim_gen_t gen = DIRTY_GENERATION) { LOG_PREFIX(TransactionManager::map_existing_extent); ceph_assert(existing_paddr.is_absolute()); - assert(t.is_retired(laddr_hint, length, existing_paddr)); + assert(t.is_retired(existing_paddr, length)); auto bp = ceph::bufferptr(buffer::create_page_aligned(length)); bp.zero(); -- 2.39.5