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 {
[®ion, &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;
[®ion, &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));
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));