LOG_PREFIX(Cache::duplicate_for_write);
assert(i->is_fully_loaded());
- if (i->is_mutable())
+ if (i->is_mutable()) {
return i;
+ }
if (i->is_exist_clean()) {
+ assert(i->is_logical());
+ assert(static_cast<LogicalCachedExtent&>(*i).has_laddr());
i->version++;
i->state = CachedExtent::extent_state_t::EXIST_MUTATION_PENDING;
i->last_committed_crc = i->calc_crc32c();
ret->version++;
ret->state = CachedExtent::extent_state_t::MUTATION_PENDING;
+ if (i->is_logical()) {
+ auto& lextent = static_cast<LogicalCachedExtent&>(*i);
+ assert(lextent.has_laddr());
+ assert(ret->is_logical());
+ static_cast<LogicalCachedExtent&>(*ret).set_laddr(lextent.get_laddr());
+ }
DEBUGT("{} -> {}", t, *i, *ret);
return ret;
}
/// Obtain mutable copy of extent
LogicalChildNodeRef get_mutable_extent(Transaction &t, LogicalChildNodeRef ref) {
- LOG_PREFIX(TransactionManager::get_mutable_extent);
- auto ret = cache->duplicate_for_write(
- t,
- ref)->cast<LogicalChildNode>();
- if (!ret->has_laddr()) {
- SUBDEBUGT(seastore_tm, "duplicate from {}", t, *ref);
- ret->set_laddr(ref->get_laddr());
- } else {
- assert(ref->is_mutable());
- assert(&*ref == &*ret);
- }
- return ret;
+ return cache->duplicate_for_write(t, ref)->cast<LogicalChildNode>();
}
using ref_iertr = LBAManager::ref_iertr;