} // anonymous namespace
+template <typename I>
+ImageRequest<I>* ImageRequest<I>::create_read_request(
+ I &image_ctx, AioCompletion *aio_comp, Extents &&image_extents,
+ ReadResult &&read_result, int op_flags,
+ const ZTracer::Trace &parent_trace) {
+ return new ImageReadRequest<I>(image_ctx, aio_comp,
+ std::move(image_extents),
+ std::move(read_result), op_flags,
+ parent_trace);
+}
+
+template <typename I>
+ImageRequest<I>* ImageRequest<I>::create_write_request(
+ I &image_ctx, AioCompletion *aio_comp, Extents &&image_extents,
+ bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) {
+ return new ImageWriteRequest<I>(image_ctx, aio_comp, std::move(image_extents),
+ std::move(bl), op_flags, parent_trace);
+}
+
+template <typename I>
+ImageRequest<I>* ImageRequest<I>::create_discard_request(
+ I &image_ctx, AioCompletion *aio_comp, uint64_t off, uint64_t len,
+ bool skip_partial_discard, const ZTracer::Trace &parent_trace) {
+ return new ImageDiscardRequest<I>(image_ctx, aio_comp, off, len,
+ skip_partial_discard, parent_trace);
+}
+
+template <typename I>
+ImageRequest<I>* ImageRequest<I>::create_flush_request(
+ I &image_ctx, AioCompletion *aio_comp,
+ const ZTracer::Trace &parent_trace) {
+ return new ImageFlushRequest<I>(image_ctx, aio_comp, parent_trace);
+}
+
+template <typename I>
+ImageRequest<I>* ImageRequest<I>::create_writesame_request(
+ I &image_ctx, AioCompletion *aio_comp, uint64_t off, uint64_t len,
+ bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) {
+ return new ImageWriteSameRequest<I>(image_ctx, aio_comp, off, len,
+ std::move(bl), op_flags, parent_trace);
+}
+
template <typename I>
void ImageRequest<I>::aio_read(I *ictx, AioCompletion *c,
Extents &&image_extents,
m_trace.event("finish");
}
+ static ImageRequest* create_read_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ Extents &&image_extents,
+ ReadResult &&read_result,
+ int op_flags,
+ const ZTracer::Trace &parent_trace);
+ static ImageRequest* create_write_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ Extents &&image_extents,
+ bufferlist &&bl, int op_flags,
+ const ZTracer::Trace &parent_trace);
+ static ImageRequest* create_discard_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ uint64_t off, uint64_t len,
+ bool skip_partial_discard,
+ const ZTracer::Trace &parent_trace);
+ static ImageRequest* create_flush_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ const ZTracer::Trace &parent_trace);
+ static ImageRequest* create_writesame_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ uint64_t off, uint64_t len,
+ bufferlist &&bl, int op_flags,
+ const ZTracer::Trace &parent_trace);
+
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, ReadResult &&read_result,
int op_flags, const ZTracer::Trace &parent_trace);
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty() ||
require_lock_on_read()) {
- queue(new ImageReadRequest<I>(m_image_ctx, c, {{off, len}},
- std::move(read_result), op_flags, trace));
+ queue(ImageRequest<I>::create_read_request(
+ m_image_ctx, c, {{off, len}}, std::move(read_result), op_flags,
+ trace));
} else {
c->start_op();
ImageRequest<I>::aio_read(&m_image_ctx, c, {{off, len}},
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
- queue(new ImageWriteRequest<I>(m_image_ctx, c, {{off, len}},
- std::move(bl), op_flags, trace));
+ queue(ImageRequest<I>::create_write_request(
+ m_image_ctx, c, {{off, len}}, std::move(bl), op_flags, trace));
} else {
c->start_op();
ImageRequest<I>::aio_write(&m_image_ctx, c, {{off, len}},
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
- queue(new ImageDiscardRequest<I>(m_image_ctx, c, off, len,
- skip_partial_discard, trace));
+ queue(ImageRequest<I>::create_discard_request(
+ m_image_ctx, c, off, len, skip_partial_discard, trace));
} else {
c->start_op();
ImageRequest<I>::aio_discard(&m_image_ctx, c, off, len,
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty()) {
- queue(new ImageFlushRequest<I>(m_image_ctx, c, trace));
+ queue(ImageRequest<I>::create_flush_request(m_image_ctx, c, trace));
} else {
ImageRequest<I>::aio_flush(&m_image_ctx, c, trace);
finish_in_flight_io();
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
- queue(new ImageWriteSameRequest<I>(m_image_ctx, c, off, len, std::move(bl),
- op_flags, trace));
+ queue(ImageRequest<I>::create_writesame_request(
+ m_image_ctx, c, off, len, std::move(bl), op_flags, trace));
} else {
c->start_op();
ImageRequest<I>::aio_writesame(&m_image_ctx, c, off, len, std::move(bl),