]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/object_data_handler: prevent from being overwritten if cloned 50419/head
authorMyoungwon Oh <myoungwon.oh@samsung.com>
Fri, 3 Nov 2023 06:47:24 +0000 (15:47 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Thu, 9 Nov 2023 11:51:37 +0000 (11:51 +0000)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/backref/btree_backref_manager.h
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/transaction_manager.h

index 952e78b65189a584eaee06b244eb8d7bac30aa0d..38084bb00e6979350d441863d70390446043fecf 100644 (file)
@@ -35,6 +35,10 @@ public:
     return type;
   }
 
+  bool is_clone() const final {
+    return false;
+  }
+
 protected:
   std::unique_ptr<BtreeNodeMapping<paddr_t, laddr_t>> _duplicate(
     op_context_t<paddr_t> ctx) const final {
index c3010efe6cb4dd1ad4ea52278acb7a7cc938d9d2..5fcb8142527d9c872e9e5fbe57ce7b093f350e6f 100644 (file)
@@ -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();
   }
index 79d21b363af33f69a154b06c1b478de865ec16cc..1c907f76d31139b444f50c53594a394ddcb59e90 100644 (file)
@@ -137,6 +137,10 @@ public:
     return intermediate_length;
   }
 
+  bool is_clone() const final {
+    return get_map_val().refcount > 1;
+  }
+
 protected:
   std::unique_ptr<BtreeNodeMapping<laddr_t, paddr_t>> _duplicate(
     op_context_t<laddr_t> ctx) const final {
index 29e89d3ddf0d027d991f2dc417624fe9fa35bc5e..3333fcfad9d4cc6aefeb9b32fd767bee41d3c443 100644 (file)
@@ -323,7 +323,7 @@ overwrite_ops_t prepare_ops_list(
          [&region, &to_remap](auto &r) {
            interval_set<uint64_t> 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(
          [&region, &to_remap](auto &r) {
            interval_set<uint64_t> 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));
index 34c87a404c4d87d9ce99f1e54dbee8884a4798b9..911ebbf6008f2082b70163105d42cc82033323d0 100644 (file)
@@ -320,7 +320,7 @@ public:
   read_extent_ret<T> 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>(t, std::move(pin));