From 824da2029613a6f4b380b6b2f16a0bd0903f7e3c Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Mon, 31 Mar 2014 14:53:31 -0700 Subject: [PATCH] librbd: skip zeroes when copying an image 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 --- src/librbd/internal.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 61e910b07ed28..8056fab587b62 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1955,6 +1955,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); -- 2.39.5