Blame SOURCES/kvm-block-Fix-flags-in-reopen-queue.patch

a59b75
From bf0e9a6374d872bde330fb3c4994697250ef235b Mon Sep 17 00:00:00 2001
a59b75
From: Fam Zheng <famz@redhat.com>
a59b75
Date: Tue, 13 Mar 2018 15:27:54 +0100
a59b75
Subject: [PATCH 1/4] block: Fix flags in reopen queue
a59b75
a59b75
RH-Author: Fam Zheng <famz@redhat.com>
a59b75
Message-id: <20180313152755.31475-2-famz@redhat.com>
a59b75
Patchwork-id: 79273
a59b75
O-Subject: [RHV7.5 qemu-kvm-ma PATCH v4 1/2] block: Fix flags in reopen queue
a59b75
Bugzilla: 1557206
a59b75
RH-Acked-by: Max Reitz <mreitz@redhat.com>
a59b75
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
a59b75
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
a59b75
a59b75
Reopen flags are not synchronized according to the
a59b75
bdrv_reopen_queue_child precedence until bdrv_reopen_prepare. It is a
a59b75
bit too late: we already check the consistency in bdrv_check_perm before
a59b75
that.
a59b75
a59b75
This fixes the bug that when bdrv_reopen a RO node as RW, the flags for
a59b75
backing child are wrong. Before, we could recurse with flags.rw=1; now,
a59b75
role->inherit_options + update_flags_from_options will make sure to
a59b75
clear the bit when necessary.  Note that this will not clear an
a59b75
explicitly set bit, as in the case of parallel block jobs (e.g.
a59b75
test_stream_parallel in 030), because the explicit options include
a59b75
'read-only=false' (for an intermediate node used by a different job).
a59b75
a59b75
Signed-off-by: Fam Zheng <famz@redhat.com>
a59b75
Reviewed-by: Max Reitz <mreitz@redhat.com>
a59b75
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
a59b75
Signed-off-by: Fam Zheng <famz@redhat.com>
a59b75
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a59b75
---
a59b75
 block.c | 8 ++++++++
a59b75
 1 file changed, 8 insertions(+)
a59b75
a59b75
diff --git a/block.c b/block.c
a59b75
index ca8a46b..a1084e7 100644
a59b75
--- a/block.c
a59b75
+++ b/block.c
a59b75
@@ -2759,8 +2759,16 @@ static BlockReopenQueue *bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
a59b75
 
a59b75
     /* Inherit from parent node */
a59b75
     if (parent_options) {
a59b75
+        QemuOpts *opts;
a59b75
+        QDict *options_copy;
a59b75
         assert(!flags);
a59b75
         role->inherit_options(&flags, options, parent_flags, parent_options);
a59b75
+        options_copy = qdict_clone_shallow(options);
a59b75
+        opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
a59b75
+        qemu_opts_absorb_qdict(opts, options_copy, NULL);
a59b75
+        update_flags_from_options(&flags, opts);
a59b75
+        qemu_opts_del(opts);
a59b75
+        QDECREF(options_copy);
a59b75
     }
a59b75
 
a59b75
     /* Old values are used for options that aren't set yet */
a59b75
-- 
a59b75
1.8.3.1
a59b75