From: Myoungwon Oh Date: Fri, 3 Nov 2023 06:47:24 +0000 (+0900) Subject: crimson/os/seastore/object_data_handler: prevent from being overwritten if cloned X-Git-Tag: v19.0.0~114^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F50419%2Fhead;p=ceph.git crimson/os/seastore/object_data_handler: prevent from being overwritten if cloned Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/backref/btree_backref_manager.h b/src/crimson/os/seastore/backref/btree_backref_manager.h index 952e78b65189..38084bb00e69 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 c3010efe6cb4..5fcb8142527d 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 79d21b363af3..1c907f76d311 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 29e89d3ddf0d..3333fcfad9d4 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 34c87a404c4d..911ebbf6008f 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));