From: Jason Dillaman Date: Fri, 26 Aug 2016 15:04:03 +0000 (-0400) Subject: librbd: C_ImageCacheRead bridge from Context to AioCompletion X-Git-Tag: v11.0.1~363^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6beb353c1afa116fd805ceb3155acacda25f40bf;p=ceph.git librbd: C_ImageCacheRead bridge from Context to AioCompletion Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index c814fbefec8e..984e6c69c7e2 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: