]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: C_ImageCacheRead bridge from Context to AioCompletion
authorJason Dillaman <dillaman@redhat.com>
Fri, 26 Aug 2016 15:04:03 +0000 (11:04 -0400)
committerJason Dillaman <dillaman@redhat.com>
Sat, 27 Aug 2016 23:37:37 +0000 (19:37 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/AioImageRequest.cc

index c814fbefec8e3d806fa6fbe16a83983d7c32e16b..984e6c69c7e2bd5a657999f9d7347b864f4daf30 100644 (file)
@@ -118,6 +118,44 @@ private:
   AioObjectRead<ImageCtxT> *m_req;
 };
 
+template <typename ImageCtxT>
+class C_ImageCacheRead : public C_AioRequest {
+public:
+  typedef std::vector<std::pair<uint64_t,uint64_t> > 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 <typename ImageCtxT>
 class C_ObjectCacheRead : public Context {
 public: