From 99a6a32fa4b7d3a49520889da4b9c81be71a0ab4 Mon Sep 17 00:00:00 2001 From: Myoungwon Oh Date: Fri, 3 Nov 2023 15:47:24 +0900 Subject: [PATCH] crimson/os/seastore/object_data_handler: prevent from being overwritten if cloned Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/backref/btree_backref_manager.h | 4 ++++ src/crimson/os/seastore/cached_extent.h | 1 + src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h | 4 ++++ src/crimson/os/seastore/object_data_handler.cc | 4 ++-- src/crimson/os/seastore/transaction_manager.h | 2 +- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/crimson/os/seastore/backref/btree_backref_manager.h b/src/crimson/os/seastore/backref/btree_backref_manager.h index 952e78b65189a..38084bb00e697 100644 --- a/src/crimson/os/seastore/backref/btree_backref_manager.h +++ b/src/crimson/os/seastore/backref/btree_backref_manager.h @@ -35,6 +35,10 @@ public: return type; } + bool is_clone() const final { + return false; + } + protected: std::unique_ptr> _duplicate( op_context_t ctx) const final { diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index c3010efe6cb4d..5fcb8142527d9 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -1054,6 +1054,7 @@ public: } virtual bool is_stable() const = 0; + virtual bool is_clone() const = 0; bool is_zero_reserved() const { return !get_val().is_real(); } diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h index 79d21b363af33..1c907f76d3113 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h @@ -137,6 +137,10 @@ public: return intermediate_length; } + bool is_clone() const final { + return get_map_val().refcount > 1; + } + protected: std::unique_ptr> _duplicate( op_context_t ctx) const final { diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index 29e89d3ddf0d0..3333fcfad9d4c 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -323,7 +323,7 @@ overwrite_ops_t prepare_ops_list( [®ion, &to_remap](auto &r) { interval_set range; range.insert(r->get_key(), r->get_length()); - if (range.contains(region.addr, region.len)) { + if (range.contains(region.addr, region.len) && !r->is_clone()) { to_remap.push_back(extent_to_remap_t::create_overwrite( 0, region.len, std::move(r), *region.to_write)); return true; @@ -339,7 +339,7 @@ overwrite_ops_t prepare_ops_list( [®ion, &to_remap](auto &r) { interval_set range; range.insert(r.pin->get_key(), r.pin->get_length()); - if (range.contains(region.addr, region.len)) { + if (range.contains(region.addr, region.len) && !r.pin->is_clone()) { to_remap.push_back(extent_to_remap_t::create_overwrite( region.addr - range.begin().get_start(), region.len, std::move(r.pin), *region.to_write)); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 34c87a404c4d8..911ebbf6008f2 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -320,7 +320,7 @@ public: read_extent_ret get_mutable_extent_by_laddr(Transaction &t, laddr_t laddr, extent_len_t len) { return get_pin(t, laddr ).si_then([this, &t, len](auto pin) { - ceph_assert(pin->is_stable()); + ceph_assert(pin->is_stable() && !pin->is_zero_reserved()); ceph_assert(!pin->is_clone()); ceph_assert(pin->get_length() == len); return this->read_pin(t, std::move(pin)); -- 2.47.3