]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: resize should only update image size within header 6585/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 2 Nov 2015 21:50:19 +0000 (16:50 -0500)
committerAbhishek Lekshmanan <abhishek.lekshmanan@ril.com>
Sat, 14 Nov 2015 18:39:18 +0000 (00:09 +0530)
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 <dillaman@redhat.com>
(cherry picked from commit d5be20b6d4646284571568ab28cbf45b0729390b)

src/librbd/AsyncResizeRequest.cc

index 8ddf96726a9171fed3dd15cd91f795b43d8e6020..ad4fd1a73fa9c986733c8ed5b5dfb15a0288d092 100644 (file)
@@ -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<const char*>(&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);