} // anonymous namespace
+template <typename I>
+AioImageRequest<I>* AioImageRequest<I>::create_read_request(
+ I &image_ctx, AioCompletion *aio_comp, uint64_t off, size_t len,
+ char *buf, bufferlist *pbl, int op_flags) {
+ return new AioImageRead<I>(image_ctx, aio_comp, off, len, buf, pbl,
+ op_flags);
+}
+
+template <typename I>
+AioImageRequest<I>* AioImageRequest<I>::create_write_request(
+ I &image_ctx, AioCompletion *aio_comp, uint64_t off, size_t len,
+ const char *buf, int op_flags) {
+ return new AioImageWrite<I>(image_ctx, aio_comp, off, len, buf, op_flags);
+}
+
+template <typename I>
+AioImageRequest<I>* AioImageRequest<I>::create_discard_request(
+ I &image_ctx, AioCompletion *aio_comp, uint64_t off, uint64_t len) {
+ return new AioImageDiscard<I>(image_ctx, aio_comp, off, len);
+}
+
+template <typename I>
+AioImageRequest<I>* AioImageRequest<I>::create_flush_request(
+ I &image_ctx, AioCompletion *aio_comp) {
+ return new AioImageFlush<I>(image_ctx, aio_comp);
+}
+
template <typename I>
void AioImageRequest<I>::aio_read(
I *ictx, AioCompletion *c,
virtual ~AioImageRequest() {}
+ static AioImageRequest* create_read_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ uint64_t off, size_t len,
+ char *buf, bufferlist *pbl,
+ int op_flags);
+ static AioImageRequest* create_write_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ uint64_t off, size_t len,
+ const char *buf, int op_flags);
+ static AioImageRequest* create_discard_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp,
+ uint64_t off, uint64_t len);
+ static AioImageRequest* create_flush_request(ImageCtxT &image_ctx,
+ AioCompletion *aio_comp);
+
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
const std::vector<std::pair<uint64_t,uint64_t> > &extents,
char *buf, bufferlist *pbl, int op_flags);
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 AioImageRead<>(m_image_ctx, c, off, len, buf, pbl, op_flags));
+ queue(AioImageRequest<I>::create_read_request(m_image_ctx, c, off, len,
+ buf, pbl, op_flags));
} else {
c->start_op();
AioImageRequest<I>::aio_read(&m_image_ctx, c, off, len, buf, pbl, op_flags);
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
- queue(new AioImageWrite<>(m_image_ctx, c, off, len, buf, op_flags));
+ queue(AioImageRequest<I>::create_write_request(m_image_ctx, c, off, len,
+ buf, op_flags));
} else {
c->start_op();
AioImageRequest<I>::aio_write(&m_image_ctx, c, off, len, buf, op_flags);
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
if (m_image_ctx.non_blocking_aio || writes_blocked()) {
- queue(new AioImageDiscard<>(m_image_ctx, c, off, len));
+ queue(AioImageRequest<I>::create_discard_request(m_image_ctx, c, off,
+ len));
} else {
c->start_op();
AioImageRequest<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 AioImageFlush<>(m_image_ctx, c));
+ queue(AioImageRequest<I>::create_flush_request(m_image_ctx, c));
} else {
AioImageRequest<I>::aio_flush(&m_image_ctx, c);
finish_in_flight_io();