]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: fix bug of Transaction::is_retired 47081/head
authorZhang Song <zhangsong325@gmail.com>
Wed, 13 Jul 2022 12:45:05 +0000 (20:45 +0800)
committerZhang Song <zhangsong325@gmail.com>
Wed, 13 Jul 2022 12:45:05 +0000 (20:45 +0800)
The retired extent may exist as a RetiredExtentPlaceholder, casting
this extent to LogicalCachedExtent will cause undefined behavior.

Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.h

index 78150ddb58661269d2fd0efd06a630702f323628..4cb6273217ed61aaf9ebb294f96165a6415322ca 100644 (file)
@@ -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<LogicalCachedExtent>();
-    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) {
index 2bfb7c69e9ac557dddecc2b8b00f6c7f22da2e28..d5c153df43cf951a4c7922bc1a0a6f8a77cc969a 100644 (file)
@@ -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();