std::atomic<uint32_t>* image_dispatch_flags,
io::DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
+ if (*image_dispatch_flags & io::IMAGE_DISPATCH_FLAG_CRYPTO_HEADER) {
+ return false;
+ }
+
auto cct = m_image_ctx->cct;
ldout(cct, 20) << "image_extents=" << image_extents << dendl;
uint64_t tid, std::atomic<uint32_t>* image_dispatch_flags,
io::DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
+ if (*image_dispatch_flags & io::IMAGE_DISPATCH_FLAG_CRYPTO_HEADER) {
+ return false;
+ }
+
auto cct = m_image_ctx->cct;
ldout(cct, 20) << "image_extents=" << image_extents << dendl;
uint64_t tid, std::atomic<uint32_t>* image_dispatch_flags,
io::DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
+ if (*image_dispatch_flags & io::IMAGE_DISPATCH_FLAG_CRYPTO_HEADER) {
+ return false;
+ }
+
auto cct = m_image_ctx->cct;
ldout(cct, 20) << "image_extents=" << image_extents << dendl;
std::atomic<uint32_t>* image_dispatch_flags,
io::DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
+ if (*image_dispatch_flags & io::IMAGE_DISPATCH_FLAG_CRYPTO_HEADER) {
+ return false;
+ }
+
auto cct = m_image_ctx->cct;
ldout(cct, 20) << "image_extents=" << image_extents << dendl;
std::atomic<uint32_t>* image_dispatch_flags,
io::DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
+ if (*image_dispatch_flags & io::IMAGE_DISPATCH_FLAG_CRYPTO_HEADER) {
+ return false;
+ }
+
auto cct = m_image_ctx->cct;
ldout(cct, 20) << "image_extents=" << image_extents << dendl;
for (auto [image_offset, image_length] : read_op.image_extent_map) {
// convert image extents back to object extents for the write op
striper::LightweightObjectExtents object_extents;
- io::util::file_to_extents(m_dst_image_ctx, image_offset,
- image_length, buffer_offset, &object_extents);
+ io::util::area_to_object_extents(m_dst_image_ctx, image_offset,
+ image_length, m_image_area,
+ buffer_offset, &object_extents);
for (auto& object_extent : object_extents) {
ldout(m_cct, 20) << "src_snap_seq=" << src_snap_seq << ", "
<< "object_offset=" << object_extent.offset << ", "
for (auto z = zero_interval.begin(); z != zero_interval.end(); ++z) {
// convert image extents back to object extents for the write op
striper::LightweightObjectExtents object_extents;
- io::util::file_to_extents(m_dst_image_ctx, z.get_start(), z.get_len(), 0,
- &object_extents);
+ io::util::area_to_object_extents(m_dst_image_ctx, z.get_start(),
+ z.get_len(), m_image_area, 0,
+ &object_extents);
for (auto& object_extent : object_extents) {
ceph_assert(object_extent.offset + object_extent.length <=
m_dst_image_ctx->layout.object_size);
&CopyupRequest<I>::handle_read_from_parent>(
this, librbd::util::get_image_ctx(m_image_ctx->parent), AIO_TYPE_READ);
- ldout(cct, 20) << "completion=" << comp << ", "
- << "extents=" << m_image_extents
- << dendl;
+ ldout(cct, 20) << "completion=" << comp
+ << " image_extents=" << m_image_extents
+ << " area=" << m_image_area << dendl;
auto req = io::ImageDispatchSpec::create_read(
*m_image_ctx->parent, io::IMAGE_DISPATCH_LAYER_INTERNAL_START, comp,
std::move(m_image_extents), m_image_area,
// convert the image-extent extent map to object-extents
for (auto [image_offset, image_length] : image_extent_map) {
striper::LightweightObjectExtents object_extents;
- util::file_to_extents(
- m_image_ctx, image_offset, image_length, 0, &object_extents);
+ util::area_to_object_extents(m_image_ctx, image_offset, image_length,
+ m_image_area, 0, &object_extents);
for (auto& object_extent : object_extents) {
m_copyup_extent_map.emplace_back(
object_extent.offset, object_extent.length);
}
}
+ImageArea get_area(const std::atomic<uint32_t>* image_dispatch_flags) {
+ return (*image_dispatch_flags & IMAGE_DISPATCH_FLAG_CRYPTO_HEADER ?
+ ImageArea::CRYPTO_HEADER : ImageArea::DATA);
+}
+
} // anonymous namespace
template <typename I>
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << "image_extents=" << image_extents << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageRequest<I>::aio_read(
- m_image_ctx, aio_comp, std::move(image_extents), std::move(read_result),
- io_context, op_flags, read_flags, parent_trace);
+ ImageRequest<I>::aio_read(m_image_ctx, aio_comp, std::move(image_extents),
+ area, std::move(read_result), io_context, op_flags,
+ read_flags, parent_trace);
return true;
}
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << "image_extents=" << image_extents << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageRequest<I>::aio_write(
- m_image_ctx, aio_comp, std::move(image_extents), std::move(bl),
- io_context, op_flags, parent_trace);
+ ImageRequest<I>::aio_write(m_image_ctx, aio_comp, std::move(image_extents),
+ area, std::move(bl), io_context, op_flags,
+ parent_trace);
return true;
}
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << "image_extents=" << image_extents << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageRequest<I>::aio_discard(
- m_image_ctx, aio_comp, std::move(image_extents), discard_granularity_bytes,
- io_context, parent_trace);
+ ImageRequest<I>::aio_discard(m_image_ctx, aio_comp, std::move(image_extents),
+ area, discard_granularity_bytes, io_context,
+ parent_trace);
return true;
}
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << "image_extents=" << image_extents << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageRequest<I>::aio_writesame(
- m_image_ctx, aio_comp, std::move(image_extents), std::move(bl),
- io_context, op_flags, parent_trace);
+ ImageRequest<I>::aio_writesame(m_image_ctx, aio_comp,
+ std::move(image_extents), area, std::move(bl),
+ io_context, op_flags, parent_trace);
return true;
}
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << "image_extents=" << image_extents << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageRequest<I>::aio_compare_and_write(
- m_image_ctx, aio_comp, std::move(image_extents), std::move(cmp_bl),
- std::move(bl), mismatch_offset, io_context, op_flags, parent_trace);
+ ImageRequest<I>::aio_compare_and_write(m_image_ctx, aio_comp,
+ std::move(image_extents), area,
+ std::move(cmp_bl), std::move(bl),
+ mismatch_offset, io_context, op_flags,
+ parent_trace);
return true;
}
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
- ldout(cct, 20) << dendl;
+ auto area = get_area(image_dispatch_flags);
+ ldout(cct, 20) << "image_extents=" << image_extents
+ << " area=" << area << dendl;
start_in_flight_io(aio_comp);
*dispatch_result = DISPATCH_RESULT_COMPLETE;
- ImageListSnapsRequest<I> req(
- *m_image_ctx, aio_comp, std::move(image_extents), std::move(snap_ids),
- list_snaps_flags, snapshot_delta, parent_trace);
+ ImageListSnapsRequest<I> req(*m_image_ctx, aio_comp, std::move(image_extents),
+ area, std::move(snap_ids), list_snaps_flags,
+ snapshot_delta, parent_trace);
req.send();
return true;
}
ceph_assert(aio_comp->image_dispatcher_ctx == nullptr);
aio_comp->image_dispatcher_ctx = &dispatcher_ctx;
aio_comp->get();
+
+ switch (area) {
+ case ImageArea::DATA:
+ break;
+ case ImageArea::CRYPTO_HEADER:
+ image_dispatch_flags |= IMAGE_DISPATCH_FLAG_CRYPTO_HEADER;
+ break;
+ default:
+ ceph_abort();
+ }
}
};
ldout(ictx->cct, 20) << "(readahead logical) " << readahead_offset << "~"
<< readahead_length << dendl;
LightweightObjectExtents readahead_object_extents;
- io::util::file_to_extents(ictx, readahead_offset, readahead_length, 0,
- &readahead_object_extents);
+ io::util::area_to_object_extents(ictx, readahead_offset, readahead_length,
+ ImageArea::DATA, 0,
+ &readahead_object_extents);
for (auto& object_extent : readahead_object_extents) {
ldout(ictx->cct, 20) << "(readahead) "
<< data_object_name(ictx,
template <typename I>
void ImageRequest<I>::aio_read(I *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
ReadResult &&read_result, IOContext io_context,
int op_flags, int read_flags,
const ZTracer::Trace &parent_trace) {
- ImageReadRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageReadRequest<I> req(*ictx, c, std::move(image_extents), area,
std::move(read_result), io_context, op_flags,
read_flags, parent_trace);
req.send();
template <typename I>
void ImageRequest<I>::aio_write(I *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&bl, IOContext io_context,
+ int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageWriteRequest<I> req(*ictx, c, std::move(image_extents), std::move(bl),
- io_context, op_flags, parent_trace);
+ ImageWriteRequest<I> req(*ictx, c, std::move(image_extents), area,
+ std::move(bl), io_context, op_flags, parent_trace);
req.send();
}
template <typename I>
void ImageRequest<I>::aio_discard(I *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
uint32_t discard_granularity_bytes,
IOContext io_context,
const ZTracer::Trace &parent_trace) {
- ImageDiscardRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageDiscardRequest<I> req(*ictx, c, std::move(image_extents), area,
discard_granularity_bytes, io_context,
parent_trace);
req.send();
template <typename I>
void ImageRequest<I>::aio_writesame(I *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
bufferlist &&bl, IOContext io_context,
int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageWriteSameRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageWriteSameRequest<I> req(*ictx, c, std::move(image_extents), area,
std::move(bl), io_context, op_flags,
parent_trace);
req.send();
template <typename I>
void ImageRequest<I>::aio_compare_and_write(I *ictx, AioCompletion *c,
Extents &&image_extents,
+ ImageArea area,
bufferlist &&cmp_bl,
bufferlist &&bl,
uint64_t *mismatch_offset,
IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageCompareAndWriteRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageCompareAndWriteRequest<I> req(*ictx, c, std::move(image_extents), area,
std::move(cmp_bl), std::move(bl),
mismatch_offset, io_context, op_flags,
parent_trace);
template <typename I>
ImageReadRequest<I>::ImageReadRequest(I &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
ReadResult &&read_result,
IOContext io_context, int op_flags,
int read_flags,
const ZTracer::Trace &parent_trace)
- : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents),
+ : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents), area,
io_context, "read", parent_trace),
m_op_flags(op_flags), m_read_flags(read_flags) {
aio_comp->read_result = std::move(read_result);
CephContext *cct = image_ctx.cct;
auto &image_extents = this->m_image_extents;
- if (image_ctx.cache && image_ctx.readahead_max_bytes > 0 &&
+ if (this->m_image_area == ImageArea::DATA &&
+ image_ctx.cache && image_ctx.readahead_max_bytes > 0 &&
!(m_op_flags & LIBRADOS_OP_FLAG_FADVISE_RANDOM)) {
readahead(get_image_ctx(&image_ctx), image_extents, this->m_io_context);
}
continue;
}
- util::file_to_extents(&image_ctx, extent.first, extent.second, buffer_ofs,
- &object_extents);
+ util::area_to_object_extents(&image_ctx, extent.first, extent.second,
+ this->m_image_area, buffer_ofs,
+ &object_extents);
buffer_ofs += extent.second;
}
}
// map to object extents
- io::util::file_to_extents(&image_ctx, extent.first, extent.second, clip_len,
- &object_extents);
+ io::util::area_to_object_extents(&image_ctx, extent.first, extent.second,
+ this->m_image_area, clip_len,
+ &object_extents);
clip_len += extent.second;
}
template <typename I>
ImageListSnapsRequest<I>::ImageListSnapsRequest(
I& image_ctx, AioCompletion* aio_comp, Extents&& image_extents,
- SnapIds&& snap_ids, int list_snaps_flags, SnapshotDelta* snapshot_delta,
- const ZTracer::Trace& parent_trace)
- : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents),
+ ImageArea area, SnapIds&& snap_ids, int list_snaps_flags,
+ SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace)
+ : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents), area,
image_ctx.get_data_io_context(), "list-snaps",
parent_trace),
m_snap_ids(std::move(snap_ids)), m_list_snaps_flags(list_snaps_flags),
}
striper::LightweightObjectExtents object_extents;
- io::util::file_to_extents(&image_ctx, image_extent.first,
- image_extent.second, 0, &object_extents);
+ io::util::area_to_object_extents(&image_ctx, image_extent.first,
+ image_extent.second, this->m_image_area, 0,
+ &object_extents);
for (auto& object_extent : object_extents) {
object_number_extents[object_extent.object_no].emplace_back(
object_extent.offset, object_extent.length);
template <typename ImageCtxT = ImageCtx>
class ImageRequest {
public:
- typedef std::vector<std::pair<uint64_t,uint64_t> > Extents;
-
virtual ~ImageRequest() {
m_trace.event("finish");
}
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents, ReadResult &&read_result,
- IOContext io_context, int op_flags, int read_flags,
+ Extents &&image_extents, ImageArea area,
+ ReadResult &&read_result, IOContext io_context,
+ int op_flags, int read_flags,
const ZTracer::Trace &parent_trace);
static void aio_write(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&bl, IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace);
static void aio_discard(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
uint32_t discard_granularity_bytes,
IOContext io_context,
const ZTracer::Trace &parent_trace);
FlushSource flush_source,
const ZTracer::Trace &parent_trace);
static void aio_writesame(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&bl, IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace);
static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
bufferlist &&cmp_bl,
bufferlist &&bl, uint64_t *mismatch_offset,
IOContext io_context, int op_flags,
ImageCtxT &m_image_ctx;
AioCompletion *m_aio_comp;
Extents m_image_extents;
+ ImageArea m_image_area;
IOContext m_io_context;
ZTracer::Trace m_trace;
ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, IOContext io_context,
- const char *trace_name,
- const ZTracer::Trace &parent_trace)
+ Extents &&image_extents, ImageArea area, IOContext io_context,
+ const char *trace_name, const ZTracer::Trace &parent_trace)
: m_image_ctx(image_ctx), m_aio_comp(aio_comp),
- m_image_extents(std::move(image_extents)), m_io_context(io_context),
+ m_image_extents(std::move(image_extents)), m_image_area(area),
+ m_io_context(io_context),
m_trace(librbd::util::create_trace(image_ctx, trace_name, parent_trace)) {
m_trace.event("start");
}
template <typename ImageCtxT = ImageCtx>
class ImageReadRequest : public ImageRequest<ImageCtxT> {
public:
- using typename ImageRequest<ImageCtxT>::Extents;
-
ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, ReadResult &&read_result,
- IOContext io_context, int op_flags, int read_flags,
- const ZTracer::Trace &parent_trace);
+ Extents &&image_extents, ImageArea area,
+ ReadResult &&read_result, IOContext io_context, int op_flags,
+ int read_flags, const ZTracer::Trace &parent_trace);
protected:
void send_request() override;
protected:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- using typename ImageRequest<ImageCtxT>::Extents;
AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, IOContext io_context,
- const char *trace_name,
+ Extents &&image_extents, ImageArea area,
+ IOContext io_context, const char *trace_name,
const ZTracer::Trace &parent_trace)
: ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents),
- io_context, trace_name, parent_trace),
+ area, io_context, trace_name, parent_trace),
m_synchronous(false) {
}
template <typename ImageCtxT = ImageCtx>
class ImageWriteRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
- using typename ImageRequest<ImageCtxT>::Extents;
-
ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, bufferlist &&bl,
+ Extents &&image_extents, ImageArea area, bufferlist &&bl,
IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), io_context, "write",
- parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), area, io_context,
+ "write", parent_trace),
m_bl(std::move(bl)), m_op_flags(op_flags) {
}
class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents&& image_extents,
+ Extents&& image_extents, ImageArea area,
uint32_t discard_granularity_bytes, IOContext io_context,
const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), io_context, "discard",
- parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), area, io_context,
+ "discard", parent_trace),
m_discard_granularity_bytes(discard_granularity_bytes) {
}
ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
FlushSource flush_source,
const ZTracer::Trace &parent_trace)
- : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, {}, "flush",
- parent_trace),
+ : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {},
+ ImageArea::DATA /* dummy for {} */,
+ {}, "flush", parent_trace),
m_flush_source(flush_source) {
}
class ImageWriteSameRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents&& image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents&& image_extents, ImageArea area,
+ bufferlist &&bl, IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), io_context, "writesame",
- parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), area, io_context,
+ "writesame", parent_trace),
m_data_bl(std::move(bl)), m_op_flags(op_flags) {
}
using typename ImageRequest<ImageCtxT>::ObjectRequests;
ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, bufferlist &&cmp_bl,
- bufferlist &&bl, uint64_t *mismatch_offset,
- IOContext io_context, int op_flags,
- const ZTracer::Trace &parent_trace)
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&cmp_bl, bufferlist &&bl,
+ uint64_t *mismatch_offset, IOContext io_context,
+ int op_flags, const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), io_context,
+ image_ctx, aio_comp, std::move(image_extents), area, io_context,
"compare_and_write", parent_trace),
m_cmp_bl(std::move(cmp_bl)), m_bl(std::move(bl)),
m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) {
template <typename ImageCtxT = ImageCtx>
class ImageListSnapsRequest : public ImageRequest<ImageCtxT> {
public:
- using typename ImageRequest<ImageCtxT>::Extents;
-
ImageListSnapsRequest(
ImageCtxT& image_ctx, AioCompletion* aio_comp,
- Extents&& image_extents, SnapIds&& snap_ids, int list_snaps_flags,
- SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace);
+ Extents&& image_extents, ImageArea area, SnapIds&& snap_ids,
+ int list_snaps_flags, SnapshotDelta* snapshot_delta,
+ const ZTracer::Trace& parent_trace);
protected:
void update_timestamp() override {}
m_list_snaps_flags | LIST_SNAPS_FLAG_IGNORE_ZEROED_EXTENTS);
ImageListSnapsRequest<I> req(
- *image_ctx->parent, aio_comp, std::move(parent_extents),
+ *image_ctx->parent, aio_comp, std::move(parent_extents), m_image_area,
{0, image_ctx->parent->snap_id}, list_snaps_flags, &m_parent_snapshot_delta,
this->m_trace);
req.send();
// map image-extents back to this object
striper::LightweightObjectExtents object_extents;
- io::util::file_to_extents(image_ctx, image_extent.get_off(),
- image_extent.get_len(), 0, &object_extents);
+ io::util::area_to_object_extents(image_ctx, image_extent.get_off(),
+ image_extent.get_len(), m_image_area, 0,
+ &object_extents);
for (auto& object_extent : object_extents) {
ceph_assert(object_extent.object_no == this->m_object_no);
intervals.insert(
IMAGE_DISPATCH_FLAG_QOS_MASK = (
IMAGE_DISPATCH_FLAG_QOS_BPS_MASK |
IMAGE_DISPATCH_FLAG_QOS_IOPS_MASK),
+
+ // TODO: pass area through ImageDispatchInterface and remove
+ // this flag
+ IMAGE_DISPATCH_FLAG_CRYPTO_HEADER = 1 << 6
};
enum {
}
template <typename I>
-void file_to_extents(I* image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents) {
+void area_to_object_extents(I* image_ctx, uint64_t offset, uint64_t length,
+ ImageArea area, uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents) {
Extents extents = {{offset, length}};
- // TODO: pass area
- image_ctx->io_image_dispatcher->remap_to_physical(extents, ImageArea::DATA);
+ image_ctx->io_image_dispatcher->remap_to_physical(extents, area);
for (auto [off, len] : extents) {
Striper::file_to_extents(image_ctx->cct, &image_ctx->layout, off, len, 0,
buffer_offset, object_extents);
template bool librbd::io::util::trigger_copyup(
librbd::ImageCtx *image_ctx, uint64_t object_no, IOContext io_context,
Context* on_finish);
-template void librbd::io::util::file_to_extents(
- librbd::ImageCtx *image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents);
+template void librbd::io::util::area_to_object_extents(
+ librbd::ImageCtx* image_ctx, uint64_t offset, uint64_t length,
+ ImageArea area, uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents);
template auto librbd::io::util::object_to_area_extents(
librbd::ImageCtx* image_ctx, uint64_t object_no, const Extents& extents)
-> std::pair<Extents, ImageArea>;
template <typename ImageCtxT = librbd::ImageCtx>
bool trigger_copyup(ImageCtxT *image_ctx, uint64_t object_no,
IOContext io_context, Context* on_finish);
-
+
template <typename ImageCtxT = librbd::ImageCtx>
-void file_to_extents(ImageCtxT *image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents);
+void area_to_object_extents(ImageCtxT* image_ctx, uint64_t offset,
+ uint64_t length, ImageArea area,
+ uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents);
template <typename ImageCtxT = librbd::ImageCtx>
std::pair<Extents, ImageArea> object_to_area_extents(
if (!clipped_io(event.offset, aio_comp)) {
io::ImageRequest<I>::aio_discard(&m_image_ctx, aio_comp,
{{event.offset, event.length}},
+ io::ImageArea::DATA,
event.discard_granularity_bytes,
m_image_ctx.get_data_io_context(), {});
}
if (!clipped_io(event.offset, aio_comp)) {
io::ImageRequest<I>::aio_write(&m_image_ctx, aio_comp,
{{event.offset, event.length}},
- std::move(data),
+ io::ImageArea::DATA, std::move(data),
m_image_ctx.get_data_io_context(), 0, {});
}
if (!clipped_io(event.offset, aio_comp)) {
io::ImageRequest<I>::aio_writesame(&m_image_ctx, aio_comp,
{{event.offset, event.length}},
- std::move(data),
+ io::ImageArea::DATA, std::move(data),
m_image_ctx.get_data_io_context(), 0,
{});
}
if (!clipped_io(event.offset, aio_comp)) {
io::ImageRequest<I>::aio_compare_and_write(&m_image_ctx, aio_comp,
{{event.offset, event.length}},
+ io::ImageArea::DATA,
std::move(cmp_data),
std::move(write_data),
nullptr,
namespace io {
namespace util {
-template <> void file_to_extents(
- MockTestImageCtx* image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents) {
+template <>
+void area_to_object_extents(MockTestImageCtx* image_ctx, uint64_t offset,
+ uint64_t length, ImageArea area,
+ uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents) {
Striper::file_to_extents(image_ctx->cct, &image_ctx->layout, offset, length,
0, buffer_offset, object_extents);
}
namespace util {
-template <> void file_to_extents(
- MockTestImageCtx* image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents) {
+template <>
+void area_to_object_extents(MockTestImageCtx* image_ctx, uint64_t offset,
+ uint64_t length, ImageArea area,
+ uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents) {
Striper::file_to_extents(image_ctx->cct, &image_ctx->layout, offset, length,
0, buffer_offset, object_extents);
}
namespace util {
-template<>
-void file_to_extents(
- MockTestImageCtx *image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents *object_extents) {
+template <>
+void area_to_object_extents(MockTestImageCtx* image_ctx, uint64_t offset,
+ uint64_t length, ImageArea area,
+ uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents) {
Striper::file_to_extents(image_ctx->cct, &image_ctx->layout, offset, length,
0, buffer_offset, object_extents);
}
bufferlist bl;
bl.append("1");
MockImageWriteRequest mock_aio_image_write_1(
- mock_image_ctx, aio_comp_1, {{0, 1}}, std::move(bl),
+ mock_image_ctx, aio_comp_1, {{0, 1}}, ImageArea::DATA, std::move(bl),
mock_image_ctx.get_data_io_context(), 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
bl.append("1");
MockImageWriteRequest mock_aio_image_write_2(
- mock_image_ctx, aio_comp_2, {{0, 1}}, std::move(bl),
+ mock_image_ctx, aio_comp_2, {{0, 1}}, ImageArea::DATA, std::move(bl),
mock_image_ctx.get_data_io_context(), 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
ReadResult rr;
MockImageReadRequest mock_aio_image_read_1(
- mock_image_ctx, aio_comp_1, {{0, 1}}, std::move(rr),
+ mock_image_ctx, aio_comp_1, {{0, 1}}, ImageArea::DATA, std::move(rr),
mock_image_ctx.get_data_io_context(), 0, 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
expect_object_request_send(mock_image_ctx, 0);
MockImageReadRequest mock_aio_image_read_2(
- mock_image_ctx, aio_comp_2, {{0, 1}}, std::move(rr),
+ mock_image_ctx, aio_comp_2, {{0, 1}}, ImageArea::DATA, std::move(rr),
mock_image_ctx.get_data_io_context(), 0, 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
AioCompletion *aio_comp = AioCompletion::create_and_start(
&aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
MockImageDiscardRequest mock_aio_image_discard(
- mock_image_ctx, aio_comp, {{16, 63}, {84, 100}},
+ mock_image_ctx, aio_comp, {{16, 63}, {84, 100}}, ImageArea::DATA,
ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
&aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
MockImageDiscardRequest mock_aio_image_discard(
mock_image_ctx, aio_comp,
- {{ictx->layout.object_size - 1024, 1024}},
+ {{ictx->layout.object_size - 1024, 1024}}, ImageArea::DATA,
ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
MockImageDiscardRequest mock_aio_image_discard(
mock_image_ctx, aio_comp,
{{16, 63}, {96, 31}, {84, 100}, {ictx->layout.object_size - 33, 33}},
- ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
+ ImageArea::DATA, ictx->discard_granularity_bytes,
+ mock_image_ctx.get_data_io_context(), {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
mock_aio_image_discard.send();
bufferlist bl;
bl.append("1");
MockImageWriteRequest mock_aio_image_write(
- mock_image_ctx, aio_comp, {{0, 1}}, std::move(bl),
+ mock_image_ctx, aio_comp, {{0, 1}}, ImageArea::DATA, std::move(bl),
mock_image_ctx.get_data_io_context(), 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
AioCompletion *aio_comp = AioCompletion::create_and_start(
&aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
MockImageDiscardRequest mock_aio_image_discard(
- mock_image_ctx, aio_comp, {{0, 1}}, ictx->discard_granularity_bytes,
- mock_image_ctx.get_data_io_context(), {});
+ mock_image_ctx, aio_comp, {{0, 1}}, ImageArea::DATA,
+ ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
mock_aio_image_discard.send();
bufferlist bl;
bl.append("1");
MockImageWriteSameRequest mock_aio_image_writesame(
- mock_image_ctx, aio_comp, {{0, 1}}, std::move(bl),
+ mock_image_ctx, aio_comp, {{0, 1}}, ImageArea::DATA, std::move(bl),
mock_image_ctx.get_data_io_context(), 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
write_bl.append("1");
uint64_t mismatch_offset;
MockImageCompareAndWriteRequest mock_aio_image_write(
- mock_image_ctx, aio_comp, {{0, 1}}, std::move(cmp_bl), std::move(write_bl),
- &mismatch_offset, mock_image_ctx.get_data_io_context(), 0, {});
+ mock_image_ctx, aio_comp, {{0, 1}}, ImageArea::DATA,
+ std::move(cmp_bl), std::move(write_bl), &mismatch_offset,
+ mock_image_ctx.get_data_io_context(), 0, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
mock_aio_image_write.send();
AioCompletion *aio_comp = AioCompletion::create_and_start(
&aio_comp_ctx, ictx, AIO_TYPE_GENERIC);
MockImageListSnapsRequest mock_image_list_snaps_request(
- mock_image_ctx, aio_comp, {{0, 16384}, {16384, 16384}}, {0, CEPH_NOSNAP},
- 0, &snapshot_delta, {});
+ mock_image_ctx, aio_comp, {{0, 16384}, {16384, 16384}}, ImageArea::DATA,
+ {0, CEPH_NOSNAP}, 0, &snapshot_delta, {});
{
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
mock_image_list_snaps_request.send();
}
ImageListSnapsRequest(
librbd::MockImageCtx& image_ctx, AioCompletion* aio_comp,
- Extents&& image_extents, SnapIds&& snap_ids, int list_snaps_flags,
- SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace) {
+ Extents&& image_extents, ImageArea area, SnapIds&& snap_ids,
+ int list_snaps_flags, SnapshotDelta* snapshot_delta,
+ const ZTracer::Trace& parent_trace) {
ceph_assert(s_instance != nullptr);
s_instance->aio_comp = aio_comp;
s_instance->image_extents = image_extents;
namespace util {
-template <> void file_to_extents(
- MockTestImageCtx* image_ctx, uint64_t offset, uint64_t length,
- uint64_t buffer_offset,
- striper::LightweightObjectExtents* object_extents) {
+template <>
+void area_to_object_extents(MockTestImageCtx* image_ctx, uint64_t offset,
+ uint64_t length, ImageArea area,
+ uint64_t buffer_offset,
+ striper::LightweightObjectExtents* object_extents) {
Striper::file_to_extents(image_ctx->cct, &image_ctx->layout, offset, length,
0, buffer_offset, object_extents);
}
MOCK_METHOD4(aio_write, void(AioCompletion *c, const Extents &image_extents,
const bufferlist &bl, int op_flags));
static void aio_write(MockReplayImageCtx *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents&& image_extents, ImageArea area,
+ bufferlist&& bl, IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace) {
ceph_assert(s_instance != nullptr);
s_instance->aio_write(c, image_extents, bl, op_flags);
MOCK_METHOD3(aio_discard, void(AioCompletion *c, const Extents& image_extents,
uint32_t discard_granularity_bytes));
static void aio_discard(MockReplayImageCtx *ictx, AioCompletion *c,
- Extents&& image_extents,
+ Extents&& image_extents, ImageArea area,
uint32_t discard_granularity_bytes,
IOContext io_context,
const ZTracer::Trace &parent_trace) {
const bufferlist &bl,
int op_flags));
static void aio_writesame(MockReplayImageCtx *ictx, AioCompletion *c,
- Extents&& image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents&& image_extents, ImageArea area,
+ bufferlist&& bl, IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace) {
ceph_assert(s_instance != nullptr);
s_instance->aio_writesame(c, image_extents, bl, op_flags);
uint64_t *mismatch_offset,
int op_flags));
static void aio_compare_and_write(MockReplayImageCtx *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&cmp_bl,
- bufferlist &&bl, uint64_t *mismatch_offset,
+ Extents&& image_extents, ImageArea area,
+ bufferlist&& cmp_bl, bufferlist&& bl,
+ uint64_t* mismatch_offset,
IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace) {
ceph_assert(s_instance != nullptr);