Skip to content

Commit 99a6a32

Browse files
committed
crimson/os/seastore/object_data_handler: prevent from being overwritten if cloned
Signed-off-by: Myoungwon Oh <[email protected]>
1 parent b48e662 commit 99a6a32

File tree

5 files changed

+12
-3
lines changed

5 files changed

+12
-3
lines changed

src/crimson/os/seastore/backref/btree_backref_manager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class BtreeBackrefMapping : public BtreeNodeMapping<paddr_t, laddr_t> {
3535
return type;
3636
}
3737

38+
bool is_clone() const final {
39+
return false;
40+
}
41+
3842
protected:
3943
std::unique_ptr<BtreeNodeMapping<paddr_t, laddr_t>> _duplicate(
4044
op_context_t<paddr_t> ctx) const final {

src/crimson/os/seastore/cached_extent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,7 @@ class PhysicalNodeMapping {
10541054
}
10551055

10561056
virtual bool is_stable() const = 0;
1057+
virtual bool is_clone() const = 0;
10571058
bool is_zero_reserved() const {
10581059
return !get_val().is_real();
10591060
}

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ class BtreeLBAMapping : public BtreeNodeMapping<laddr_t, paddr_t> {
137137
return intermediate_length;
138138
}
139139

140+
bool is_clone() const final {
141+
return get_map_val().refcount > 1;
142+
}
143+
140144
protected:
141145
std::unique_ptr<BtreeNodeMapping<laddr_t, paddr_t>> _duplicate(
142146
op_context_t<laddr_t> ctx) const final {

src/crimson/os/seastore/object_data_handler.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ overwrite_ops_t prepare_ops_list(
323323
[&region, &to_remap](auto &r) {
324324
interval_set<uint64_t> range;
325325
range.insert(r->get_key(), r->get_length());
326-
if (range.contains(region.addr, region.len)) {
326+
if (range.contains(region.addr, region.len) && !r->is_clone()) {
327327
to_remap.push_back(extent_to_remap_t::create_overwrite(
328328
0, region.len, std::move(r), *region.to_write));
329329
return true;
@@ -339,7 +339,7 @@ overwrite_ops_t prepare_ops_list(
339339
[&region, &to_remap](auto &r) {
340340
interval_set<uint64_t> range;
341341
range.insert(r.pin->get_key(), r.pin->get_length());
342-
if (range.contains(region.addr, region.len)) {
342+
if (range.contains(region.addr, region.len) && !r.pin->is_clone()) {
343343
to_remap.push_back(extent_to_remap_t::create_overwrite(
344344
region.addr - range.begin().get_start(), region.len,
345345
std::move(r.pin), *region.to_write));

src/crimson/os/seastore/transaction_manager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ class TransactionManager : public ExtentCallbackInterface {
320320
read_extent_ret<T> get_mutable_extent_by_laddr(Transaction &t, laddr_t laddr, extent_len_t len) {
321321
return get_pin(t, laddr
322322
).si_then([this, &t, len](auto pin) {
323-
ceph_assert(pin->is_stable());
323+
ceph_assert(pin->is_stable() && !pin->is_zero_reserved());
324324
ceph_assert(!pin->is_clone());
325325
ceph_assert(pin->get_length() == len);
326326
return this->read_pin<T>(t, std::move(pin));

0 commit comments

Comments
 (0)