From 6beb353c1afa116fd805ceb3155acacda25f40bf Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 26 Aug 2016 11:04:03 -0400 Subject: [PATCH] librbd: C_ImageCacheRead bridge from Context to AioCompletion Signed-off-by: Jason Dillaman --- src/librbd/AioImageRequest.cc | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index c814fbefec8..984e6c69c7e 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -118,6 +118,44 @@ private: AioObjectRead *m_req; }; +template +class C_ImageCacheRead : public C_AioRequest { +public: + typedef std::vector > Extents; + + C_ImageCacheRead(AioCompletion *completion, const Extents &image_extents) + : C_AioRequest(completion), m_image_extents(image_extents) { + } + + inline bufferlist &get_data() { + return m_bl; + } + +protected: + virtual void finish(int r) { + CephContext *cct = m_completion->ictx->cct; + ldout(cct, 10) << "C_ImageCacheRead::finish() " << this << ": r=" << r + << dendl; + if (r >= 0) { + size_t length = 0; + for (auto &image_extent : m_image_extents) { + length += image_extent.second; + } + assert(length == m_bl.length()); + + m_completion->lock.Lock(); + m_completion->destriper.add_partial_result(cct, m_bl, m_image_extents); + m_completion->lock.Unlock(); + r = length; + } + C_AioRequest::finish(r); + } + +private: + bufferlist m_bl; + Extents m_image_extents; +}; + template class C_ObjectCacheRead : public Context { public: -- 2.39.5