bufferlist nbl;
bp.copy(op.extent.length, nbl);
if (ctx->obs->exists)
- t.truncate(coll_t(info.pgid), soid, 0);
- t.write(coll_t(info.pgid), soid, op.extent.offset, op.extent.length, nbl);
+ t.truncate(coll, soid, 0);
+ t.write(coll, soid, op.extent.offset, op.extent.length, nbl);
if (ssc->snapset.clones.size()) {
snapid_t newest = *ssc->snapset.clones.rbegin();
+
+ // Replace clone_overlap[newest] with an empty interval set since there
+ // should no longer be any overlap
ssc->snapset.clone_overlap.erase(newest);
+ ssc->snapset.clone_overlap[newest];
oi.size = 0;
}
if (op.extent.length != oi.size) {
ctx->obs->exists = true; //we're about to recreate it
map<string, bufferptr> attrs;
- t.clone(coll_t(info.pgid),
+ t.clone(coll,
rollback_to_sobject, soid);
- osd->store->getattrs(coll_t(info.pgid),
+ osd->store->getattrs(coll,
rollback_to_sobject, attrs, false);
osd->filter_xattrs(attrs);
- t.setattrs(coll_t(info.pgid), soid, attrs);
+ t.setattrs(coll, soid, attrs);
ssc->snapset.head_exists = true;
+ // Adjust the cached objectcontext
+ ObjectContext *clone_context = get_object_context(rollback_to_sobject,
+ oi.oloc,
+ false);
+ assert(clone_context);
+ ctx->obs->oi.size = clone_context->obs.oi.size;
+
map<snapid_t, interval_set<uint64_t> >::iterator iter =
ssc->snapset.clone_overlap.lower_bound(snapid);
interval_set<uint64_t> overlaps = iter->second;