]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: consolidate IO clipping to reusable method
authorJason Dillaman <dillaman@redhat.com>
Fri, 13 May 2016 14:59:01 +0000 (10:59 -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
src/librbd/AioImageRequest.h

index b41430cf573d1d02d5e085192699557c8c11a99e..7768551e5e65b86e724f41cf61785e57a61a20d7 100644 (file)
@@ -197,6 +197,12 @@ void AioImageRequest<I>::send() {
                  << "completion=" << aio_comp <<  dendl;
 
   aio_comp->get();
+  int r = clip_request();
+  if (r < 0) {
+    m_aio_comp->fail(r);
+    return;
+  }
+
   if (m_bypass_image_cache || true) { // TODO
     send_request();
   } else {
@@ -204,6 +210,21 @@ void AioImageRequest<I>::send() {
   }
 }
 
+template <typename I>
+int AioImageRequest<I>::clip_request() {
+  RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+  for (auto &image_extent : m_image_extents) {
+    size_t clip_len = image_extent.second;
+    int r = clip_io(get_image_ctx(&m_image_ctx), image_extent.first, &clip_len);
+    if (r < 0) {
+      return r;
+    }
+
+    image_extent.second = clip_len;
+  }
+  return 0;
+}
+
 template <typename I>
 void AioImageRequest<I>::fail(int r) {
   AioCompletion *aio_comp = this->m_aio_comp;
@@ -232,22 +253,16 @@ void AioImageRead<I>::send_request() {
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
     snap_id = image_ctx.snap_id;
 
-    // map
+    // map image extents to object extents
     for (auto &extent : image_extents) {
-      uint64_t len = extent.second;
-      int r = clip_io(get_image_ctx(&image_ctx), extent.first, &len);
-      if (r < 0) {
-        aio_comp->fail(r);
-        return;
-      }
-      if (len == 0) {
+      if (extent.second == 0) {
         continue;
       }
 
-      Striper::file_to_extents(cct, image_ctx.format_string,
-                               &image_ctx.layout, extent.first, len, 0,
-                               object_extents, buffer_ofs);
-      buffer_ofs += len;
+      Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout,
+                               extent.first, extent.second, 0, object_extents,
+                               buffer_ofs);
+      buffer_ofs += extent.second;
     }
   }
 
@@ -321,21 +336,14 @@ void AbstractAioImageWrite<I>::send_request() {
     }
 
     for (auto &extent : this->m_image_extents) {
-      uint64_t len = extent.second;
-      int r = clip_io(get_image_ctx(&image_ctx), extent.first, &len);
-      if (r < 0) {
-        aio_comp->fail(r);
-        return;
-      }
-      if (len == 0) {
+      if (extent.second == 0) {
         continue;
       }
 
       // map to object extents
-      Striper::file_to_extents(cct, image_ctx.format_string,
-                               &image_ctx.layout, extent.first, len, 0,
-                               object_extents);
-      clip_len += len;
+      Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout,
+                               extent.first, extent.second, 0, object_extents);
+      clip_len += extent.second;
     }
 
     snapc = image_ctx.snapc;
index f4dc57d2f2af53a736220603823384de7a44f81c..a9afd9f9b0bfb9ab8080658445337947648761c4 100644 (file)
@@ -66,6 +66,7 @@ protected:
       m_image_extents(image_extents) {
   }
 
+  virtual int clip_request();
   virtual void send_request() = 0;
   virtual void send_image_cache_request() = 0;
 
@@ -250,6 +251,9 @@ public:
 protected:
   using typename AioImageRequest<ImageCtxT>::AioObjectRequests;
 
+  virtual int clip_request() {
+    return 0;
+  }
   virtual void send_request();
   virtual void send_image_cache_request() override;