struct ToSparseReadResult : public Context {
bufferlist& data_bl;
+ uint64_t data_offset;
ceph_le64& len;
- ToSparseReadResult(bufferlist& bl, ceph_le64& len):
- data_bl(bl), len(len) {}
+ ToSparseReadResult(bufferlist& bl, uint64_t offset, ceph_le64& len):
+ data_bl(bl), data_offset(offset),len(len) {}
void finish(int r) {
if (r < 0) return;
len = r;
bufferlist outdata;
- map<uint64_t, uint64_t> extents = {{0, r}};
+ map<uint64_t, uint64_t> extents = {{data_offset, r}};
::encode(extents, outdata);
::encode_destructively(data_bl, outdata);
data_bl.swap(outdata);
ctx->pending_async_reads.push_back(
make_pair(
boost::make_tuple(op.extent.offset, op.extent.length, op.flags),
- make_pair(&osd_op.outdata, new ToSparseReadResult(osd_op.outdata,
+ make_pair(&osd_op.outdata, new ToSparseReadResult(osd_op.outdata, op.extent.offset,
op.extent.length))));
dout(10) << " async_read (was sparse_read) noted for " << soid << dendl;
} else {