From a3223173f85c42147ff4ced730beffe85146a4ed Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 2 Nov 2015 16:50:19 -0500 Subject: [PATCH] librbd: resize should only update image size within header Previously, the whole RBD image format 1 header struct was re-written to disk on a resize operation. Fixes: #13674 Backport: infernalis, hammer, firefly Signed-off-by: Jason Dillaman (cherry picked from commit d5be20b6d4646284571568ab28cbf45b0729390b) --- src/librbd/AsyncResizeRequest.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/librbd/AsyncResizeRequest.cc b/src/librbd/AsyncResizeRequest.cc index 8ddf96726a917..ad4fd1a73fa9c 100644 --- a/src/librbd/AsyncResizeRequest.cc +++ b/src/librbd/AsyncResizeRequest.cc @@ -245,11 +245,11 @@ void AsyncResizeRequest::send_update_header() { librados::ObjectWriteOperation op; if (m_image_ctx.old_format) { - // rewrite header + // rewrite only the size field of the header + // NOTE: format 1 image headers are not stored in fixed endian format bufferlist bl; - m_image_ctx.header.image_size = m_new_size; - bl.append((const char *)&m_image_ctx.header, sizeof(m_image_ctx.header)); - op.write(0, bl); + bl.append(reinterpret_cast(&m_new_size), sizeof(m_new_size)); + op.write(offsetof(rbd_obj_header_ondisk, image_size), bl); } else { if (m_image_ctx.image_watcher->is_lock_supported()) { m_image_ctx.image_watcher->assert_header_locked(&op); -- 2.39.5