o->extent_map.fault_range(db, offset, length);
BlueStore::Writer wr(this, txc, &wctx, o);
wr.do_write(offset, bl);
- // equivalent of wctx_finish
- // do_write updates allocations itself
- // update statfs
- txc->statfs_delta += wr.statfs_delta;
- // update shared blobs
- for (auto b: wr.shared_changed) {
- txc->write_shared_blob(b);
- }
o->extent_map.compress_extent_map(offset, length);
o->extent_map.dirty_range(offset, length);
o->extent_map.maybe_reshard(offset, offset + length);
bool new_data_pad = true; // unless otherwise stated, we pad
exmp_it it = onode->extent_map.seek_lextent(logical_offset);
// it can be extent in which we are interested in
- if (it == onode->extent_map.extent_map.end()) {
+ if (it == onode->extent_map.extent_map.end() ||
+ it->logical_offset >= logical_offset) {
if (it == onode->extent_map.extent_map.begin()) {
goto done;
}
- --it; //step back to first element
+ --it; //step back to the first extent to consider
}
do {
if (it->logical_end() < off_stop) {
bufferlist& data,
blob_vec& bd)
{
+ ceph_assert(bd.empty());
+ bd.reserve(data.length() / wctx->target_blob_size + 2);
auto lof = location;
uint32_t end_offset = location + data.length();
while (lof < end_offset) {
if (onode->onode.size < ref_end)
onode->onode.size = ref_end;
_collect_released_allocated();
+ // update statfs
+ txc->statfs_delta += statfs_delta;
+ // update shared blobs
+ for (auto b: shared_changed) {
+ txc->write_shared_blob(b);
+ }
dout(25) << "result: " << std::endl << onode->print(pp_mode) << dendl;
}