Blame SOURCES/kvm-block-Reuse-bs-as-backing-hd-for-drive-backup-sync-n.patch

76daa3
From 7e36f6ce772d6aedad81c6e8d4cd3c5100a57369 Mon Sep 17 00:00:00 2001
76daa3
From: Fam Zheng <famz@redhat.com>
76daa3
Date: Thu, 18 May 2017 10:02:17 +0200
76daa3
Subject: [PATCH 18/27] block: Reuse bs as backing hd for drive-backup
76daa3
 sync=none
76daa3
76daa3
RH-Author: Fam Zheng <famz@redhat.com>
76daa3
Message-id: <20170518100217.15981-2-famz@redhat.com>
76daa3
Patchwork-id: 75310
76daa3
O-Subject: [RHV-7.4 qemu-kvm-rhev PATCH 1/1] block: Reuse bs as backing hd for drive-backup sync=none
76daa3
Bugzilla: 1452066
76daa3
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
76daa3
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
76daa3
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
76daa3
76daa3
Opening the backing image for the second time is bad, especially here
76daa3
when it is also in use as the active image as the source. The
76daa3
drive-backup job itself doesn't read from target->backing for COW,
76daa3
instead it gets data from the write notifier, so it's not a big problem.
76daa3
However, exporting the target to NBD etc. won't work, because of the
76daa3
likely stale metadata cache.
76daa3
76daa3
Use BDRV_O_NO_BACKING in this case and manually set up the backing
76daa3
BdrvChild.
76daa3
76daa3
Cc: qemu-stable@nongnu.org
76daa3
Signed-off-by: Fam Zheng <famz@redhat.com>
76daa3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
76daa3
(cherry picked from commit fc0932fdcfc3e5cafa3641e361b681c07f639812)
76daa3
Signed-off-by: Fam Zheng <famz@redhat.com>
76daa3
76daa3
Context conflict because downstream doesn't have the new
76daa3
qdict_put_str(), which conversion happened in 46f5ac205a9d (qobject: Use
76daa3
simpler QDict/QList scalar insertion macros). Note that specific hunk is
76daa3
a superfluous change in the upstream commit, but let's follow suit to
76daa3
reduce future conflict.
76daa3
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 blockdev.c | 15 ++++++++++++++-
76daa3
 1 file changed, 14 insertions(+), 1 deletion(-)
76daa3
76daa3
diff --git a/blockdev.c b/blockdev.c
76daa3
index b0894fa..4432143 100644
76daa3
--- a/blockdev.c
76daa3
+++ b/blockdev.c
76daa3
@@ -3199,6 +3199,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
76daa3
     Error *local_err = NULL;
76daa3
     int flags;
76daa3
     int64_t size;
76daa3
+    bool set_backing_hd = false;
76daa3
 
76daa3
     if (!backup->has_speed) {
76daa3
         backup->speed = 0;
76daa3
@@ -3249,6 +3250,8 @@ static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
76daa3
     }
76daa3
     if (backup->sync == MIRROR_SYNC_MODE_NONE) {
76daa3
         source = bs;
76daa3
+        flags |= BDRV_O_NO_BACKING;
76daa3
+        set_backing_hd = true;
76daa3
     }
76daa3
 
76daa3
     size = bdrv_getlength(bs);
76daa3
@@ -3275,7 +3278,9 @@ static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
76daa3
     }
76daa3
 
76daa3
     if (backup->format) {
76daa3
-        options = qdict_new();
76daa3
+        if (!options) {
76daa3
+            options = qdict_new();
76daa3
+        }
76daa3
         qdict_put(options, "driver", qstring_from_str(backup->format));
76daa3
     }
76daa3
 
76daa3
@@ -3286,6 +3291,14 @@ static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
76daa3
 
76daa3
     bdrv_set_aio_context(target_bs, aio_context);
76daa3
 
76daa3
+    if (set_backing_hd) {
76daa3
+        bdrv_set_backing_hd(target_bs, source, &local_err);
76daa3
+        if (local_err) {
76daa3
+            bdrv_unref(target_bs);
76daa3
+            goto out;
76daa3
+        }
76daa3
+    }
76daa3
+
76daa3
     if (backup->has_bitmap) {
76daa3
         bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap);
76daa3
         if (!bmap) {
76daa3
-- 
76daa3
1.8.3.1
76daa3