]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: skip zeroes when copying an image
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 31 Mar 2014 21:53:31 +0000 (14:53 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Wed, 16 Jul 2014 17:43:05 +0000 (10:43 -0700)
This is the simple coarse-grained solution, but it works well in
common cases like a small base image resized with a bunch of empty
space at the end. Finer-grained sparseness can be copied by using rbd
{export,import}-diff.

Fixes: #6257
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
(cherry picked from commit 824da2029613a6f4b380b6b2f16a0bd0903f7e3c)

src/librbd/internal.cc

index e70fe22fc5623dc78a76a2f9906a08f726004f7a..a32ce9462290bd70b92cc68cddf07aba35fb46d6 100644 (file)
@@ -1948,6 +1948,13 @@ reprotect_and_return_err:
        return;
       }
       assert(m_bl->length() == (size_t)r);
+
+      if (m_bl->is_zero()) {
+       delete m_bl;
+       m_throttle->end_op(r);
+       return;
+      }
+
       Context *ctx = new C_CopyWrite(m_throttle, m_bl);
       AioCompletion *comp = aio_create_completion_internal(ctx, rbd_ctx_cb);
       r = aio_write(m_dest, m_offset, m_bl->length(), m_bl->c_str(), comp);