diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index aa34753e15b..8c6b632d0e2 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -149,30 +149,35 @@ private: } // anonymous namespace template -void AioImageRequest::aio_read( - I *ictx, AioCompletion *c, - const std::vector > &extents, - char *buf, bufferlist *pbl, int op_flags) { +void AioImageRequest::aio_read(I *ictx, AioCompletion *c, + const Extents &extents, char *buf, + bufferlist *pbl, int op_flags) { AioImageRead req(*ictx, c, extents, buf, pbl, op_flags); req.send(); } template -void AioImageRequest::aio_read(I *ictx, AioCompletion *c, - uint64_t off, size_t len, char *buf, - bufferlist *pbl, int op_flags) { +void AioImageRequest::aio_read(I *ictx, AioCompletion *c, uint64_t off, + size_t len, char *buf, bufferlist *pbl, + int op_flags) { AioImageRead req(*ictx, c, off, len, buf, pbl, op_flags); req.send(); } template -void AioImageRequest::aio_write(I *ictx, AioCompletion *c, - uint64_t off, size_t len, const char *buf, - int op_flags) { +void AioImageRequest::aio_write(I *ictx, AioCompletion *c, uint64_t off, + size_t len, const char *buf, int op_flags) { AioImageWrite req(*ictx, c, off, len, buf, op_flags); req.send(); } +template +void AioImageRequest::aio_write(I *ictx, AioCompletion *c, uint64_t off, + bufferlist &&bl, int op_flags) { + AioImageWrite req(*ictx, c, off, std::move(bl), op_flags); + req.send(); +} + template void AioImageRequest::aio_discard(I *ictx, AioCompletion *c, uint64_t off, uint64_t len) { @@ -393,19 +398,18 @@ void AioImageWrite::assemble_extent(const ObjectExtent &object_extent, bufferlist *bl) { for (auto q = object_extent.buffer_extents.begin(); q != object_extent.buffer_extents.end(); ++q) { - bl->append(m_buf + q->first, q->second);; + bufferlist sub_bl; + sub_bl.substr_of(m_bl, q->first, q->second); + bl->claim_append(sub_bl); } } template uint64_t AioImageWrite::append_journal_event( const AioObjectRequests &requests, bool synchronous) { - bufferlist bl; - bl.append(m_buf, this->m_len); - I &image_ctx = this->m_image_ctx; uint64_t tid = image_ctx.journal->append_write_event(this->m_off, this->m_len, - bl, requests, + m_bl, requests, synchronous); if (image_ctx.object_cacher == NULL) { AioCompletion *aio_comp = this->m_aio_comp; diff --git a/src/librbd/AioImageRequest.h b/src/librbd/AioImageRequest.h index 3d6b3851b35..238989ed4e3 100644 --- a/src/librbd/AioImageRequest.h +++ b/src/librbd/AioImageRequest.h @@ -33,6 +33,8 @@ public: size_t len, char *buf, bufferlist *pbl, int op_flags); static void aio_write(ImageCtxT *ictx, AioCompletion *c, uint64_t off, size_t len, const char *buf, int op_flags); + static void aio_write(ImageCtxT *ictx, AioCompletion *c, uint64_t off, + bufferlist &&bl, int op_flags); static void aio_discard(ImageCtxT *ictx, AioCompletion *c, uint64_t off, uint64_t len); static void aio_flush(ImageCtxT *ictx, AioCompletion *c); @@ -153,7 +155,13 @@ public: AioImageWrite(ImageCtxT &image_ctx, AioCompletion *aio_comp, uint64_t off, size_t len, const char *buf, int op_flags) : AbstractAioImageWrite(image_ctx, aio_comp, off, len), - m_buf(buf), m_op_flags(op_flags) { + m_op_flags(op_flags) { + m_bl.append(buf, len); + } + AioImageWrite(ImageCtxT &image_ctx, AioCompletion *aio_comp, uint64_t off, + bufferlist &&bl, int op_flags) + : AbstractAioImageWrite(image_ctx, aio_comp, off, bl.length()), + m_bl(std::move(bl)), m_op_flags(op_flags) { } protected: @@ -183,7 +191,7 @@ protected: bool synchronous); virtual void update_stats(size_t length); private: - const char *m_buf; + bufferlist m_bl; int m_op_flags; };