From b9a2384cdc437e61c91d93eac5854e4ca0579851 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Wed, 14 Sep 2022 14:55:56 +0200 Subject: [PATCH] librbd: propagate area down to file_to_extents() - readahead and PWL cache are limited to DATA area as explained in the previous commit - DATA area is assumed for the journal as encryption can't be used with journaling anyway To postpone the churn associated with passing area through ImageDispatchInterface (where only WriteLogImageDispatch and ImageDispatch care), add a new image dispatch flag. Signed-off-by: Ilya Dryomov --- src/librbd/cache/WriteLogImageDispatch.cc | 20 +++++ src/librbd/deep_copy/ObjectCopyRequest.cc | 10 ++- src/librbd/io/CopyupRequest.cc | 10 +-- src/librbd/io/ImageDispatch.cc | 67 +++++++++----- src/librbd/io/ImageDispatchSpec.h | 10 +++ src/librbd/io/ImageRequest.cc | 57 ++++++------ src/librbd/io/ImageRequest.h | 87 +++++++++---------- src/librbd/io/ObjectRequest.cc | 7 +- src/librbd/io/Types.h | 4 + src/librbd/io/Utils.cc | 17 ++-- src/librbd/io/Utils.h | 9 +- src/librbd/journal/Replay.cc | 6 +- .../deep_copy/test_mock_ObjectCopyRequest.cc | 9 +- src/test/librbd/io/test_mock_CopyupRequest.cc | 9 +- src/test/librbd/io/test_mock_ImageRequest.cc | 42 ++++----- src/test/librbd/io/test_mock_ObjectRequest.cc | 14 +-- src/test/librbd/journal/test_mock_Replay.cc | 15 ++-- 17 files changed, 230 insertions(+), 163 deletions(-) diff --git a/src/librbd/cache/WriteLogImageDispatch.cc b/src/librbd/cache/WriteLogImageDispatch.cc index 6cb8738e7f9ef..07b1422f37903 100644 --- a/src/librbd/cache/WriteLogImageDispatch.cc +++ b/src/librbd/cache/WriteLogImageDispatch.cc @@ -42,6 +42,10 @@ bool WriteLogImageDispatch::read( std::atomic* 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; @@ -71,6 +75,10 @@ bool WriteLogImageDispatch::write( uint64_t tid, std::atomic* 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; @@ -94,6 +102,10 @@ bool WriteLogImageDispatch::discard( uint64_t tid, std::atomic* 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; @@ -120,6 +132,10 @@ bool WriteLogImageDispatch::write_same( std::atomic* 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; @@ -146,6 +162,10 @@ bool WriteLogImageDispatch::compare_and_write( std::atomic* 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; diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index c5b7a9674041e..8fa325aaea286 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -603,8 +603,9 @@ void ObjectCopyRequest::merge_write_ops() { 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 << ", " @@ -759,8 +760,9 @@ void ObjectCopyRequest::compute_zero_ops() { 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); diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 3373fed3b2c55..220566c64cc56 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -179,9 +179,9 @@ void CopyupRequest::read_from_parent() { &CopyupRequest::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, @@ -677,8 +677,8 @@ void CopyupRequest::convert_copyup_extent_map() { // 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); diff --git a/src/librbd/io/ImageDispatch.cc b/src/librbd/io/ImageDispatch.cc index cc8519abeeeb8..ed3cc357077fc 100644 --- a/src/librbd/io/ImageDispatch.cc +++ b/src/librbd/io/ImageDispatch.cc @@ -25,6 +25,11 @@ void start_in_flight_io(AioCompletion* aio_comp) { } } +ImageArea get_area(const std::atomic* image_dispatch_flags) { + return (*image_dispatch_flags & IMAGE_DISPATCH_FLAG_CRYPTO_HEADER ? + ImageArea::CRYPTO_HEADER : ImageArea::DATA); +} + } // anonymous namespace template @@ -41,14 +46,16 @@ bool ImageDispatch::read( 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::aio_read( - m_image_ctx, aio_comp, std::move(image_extents), std::move(read_result), - io_context, op_flags, read_flags, parent_trace); + ImageRequest::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; } @@ -60,14 +67,16 @@ bool ImageDispatch::write( 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::aio_write( - m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), - io_context, op_flags, parent_trace); + ImageRequest::aio_write(m_image_ctx, aio_comp, std::move(image_extents), + area, std::move(bl), io_context, op_flags, + parent_trace); return true; } @@ -80,14 +89,16 @@ bool ImageDispatch::discard( 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::aio_discard( - m_image_ctx, aio_comp, std::move(image_extents), discard_granularity_bytes, - io_context, parent_trace); + ImageRequest::aio_discard(m_image_ctx, aio_comp, std::move(image_extents), + area, discard_granularity_bytes, io_context, + parent_trace); return true; } @@ -99,14 +110,16 @@ bool ImageDispatch::write_same( 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::aio_writesame( - m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), - io_context, op_flags, parent_trace); + ImageRequest::aio_writesame(m_image_ctx, aio_comp, + std::move(image_extents), area, std::move(bl), + io_context, op_flags, parent_trace); return true; } @@ -119,14 +132,18 @@ bool ImageDispatch::compare_and_write( 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::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::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; } @@ -156,14 +173,16 @@ bool ImageDispatch::list_snaps( 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 req( - *m_image_ctx, aio_comp, std::move(image_extents), std::move(snap_ids), - list_snaps_flags, snapshot_delta, parent_trace); + ImageListSnapsRequest 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; } diff --git a/src/librbd/io/ImageDispatchSpec.h b/src/librbd/io/ImageDispatchSpec.h index 81bb3eeae0731..8e2c452735a53 100644 --- a/src/librbd/io/ImageDispatchSpec.h +++ b/src/librbd/io/ImageDispatchSpec.h @@ -238,6 +238,16 @@ private: 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(); + } } }; diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 5b897a5ba209b..c7f09ef87ac14 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -156,8 +156,9 @@ void readahead(I *ictx, const Extents& image_extents, IOContext io_context) { 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, @@ -227,11 +228,11 @@ bool should_update_timestamp(const utime_t& now, const utime_t& timestamp, template void ImageRequest::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 req(*ictx, c, std::move(image_extents), + ImageReadRequest req(*ictx, c, std::move(image_extents), area, std::move(read_result), io_context, op_flags, read_flags, parent_trace); req.send(); @@ -239,21 +240,22 @@ void ImageRequest::aio_read(I *ictx, AioCompletion *c, template void ImageRequest::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 req(*ictx, c, std::move(image_extents), std::move(bl), - io_context, op_flags, parent_trace); + ImageWriteRequest req(*ictx, c, std::move(image_extents), area, + std::move(bl), io_context, op_flags, parent_trace); req.send(); } template void ImageRequest::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 req(*ictx, c, std::move(image_extents), + ImageDiscardRequest req(*ictx, c, std::move(image_extents), area, discard_granularity_bytes, io_context, parent_trace); req.send(); @@ -269,11 +271,11 @@ void ImageRequest::aio_flush(I *ictx, AioCompletion *c, template void ImageRequest::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 req(*ictx, c, std::move(image_extents), + ImageWriteSameRequest req(*ictx, c, std::move(image_extents), area, std::move(bl), io_context, op_flags, parent_trace); req.send(); @@ -282,12 +284,13 @@ void ImageRequest::aio_writesame(I *ictx, AioCompletion *c, template void ImageRequest::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 req(*ictx, c, std::move(image_extents), + ImageCompareAndWriteRequest req(*ictx, c, std::move(image_extents), area, std::move(cmp_bl), std::move(bl), mismatch_offset, io_context, op_flags, parent_trace); @@ -363,12 +366,12 @@ void ImageRequest::update_timestamp() { template ImageReadRequest::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(image_ctx, aio_comp, std::move(image_extents), + : ImageRequest(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); @@ -380,7 +383,8 @@ void ImageReadRequest::send_request() { 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); } @@ -393,8 +397,9 @@ void ImageReadRequest::send_request() { 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; } @@ -444,8 +449,9 @@ void AbstractImageWriteRequest::send_request() { } // 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; } @@ -814,9 +820,9 @@ int ImageCompareAndWriteRequest::prune_object_extents( template ImageListSnapsRequest::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(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(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), @@ -837,8 +843,9 @@ void ImageListSnapsRequest::send_request() { } 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); diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index 919a7381d378d..cd7b203e80cd6 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -27,22 +27,21 @@ class ReadResult; template class ImageRequest { public: - typedef std::vector > 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); @@ -50,12 +49,12 @@ public: 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, @@ -73,15 +72,16 @@ protected: 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"); } @@ -96,12 +96,10 @@ protected: template class ImageReadRequest : public ImageRequest { public: - using typename ImageRequest::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; @@ -126,14 +124,13 @@ public: protected: using typename ImageRequest::ObjectRequests; - using typename ImageRequest::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(image_ctx, aio_comp, std::move(image_extents), - io_context, trace_name, parent_trace), + area, io_context, trace_name, parent_trace), m_synchronous(false) { } @@ -160,15 +157,13 @@ private: template class ImageWriteRequest : public AbstractImageWriteRequest { public: - using typename ImageRequest::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( - 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) { } @@ -201,12 +196,12 @@ template class ImageDiscardRequest : public AbstractImageWriteRequest { 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( - 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) { } @@ -240,8 +235,9 @@ public: ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, FlushSource flush_source, const ZTracer::Trace &parent_trace) - : ImageRequest(image_ctx, aio_comp, {}, {}, "flush", - parent_trace), + : ImageRequest(image_ctx, aio_comp, {}, + ImageArea::DATA /* dummy for {} */, + {}, "flush", parent_trace), m_flush_source(flush_source) { } @@ -268,12 +264,12 @@ template class ImageWriteSameRequest : public AbstractImageWriteRequest { 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( - 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) { } @@ -304,12 +300,12 @@ public: using typename ImageRequest::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( - 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) { @@ -346,12 +342,11 @@ private: template class ImageListSnapsRequest : public ImageRequest { public: - using typename ImageRequest::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 {} diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 0ce90e30de3bd..9c27be813524c 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -992,7 +992,7 @@ void ObjectListSnapsRequest::list_from_parent() { m_list_snaps_flags | LIST_SNAPS_FLAG_IGNORE_ZEROED_EXTENTS); ImageListSnapsRequest 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(); @@ -1023,8 +1023,9 @@ void ObjectListSnapsRequest::handle_list_from_parent(int r) { // 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( diff --git a/src/librbd/io/Types.h b/src/librbd/io/Types.h index 8ca9ccb1b4332..7c70986c5846a 100644 --- a/src/librbd/io/Types.h +++ b/src/librbd/io/Types.h @@ -95,6 +95,10 @@ enum { 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 { diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc index c5fa3484e237f..f4cb42957e7aa 100644 --- a/src/librbd/io/Utils.cc +++ b/src/librbd/io/Utils.cc @@ -184,12 +184,11 @@ bool trigger_copyup(I* image_ctx, uint64_t object_no, IOContext io_context, } template -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); @@ -245,10 +244,10 @@ template int librbd::io::util::clip_request( 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; diff --git a/src/librbd/io/Utils.h b/src/librbd/io/Utils.h index 16a14c105331a..f2096de842d70 100644 --- a/src/librbd/io/Utils.h +++ b/src/librbd/io/Utils.h @@ -53,11 +53,12 @@ void unsparsify(CephContext* cct, ceph::bufferlist* bl, template bool trigger_copyup(ImageCtxT *image_ctx, uint64_t object_no, IOContext io_context, Context* on_finish); - + template -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 std::pair object_to_area_extents( diff --git a/src/librbd/journal/Replay.cc b/src/librbd/journal/Replay.cc index db73edb610947..c35b44bfcd727 100644 --- a/src/librbd/journal/Replay.cc +++ b/src/librbd/journal/Replay.cc @@ -356,6 +356,7 @@ void Replay::handle_event(const journal::AioDiscardEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::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(), {}); } @@ -391,7 +392,7 @@ void Replay::handle_event(const journal::AioWriteEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::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, {}); } @@ -445,7 +446,7 @@ void Replay::handle_event(const journal::AioWriteSameEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::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, {}); } @@ -479,6 +480,7 @@ void Replay::handle_event(const journal::AioWriteSameEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::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, diff --git a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc index af0ebd28cced4..d813a5a33bcfd 100644 --- a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc @@ -45,10 +45,11 @@ inline ImageCtx* get_image_ctx(MockTestImageCtx* image_ctx) { 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); } diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index f7f2611490cfe..b8a193619deac 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -84,10 +84,11 @@ 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); } diff --git a/src/test/librbd/io/test_mock_ImageRequest.cc b/src/test/librbd/io/test_mock_ImageRequest.cc index 8487c4d5537a7..e2ac825630ccc 100644 --- a/src/test/librbd/io/test_mock_ImageRequest.cc +++ b/src/test/librbd/io/test_mock_ImageRequest.cc @@ -60,11 +60,11 @@ 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); } @@ -204,7 +204,7 @@ TEST_F(TestMockIoImageRequest, AioWriteModifyTimestamp) { 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}; @@ -217,7 +217,7 @@ TEST_F(TestMockIoImageRequest, AioWriteModifyTimestamp) { 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}; @@ -260,7 +260,7 @@ TEST_F(TestMockIoImageRequest, AioReadAccessTimestamp) { 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}; @@ -273,7 +273,7 @@ TEST_F(TestMockIoImageRequest, AioReadAccessTimestamp) { 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}; @@ -299,7 +299,7 @@ TEST_F(TestMockIoImageRequest, PartialDiscard) { 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}; @@ -327,7 +327,7 @@ TEST_F(TestMockIoImageRequest, TailDiscard) { &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}; @@ -358,7 +358,8 @@ TEST_F(TestMockIoImageRequest, DiscardGranularity) { 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(); @@ -388,7 +389,7 @@ TEST_F(TestMockIoImageRequest, AioWriteJournalAppendDisabled) { 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}; @@ -417,8 +418,8 @@ TEST_F(TestMockIoImageRequest, AioDiscardJournalAppendDisabled) { 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(); @@ -476,7 +477,7 @@ TEST_F(TestMockIoImageRequest, AioWriteSameJournalAppendDisabled) { 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}; @@ -510,8 +511,9 @@ TEST_F(TestMockIoImageRequest, AioCompareAndWriteJournalAppendDisabled) { 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(); @@ -548,8 +550,8 @@ TEST_F(TestMockIoImageRequest, ListSnaps) { 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(); diff --git a/src/test/librbd/io/test_mock_ObjectRequest.cc b/src/test/librbd/io/test_mock_ObjectRequest.cc index 38ac506c4f852..503c83827d5a2 100644 --- a/src/test/librbd/io/test_mock_ObjectRequest.cc +++ b/src/test/librbd/io/test_mock_ObjectRequest.cc @@ -71,8 +71,9 @@ struct ImageListSnapsRequest { } 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; @@ -91,10 +92,11 @@ ImageListSnapsRequest* ImageListSnapsRequest 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); } diff --git a/src/test/librbd/journal/test_mock_Replay.cc b/src/test/librbd/journal/test_mock_Replay.cc index b902e0f959245..7bed2532aa87d 100644 --- a/src/test/librbd/journal/test_mock_Replay.cc +++ b/src/test/librbd/journal/test_mock_Replay.cc @@ -31,8 +31,8 @@ struct ImageRequest { 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); @@ -41,7 +41,7 @@ struct ImageRequest { 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) { @@ -61,8 +61,8 @@ struct ImageRequest { 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); @@ -73,8 +73,9 @@ struct ImageRequest { 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); -- 2.39.5