aio_comp->read_result.set_image_extents(image_extents);
auto *req_comp = new io::ReadResult::C_ImageReadRequest(
- aio_comp, image_extents);
+ aio_comp, 0, image_extents);
m_image_cache->read(std::move(image_extents),
&req_comp->bl, op_flags,
};
ReadResult::C_ImageReadRequest::C_ImageReadRequest(
- AioCompletion *aio_completion, const Extents image_extents)
- : aio_completion(aio_completion), image_extents(image_extents) {
+ AioCompletion *aio_completion, uint64_t buffer_offset,
+ const Extents image_extents)
+ : aio_completion(aio_completion), buffer_offset(buffer_offset),
+ image_extents(image_extents) {
aio_completion->add_request();
}
striper::LightweightBufferExtents buffer_extents;
size_t length = 0;
for (auto &image_extent : image_extents) {
- buffer_extents.emplace_back(length, image_extent.second);
+ buffer_extents.emplace_back(buffer_offset + length, image_extent.second);
length += image_extent.second;
}
ceph_assert(length == bl.length());
public:
struct C_ImageReadRequest : public Context {
AioCompletion *aio_completion;
+ uint64_t buffer_offset = 0;
Extents image_extents;
bufferlist bl;
C_ImageReadRequest(AioCompletion *aio_completion,
+ uint64_t buffer_offset,
const Extents image_extents);
void finish(int r) override;
aio_comp->set_request_count(1);
auto ctx = new io::ReadResult::C_ImageReadRequest(aio_comp,
- image_extents);
+ 0, image_extents);
// raw directly maps the image-extent IO down to a byte IO extent
m_stream->read(std::move(image_extents), &ctx->bl, ctx);
aio_comp->read_result = std::move(req->read_result);
aio_comp->read_result.set_image_extents(image_extents);
aio_comp->set_request_count(1);
- auto ctx = new ReadResult::C_ImageReadRequest(aio_comp,
+ auto ctx = new ReadResult::C_ImageReadRequest(aio_comp, 0,
image_extents);
ctx->bl.append(data);
mock_image_ctx.image_ctx->op_work_queue->queue(ctx, r);