// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #include "librbd/io/ImageDispatch.h" #include "common/dout.h" #include "librbd/ImageCtx.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/ImageRequest.h" #include "librbd/io/ObjectDispatcherInterface.h" #define dout_subsys ceph_subsys_rbd #undef dout_prefix #define dout_prefix *_dout << "librbd::io::ImageDispatch: " << this << " " \ << __func__ << ": " namespace librbd { namespace io { namespace { void start_in_flight_io(AioCompletion* aio_comp) { // TODO remove AsyncOperation from AioCompletion if (!aio_comp->async_op.started()) { aio_comp->start_op(); } } } // anonymous namespace template void ImageDispatch::shut_down(Context* on_finish) { on_finish->complete(0); } template bool ImageDispatch::read( AioCompletion* aio_comp, Extents &&image_extents, ReadResult &&read_result, IOContext io_context, int op_flags, int read_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << "image_extents=" << image_extents << 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); return true; } template bool ImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << "image_extents=" << image_extents << 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); return true; } template bool ImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << "image_extents=" << image_extents << 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); return true; } template bool ImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << "image_extents=" << image_extents << 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); return true; } template bool ImageDispatch::compare_and_write( 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, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << "image_extents=" << image_extents << 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); return true; } template bool ImageDispatch::flush( AioCompletion* aio_comp, FlushSource flush_source, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << dendl; start_in_flight_io(aio_comp); *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_flush(m_image_ctx, aio_comp, flush_source, parent_trace); return true; } template bool ImageDispatch::list_snaps( AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids, int list_snaps_flags, SnapshotDelta* snapshot_delta, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << 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); req.send(); return true; } template bool ImageDispatch::invalidate_cache(Context* on_finish) { auto cct = m_image_ctx->cct; ldout(cct, 20) << dendl; std::shared_lock owner_lock{m_image_ctx->owner_lock}; m_image_ctx->io_object_dispatcher->invalidate_cache(on_finish); return true; } } // namespace io } // namespace librbd template class librbd::io::ImageDispatch;