* Tue Mar 17 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.2.0-15.el8
- kvm-block-nbd-Fix-hang-in-.bdrv_close.patch [bz#1640894] - kvm-block-Generic-file-creation-fallback.patch [bz#1640894] - kvm-file-posix-Drop-hdev_co_create_opts.patch [bz#1640894] - kvm-iscsi-Drop-iscsi_co_create_opts.patch [bz#1640894] - kvm-iotests-Add-test-for-image-creation-fallback.patch [bz#1640894] - kvm-block-Fix-leak-in-bdrv_create_file_fallback.patch [bz#1640894] - kvm-iotests-Use-complete_and_wait-in-155.patch [bz#1790482 bz#1805143] - kvm-block-Introduce-bdrv_reopen_commit_post-step.patch [bz#1790482 bz#1805143] - kvm-block-qcow2-Move-bitmap-reopen-into-bdrv_reopen_comm.patch [bz#1790482 bz#1805143] - kvm-iotests-Refactor-blockdev-reopen-test-for-iothreads.patch [bz#1790482 bz#1805143] - kvm-block-bdrv_reopen-with-backing-file-in-different-Aio.patch [bz#1790482 bz#1805143] - kvm-block-Versioned-x-blockdev-reopen-API-with-feature-f.patch [bz#1790482 bz#1805143] - kvm-block-Make-bdrv_get_cumulative_perm-public.patch [bz#1790482 bz#1805143] - kvm-block-Relax-restrictions-for-blockdev-snapshot.patch [bz#1790482 bz#1805143] - kvm-iotests-Fix-run_job-with-use_log-False.patch [bz#1790482 bz#1805143] - kvm-iotests-Test-mirror-with-temporarily-disabled-target.patch [bz#1790482 bz#1805143] - kvm-block-Fix-cross-AioContext-blockdev-snapshot.patch [bz#1790482 bz#1805143] - kvm-iotests-Add-iothread-cases-to-155.patch [bz#1790482 bz#1805143] - kvm-qapi-Add-allow-write-only-overlay-feature-for-blockd.patch [bz#1790482 bz#1805143] - kvm-exec-rom_reset-Free-rom-data-during-inmigrate-skip.patch [bz#1809380] - Resolves: bz#1640894 (Fix generic file creation fallback for qemu-img nvme:// image creation support) - Resolves: bz#1790482 (bitmaps in backing images can't be modified) - Resolves: bz#1805143 (allow late/lazy opening of backing chain for shallow blockdev-mirror) - Resolves: bz#1809380 (guest hang during reboot process after migration from RHEl7.8 to RHEL8.2.0.)
This commit is contained in:
parent
cb4ea43665
commit
dd7aef2877
91
kvm-block-Fix-cross-AioContext-blockdev-snapshot.patch
Normal file
91
kvm-block-Fix-cross-AioContext-blockdev-snapshot.patch
Normal file
@ -0,0 +1,91 @@
|
||||
From 5774af5a3c713d0c93010c30453812eae6a749cd Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:37 +0000
|
||||
Subject: [PATCH 17/20] block: Fix cross-AioContext blockdev-snapshot
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-12-kwolf@redhat.com>
|
||||
Patchwork-id: 94286
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 11/13] block: Fix cross-AioContext blockdev-snapshot
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
external_snapshot_prepare() tries to move the overlay to the AioContext
|
||||
of the backing file (the snapshotted node). However, it's possible that
|
||||
this doesn't work, but the backing file can instead be moved to the
|
||||
overlay's AioContext (e.g. opening the backing chain for a mirror
|
||||
target).
|
||||
|
||||
bdrv_append() already indirectly uses bdrv_attach_node(), which takes
|
||||
care to move nodes to make sure they use the same AioContext and which
|
||||
tries both directions.
|
||||
|
||||
So the problem has a simple fix: Just delete the unnecessary extra
|
||||
bdrv_try_set_aio_context() call in external_snapshot_prepare() and
|
||||
instead assert in bdrv_append() that both nodes were indeed moved to the
|
||||
same AioContext.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-6-kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 30dd65f307b647eef8156c4a33bd007823ef85cb)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 1 +
|
||||
blockdev.c | 16 ----------------
|
||||
2 files changed, 1 insertion(+), 16 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 354d388..ec29b1e 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -4327,6 +4327,7 @@ void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
|
||||
bdrv_ref(from);
|
||||
|
||||
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
|
||||
+ assert(bdrv_get_aio_context(from) == bdrv_get_aio_context(to));
|
||||
bdrv_drained_begin(from);
|
||||
|
||||
/* Put all parents into @list and calculate their cumulative permissions */
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 7918533..c8d4b51 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1535,9 +1535,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
DO_UPCAST(ExternalSnapshotState, common, common);
|
||||
TransactionAction *action = common->action;
|
||||
AioContext *aio_context;
|
||||
- AioContext *old_context;
|
||||
uint64_t perm, shared;
|
||||
- int ret;
|
||||
|
||||
/* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
|
||||
* purpose but a different set of parameters */
|
||||
@@ -1678,20 +1676,6 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /* Honor bdrv_try_set_aio_context() context acquisition requirements. */
|
||||
- old_context = bdrv_get_aio_context(state->new_bs);
|
||||
- aio_context_release(aio_context);
|
||||
- aio_context_acquire(old_context);
|
||||
-
|
||||
- ret = bdrv_try_set_aio_context(state->new_bs, aio_context, errp);
|
||||
-
|
||||
- aio_context_release(old_context);
|
||||
- aio_context_acquire(aio_context);
|
||||
-
|
||||
- if (ret < 0) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
/* This removes our old bs and adds the new bs. This is an operation that
|
||||
* can fail, so we need to do it in .prepare; undoing it for abort is
|
||||
* always possible. */
|
||||
--
|
||||
1.8.3.1
|
||||
|
60
kvm-block-Fix-leak-in-bdrv_create_file_fallback.patch
Normal file
60
kvm-block-Fix-leak-in-bdrv_create_file_fallback.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From 05452efd7e0fb0522099ae09a396f8f97e66014a Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:47 +0000
|
||||
Subject: [PATCH 06/20] block: Fix leak in bdrv_create_file_fallback()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-7-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94229
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 6/6] block: Fix leak in bdrv_create_file_fallback()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
@options is leaked by the first two return statements in this function.
|
||||
|
||||
Note that blk_new_open() takes the reference to @options even on
|
||||
failure, so all we need to do to fix the leak is to move the QDict
|
||||
allocation down to where we actually need it.
|
||||
|
||||
Reported-by: Coverity (CID 1419884)
|
||||
Fixes: fd17146cd93d1704cd96d7c2757b325fc7aac6fd
|
||||
("block: Generic file creation fallback")
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200225155618.133412-1-mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit eeea1faa099f82328f5831cf252f8ce0a59a9287)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 3beec7f..e1a4e38 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -600,7 +600,7 @@ static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
QemuOpts *opts, Error **errp)
|
||||
{
|
||||
BlockBackend *blk;
|
||||
- QDict *options = qdict_new();
|
||||
+ QDict *options;
|
||||
int64_t size = 0;
|
||||
char *buf = NULL;
|
||||
PreallocMode prealloc;
|
||||
@@ -623,6 +623,7 @@ static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
+ options = qdict_new();
|
||||
qdict_put_str(options, "driver", drv->format_name);
|
||||
|
||||
blk = blk_new_open(filename, NULL, options,
|
||||
--
|
||||
1.8.3.1
|
||||
|
227
kvm-block-Generic-file-creation-fallback.patch
Normal file
227
kvm-block-Generic-file-creation-fallback.patch
Normal file
@ -0,0 +1,227 @@
|
||||
From 882d09226b7f45b72c5b7763c4c4aba182e0f8a1 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:43 +0000
|
||||
Subject: [PATCH 02/20] block: Generic file creation fallback
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-3-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94227
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 2/6] block: Generic file creation fallback
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
If a protocol driver does not support image creation, we can see whether
|
||||
maybe the file exists already. If so, just truncating it will be
|
||||
sufficient.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-3-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit fd17146cd93d1704cd96d7c2757b325fc7aac6fd)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 147 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 2e5e8b6..3beec7f 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -532,20 +532,139 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
||||
+/**
|
||||
+ * Helper function for bdrv_create_file_fallback(): Resize @blk to at
|
||||
+ * least the given @minimum_size.
|
||||
+ *
|
||||
+ * On success, return @blk's actual length.
|
||||
+ * Otherwise, return -errno.
|
||||
+ */
|
||||
+static int64_t create_file_fallback_truncate(BlockBackend *blk,
|
||||
+ int64_t minimum_size, Error **errp)
|
||||
{
|
||||
- BlockDriver *drv;
|
||||
+ Error *local_err = NULL;
|
||||
+ int64_t size;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = blk_truncate(blk, minimum_size, false, PREALLOC_MODE_OFF, &local_err);
|
||||
+ if (ret < 0 && ret != -ENOTSUP) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ size = blk_getlength(blk);
|
||||
+ if (size < 0) {
|
||||
+ error_free(local_err);
|
||||
+ error_setg_errno(errp, -size,
|
||||
+ "Failed to inquire the new image file's length");
|
||||
+ return size;
|
||||
+ }
|
||||
+
|
||||
+ if (size < minimum_size) {
|
||||
+ /* Need to grow the image, but we failed to do that */
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return -ENOTSUP;
|
||||
+ }
|
||||
+
|
||||
+ error_free(local_err);
|
||||
+ local_err = NULL;
|
||||
+
|
||||
+ return size;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Helper function for bdrv_create_file_fallback(): Zero the first
|
||||
+ * sector to remove any potentially pre-existing image header.
|
||||
+ */
|
||||
+static int create_file_fallback_zero_first_sector(BlockBackend *blk,
|
||||
+ int64_t current_size,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ int64_t bytes_to_clear;
|
||||
+ int ret;
|
||||
+
|
||||
+ bytes_to_clear = MIN(current_size, BDRV_SECTOR_SIZE);
|
||||
+ if (bytes_to_clear) {
|
||||
+ ret = blk_pwrite_zeroes(blk, 0, bytes_to_clear, BDRV_REQ_MAY_UNMAP);
|
||||
+ if (ret < 0) {
|
||||
+ error_setg_errno(errp, -ret,
|
||||
+ "Failed to clear the new image's first sector");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
||||
+ QemuOpts *opts, Error **errp)
|
||||
+{
|
||||
+ BlockBackend *blk;
|
||||
+ QDict *options = qdict_new();
|
||||
+ int64_t size = 0;
|
||||
+ char *buf = NULL;
|
||||
+ PreallocMode prealloc;
|
||||
Error *local_err = NULL;
|
||||
int ret;
|
||||
|
||||
+ size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
|
||||
+ buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
||||
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
|
||||
+ PREALLOC_MODE_OFF, &local_err);
|
||||
+ g_free(buf);
|
||||
+ if (local_err) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (prealloc != PREALLOC_MODE_OFF) {
|
||||
+ error_setg(errp, "Unsupported preallocation mode '%s'",
|
||||
+ PreallocMode_str(prealloc));
|
||||
+ return -ENOTSUP;
|
||||
+ }
|
||||
+
|
||||
+ qdict_put_str(options, "driver", drv->format_name);
|
||||
+
|
||||
+ blk = blk_new_open(filename, NULL, options,
|
||||
+ BDRV_O_RDWR | BDRV_O_RESIZE, errp);
|
||||
+ if (!blk) {
|
||||
+ error_prepend(errp, "Protocol driver '%s' does not support image "
|
||||
+ "creation, and opening the image failed: ",
|
||||
+ drv->format_name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ size = create_file_fallback_truncate(blk, size, errp);
|
||||
+ if (size < 0) {
|
||||
+ ret = size;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = create_file_fallback_zero_first_sector(blk, size, errp);
|
||||
+ if (ret < 0) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = 0;
|
||||
+out:
|
||||
+ blk_unref(blk);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
||||
+{
|
||||
+ BlockDriver *drv;
|
||||
+
|
||||
drv = bdrv_find_protocol(filename, true, errp);
|
||||
if (drv == NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
- ret = bdrv_create(drv, filename, opts, &local_err);
|
||||
- error_propagate(errp, local_err);
|
||||
- return ret;
|
||||
+ if (drv->bdrv_co_create_opts) {
|
||||
+ return bdrv_create(drv, filename, opts, errp);
|
||||
+ } else {
|
||||
+ return bdrv_create_file_fallback(filename, drv, opts, errp);
|
||||
+ }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1422,6 +1541,24 @@ QemuOptsList bdrv_runtime_opts = {
|
||||
},
|
||||
};
|
||||
|
||||
+static QemuOptsList fallback_create_opts = {
|
||||
+ .name = "fallback-create-opts",
|
||||
+ .head = QTAILQ_HEAD_INITIALIZER(fallback_create_opts.head),
|
||||
+ .desc = {
|
||||
+ {
|
||||
+ .name = BLOCK_OPT_SIZE,
|
||||
+ .type = QEMU_OPT_SIZE,
|
||||
+ .help = "Virtual disk size"
|
||||
+ },
|
||||
+ {
|
||||
+ .name = BLOCK_OPT_PREALLOC,
|
||||
+ .type = QEMU_OPT_STRING,
|
||||
+ .help = "Preallocation mode (allowed values: off)"
|
||||
+ },
|
||||
+ { /* end of list */ }
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Common part for opening disk images and files
|
||||
*
|
||||
@@ -5743,14 +5880,12 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
||||
return;
|
||||
}
|
||||
|
||||
- if (!proto_drv->create_opts) {
|
||||
- error_setg(errp, "Protocol driver '%s' does not support image creation",
|
||||
- proto_drv->format_name);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
||||
- create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
+ if (proto_drv->create_opts) {
|
||||
+ create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||
+ } else {
|
||||
+ create_opts = qemu_opts_append(create_opts, &fallback_create_opts);
|
||||
+ }
|
||||
|
||||
/* Create parameter list with default values */
|
||||
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
||||
--
|
||||
1.8.3.1
|
||||
|
65
kvm-block-Introduce-bdrv_reopen_commit_post-step.patch
Normal file
65
kvm-block-Introduce-bdrv_reopen_commit_post-step.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From f7dd953c2d0380cef3c351afb03d68c6fcda1dca Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:28 +0000
|
||||
Subject: [PATCH 08/20] block: Introduce 'bdrv_reopen_commit_post' step
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-3-kwolf@redhat.com>
|
||||
Patchwork-id: 94278
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 02/13] block: Introduce 'bdrv_reopen_commit_post' step
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Add another step in the reopen process where driver can execute code
|
||||
after permission changes are comitted.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <adc02cf591c3cb34e98e33518eb1c540a0f27db1.1582893284.git.pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 17e1e2be5f9e84e0298e28e70675655b43e225ea)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 9 +++++++++
|
||||
include/block/block_int.h | 1 +
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index e1a4e38..a744bb5 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3657,6 +3657,15 @@ cleanup_perm:
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (ret == 0) {
|
||||
+ QTAILQ_FOREACH_REVERSE(bs_entry, bs_queue, entry) {
|
||||
+ BlockDriverState *bs = bs_entry->state.bs;
|
||||
+
|
||||
+ if (bs->drv->bdrv_reopen_commit_post)
|
||||
+ bs->drv->bdrv_reopen_commit_post(&bs_entry->state);
|
||||
+ }
|
||||
+ }
|
||||
cleanup:
|
||||
QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
|
||||
if (ret) {
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index dd033d0..c168690 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -123,6 +123,7 @@ struct BlockDriver {
|
||||
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
||||
BlockReopenQueue *queue, Error **errp);
|
||||
void (*bdrv_reopen_commit)(BDRVReopenState *reopen_state);
|
||||
+ void (*bdrv_reopen_commit_post)(BDRVReopenState *reopen_state);
|
||||
void (*bdrv_reopen_abort)(BDRVReopenState *reopen_state);
|
||||
void (*bdrv_join_options)(QDict *options, QDict *old_options);
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
67
kvm-block-Make-bdrv_get_cumulative_perm-public.patch
Normal file
67
kvm-block-Make-bdrv_get_cumulative_perm-public.patch
Normal file
@ -0,0 +1,67 @@
|
||||
From 294ab4c4963295556d12ac15150b48c8536175a7 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:33 +0000
|
||||
Subject: [PATCH 13/20] block: Make bdrv_get_cumulative_perm() public
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-8-kwolf@redhat.com>
|
||||
Patchwork-id: 94287
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 07/13] block: Make bdrv_get_cumulative_perm() public
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-2-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c7a0f2be8f95b220cdadbba9a9236eaf115951dc)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 6 ++----
|
||||
include/block/block_int.h | 3 +++
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index 39e4647..354d388 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -1850,8 +1850,6 @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
|
||||
bool *tighten_restrictions, Error **errp);
|
||||
static void bdrv_child_abort_perm_update(BdrvChild *c);
|
||||
static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
|
||||
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
- uint64_t *shared_perm);
|
||||
|
||||
typedef struct BlockReopenQueueEntry {
|
||||
bool prepared;
|
||||
@@ -2075,8 +2073,8 @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
|
||||
}
|
||||
}
|
||||
|
||||
-static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
- uint64_t *shared_perm)
|
||||
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
+ uint64_t *shared_perm)
|
||||
{
|
||||
BdrvChild *c;
|
||||
uint64_t cumulative_perms = 0;
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index c168690..96e327b 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -1228,6 +1228,9 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
||||
void *opaque, Error **errp);
|
||||
void bdrv_root_unref_child(BdrvChild *child);
|
||||
|
||||
+void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
|
||||
+ uint64_t *shared_perm);
|
||||
+
|
||||
/**
|
||||
* Sets a BdrvChild's permissions. Avoid if the parent is a BDS; use
|
||||
* bdrv_child_refresh_perms() instead and make the parent's
|
||||
--
|
||||
1.8.3.1
|
||||
|
117
kvm-block-Relax-restrictions-for-blockdev-snapshot.patch
Normal file
117
kvm-block-Relax-restrictions-for-blockdev-snapshot.patch
Normal file
@ -0,0 +1,117 @@
|
||||
From 9ba321e18a357c1a3a238ceee301bbb174f96eee Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:34 +0000
|
||||
Subject: [PATCH 14/20] block: Relax restrictions for blockdev-snapshot
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-9-kwolf@redhat.com>
|
||||
Patchwork-id: 94285
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 08/13] block: Relax restrictions for blockdev-snapshot
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
blockdev-snapshot returned an error if the overlay was already in use,
|
||||
which it defined as having any BlockBackend parent. This is in fact both
|
||||
too strict (some parents can tolerate the change of visible data caused
|
||||
by attaching a backing file) and too loose (some non-BlockBackend
|
||||
parents may not be happy with it).
|
||||
|
||||
One important use case that is prevented by the too strict check is live
|
||||
storage migration with blockdev-mirror. Here, the target node is
|
||||
usually opened without a backing file so that the active layer is
|
||||
mirrored while its backing chain can be copied in the background.
|
||||
|
||||
The backing chain should be attached to the mirror target node when
|
||||
finalising the job, just before switching the users of the source node
|
||||
to the new copy (at which point the mirror job still has a reference to
|
||||
the node). drive-mirror did this automatically, but with blockdev-mirror
|
||||
this is the job of the QMP client, so it needs a way to do this.
|
||||
|
||||
blockdev-snapshot is the obvious way, so this patch makes it work in
|
||||
this scenario. The new condition is that no parent uses CONSISTENT_READ
|
||||
permissions. This will ensure that the operation will still be blocked
|
||||
when the node is attached to the guest device, so blockdev-snapshot
|
||||
remains safe.
|
||||
|
||||
(For the sake of completeness, x-blockdev-reopen can be used to achieve
|
||||
the same, however it is a big hammer, performs the graph change
|
||||
completely unchecked and is still experimental. So even with the option
|
||||
of using x-blockdev-reopen, there are reasons why blockdev-snapshot
|
||||
should be able to perform this operation.)
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-3-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit d29d3d1f80b3947fb26e7139645c83de66d146a9)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
blockdev.c | 14 ++++++++------
|
||||
tests/qemu-iotests/085.out | 4 ++--
|
||||
2 files changed, 10 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 4cd9a58..7918533 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -1536,6 +1536,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
TransactionAction *action = common->action;
|
||||
AioContext *aio_context;
|
||||
AioContext *old_context;
|
||||
+ uint64_t perm, shared;
|
||||
int ret;
|
||||
|
||||
/* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
|
||||
@@ -1656,16 +1657,17 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (bdrv_has_blk(state->new_bs)) {
|
||||
+ /*
|
||||
+ * Allow attaching a backing file to an overlay that's already in use only
|
||||
+ * if the parents don't assume that they are already seeing a valid image.
|
||||
+ * (Specifically, allow it as a mirror target, which is write-only access.)
|
||||
+ */
|
||||
+ bdrv_get_cumulative_perm(state->new_bs, &perm, &shared);
|
||||
+ if (perm & BLK_PERM_CONSISTENT_READ) {
|
||||
error_setg(errp, "The overlay is already in use");
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (bdrv_op_is_blocked(state->new_bs, BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
|
||||
- errp)) {
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
if (state->new_bs->backing != NULL) {
|
||||
error_setg(errp, "The overlay already has a backing image");
|
||||
goto out;
|
||||
diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
|
||||
index bb50227..487d920 100644
|
||||
--- a/tests/qemu-iotests/085.out
|
||||
+++ b/tests/qemu-iotests/085.out
|
||||
@@ -82,7 +82,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||
=== Invalid command - cannot create a snapshot using a file BDS ===
|
||||
|
||||
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
|
||||
-{"error": {"class": "GenericError", "desc": "The overlay does not support backing images"}}
|
||||
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
|
||||
|
||||
=== Invalid command - snapshot node used as active layer ===
|
||||
|
||||
@@ -96,7 +96,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
|
||||
=== Invalid command - snapshot node used as backing hd ===
|
||||
|
||||
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
|
||||
-{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'snap_12'"}}
|
||||
+{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
|
||||
|
||||
=== Invalid command - snapshot node has a backing image ===
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,57 @@
|
||||
From 371d312300251c0dc24522607b06b7e47e760b53 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:32 +0000
|
||||
Subject: [PATCH 12/20] block: Versioned x-blockdev-reopen API with feature
|
||||
flag
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-7-kwolf@redhat.com>
|
||||
Patchwork-id: 94283
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 06/13] block: Versioned x-blockdev-reopen API with feature flag
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
x-blockdev-reopen is still considered unstable upstream. libvirt needs
|
||||
(a small subset of) it for incremental backups, though.
|
||||
|
||||
Add a downstream-only feature flag that effectively makes this a
|
||||
versioned interface. As long as the feature is present, we promise that
|
||||
we won't change the interface incompatibly. Incompatible changes to the
|
||||
command will require us to drop the feature flag (and possibly introduce
|
||||
a new one if the new version is still not stable upstream).
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
qapi/block-core.json | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 0cf68fe..a1e85b0 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4202,10 +4202,17 @@
|
||||
# image does not have a default backing file name as part of its
|
||||
# metadata.
|
||||
#
|
||||
+# Features:
|
||||
+# @__com.redhat_rhel-av-8_2_0-api: Versioning the downstream interface while
|
||||
+# it's still unstable upstream. As long as
|
||||
+# this flag is present, this command will not
|
||||
+# change incompatibly.
|
||||
+#
|
||||
# Since: 4.0
|
||||
##
|
||||
{ 'command': 'x-blockdev-reopen',
|
||||
- 'data': 'BlockdevOptions', 'boxed': true }
|
||||
+ 'data': 'BlockdevOptions', 'boxed': true,
|
||||
+ 'features': [ '__com.redhat_rhel-av-8_2_0-api' ] }
|
||||
|
||||
##
|
||||
# @blockdev-del:
|
||||
--
|
||||
1.8.3.1
|
||||
|
114
kvm-block-bdrv_reopen-with-backing-file-in-different-Aio.patch
Normal file
114
kvm-block-bdrv_reopen-with-backing-file-in-different-Aio.patch
Normal file
@ -0,0 +1,114 @@
|
||||
From 1e0582ad34e77a060e2067a35992979c9eae82c9 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:31 +0000
|
||||
Subject: [PATCH 11/20] block: bdrv_reopen() with backing file in different
|
||||
AioContext
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-6-kwolf@redhat.com>
|
||||
Patchwork-id: 94282
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 05/13] block: bdrv_reopen() with backing file in different AioContext
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
This patch allows bdrv_reopen() (and therefore the x-blockdev-reopen QMP
|
||||
command) to attach a node as the new backing file even if the node is in
|
||||
a different AioContext than the parent if one of both nodes can be moved
|
||||
to the AioContext of the other node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <20200306141413.30705-3-kwolf@redhat.com>
|
||||
Reviewed-by: Alberto Garcia <berto@igalia.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 1de6b45fb5c1489b450df7d1a4c692bba9678ce6)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block.c | 32 ++++++++++++++++++++++++++------
|
||||
tests/qemu-iotests/245 | 8 +++-----
|
||||
2 files changed, 29 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block.c b/block.c
|
||||
index a744bb5..39e4647 100644
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -3749,6 +3749,29 @@ static void bdrv_reopen_perm(BlockReopenQueue *q, BlockDriverState *bs,
|
||||
*shared = cumulative_shared_perms;
|
||||
}
|
||||
|
||||
+static bool bdrv_reopen_can_attach(BlockDriverState *parent,
|
||||
+ BdrvChild *child,
|
||||
+ BlockDriverState *new_child,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ AioContext *parent_ctx = bdrv_get_aio_context(parent);
|
||||
+ AioContext *child_ctx = bdrv_get_aio_context(new_child);
|
||||
+ GSList *ignore;
|
||||
+ bool ret;
|
||||
+
|
||||
+ ignore = g_slist_prepend(NULL, child);
|
||||
+ ret = bdrv_can_set_aio_context(new_child, parent_ctx, &ignore, NULL);
|
||||
+ g_slist_free(ignore);
|
||||
+ if (ret) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ignore = g_slist_prepend(NULL, child);
|
||||
+ ret = bdrv_can_set_aio_context(parent, child_ctx, &ignore, errp);
|
||||
+ g_slist_free(ignore);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Take a BDRVReopenState and check if the value of 'backing' in the
|
||||
* reopen_state->options QDict is valid or not.
|
||||
@@ -3800,14 +3823,11 @@ static int bdrv_reopen_parse_backing(BDRVReopenState *reopen_state,
|
||||
}
|
||||
|
||||
/*
|
||||
- * TODO: before removing the x- prefix from x-blockdev-reopen we
|
||||
- * should move the new backing file into the right AioContext
|
||||
- * instead of returning an error.
|
||||
+ * Check AioContext compatibility so that the bdrv_set_backing_hd() call in
|
||||
+ * bdrv_reopen_commit() won't fail.
|
||||
*/
|
||||
if (new_backing_bs) {
|
||||
- if (bdrv_get_aio_context(new_backing_bs) != bdrv_get_aio_context(bs)) {
|
||||
- error_setg(errp, "Cannot use a new backing file "
|
||||
- "with a different AioContext");
|
||||
+ if (!bdrv_reopen_can_attach(bs, bs->backing, new_backing_bs, errp)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
|
||||
index f69c2fa..919131d 100644
|
||||
--- a/tests/qemu-iotests/245
|
||||
+++ b/tests/qemu-iotests/245
|
||||
@@ -1013,18 +1013,16 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
# neither of them can switch to the other AioContext
|
||||
def test_iothreads_error(self):
|
||||
self.run_test_iothreads('iothread0', 'iothread1',
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ "Cannot change iothread of active block backend")
|
||||
|
||||
def test_iothreads_compatible_users(self):
|
||||
self.run_test_iothreads('iothread0', 'iothread0')
|
||||
|
||||
def test_iothreads_switch_backing(self):
|
||||
- self.run_test_iothreads('iothread0', None,
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ self.run_test_iothreads('iothread0', None)
|
||||
|
||||
def test_iothreads_switch_overlay(self):
|
||||
- self.run_test_iothreads(None, 'iothread0',
|
||||
- "Cannot use a new backing file with a different AioContext")
|
||||
+ self.run_test_iothreads(None, 'iothread0')
|
||||
|
||||
if __name__ == '__main__':
|
||||
iotests.main(supported_fmts=["qcow2"],
|
||||
--
|
||||
1.8.3.1
|
||||
|
78
kvm-block-nbd-Fix-hang-in-.bdrv_close.patch
Normal file
78
kvm-block-nbd-Fix-hang-in-.bdrv_close.patch
Normal file
@ -0,0 +1,78 @@
|
||||
From 4ef2c464a54b0b618d933641ac0a7012e629fed9 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:42 +0000
|
||||
Subject: [PATCH 01/20] block/nbd: Fix hang in .bdrv_close()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-2-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94224
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 1/6] block/nbd: Fix hang in .bdrv_close()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
When nbd_close() is called from a coroutine, the connection_co never
|
||||
gets to run, and thus nbd_teardown_connection() hangs.
|
||||
|
||||
This is because aio_co_enter() only puts the connection_co into the main
|
||||
coroutine's wake-up queue, so this main coroutine needs to yield and
|
||||
wait for connection_co to terminate.
|
||||
|
||||
Suggested-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-2-mreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 78c81a3f108870d325b0a39d88711366afe6f703)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/nbd.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index 5f18f78..a73f0d9 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -70,6 +70,7 @@ typedef struct BDRVNBDState {
|
||||
CoMutex send_mutex;
|
||||
CoQueue free_sema;
|
||||
Coroutine *connection_co;
|
||||
+ Coroutine *teardown_co;
|
||||
QemuCoSleepState *connection_co_sleep_ns_state;
|
||||
bool drained;
|
||||
bool wait_drained_end;
|
||||
@@ -203,7 +204,15 @@ static void nbd_teardown_connection(BlockDriverState *bs)
|
||||
qemu_co_sleep_wake(s->connection_co_sleep_ns_state);
|
||||
}
|
||||
}
|
||||
- BDRV_POLL_WHILE(bs, s->connection_co);
|
||||
+ if (qemu_in_coroutine()) {
|
||||
+ s->teardown_co = qemu_coroutine_self();
|
||||
+ /* connection_co resumes us when it terminates */
|
||||
+ qemu_coroutine_yield();
|
||||
+ s->teardown_co = NULL;
|
||||
+ } else {
|
||||
+ BDRV_POLL_WHILE(bs, s->connection_co);
|
||||
+ }
|
||||
+ assert(!s->connection_co);
|
||||
}
|
||||
|
||||
static bool nbd_client_connecting(BDRVNBDState *s)
|
||||
@@ -395,6 +404,9 @@ static coroutine_fn void nbd_connection_entry(void *opaque)
|
||||
s->ioc = NULL;
|
||||
}
|
||||
|
||||
+ if (s->teardown_co) {
|
||||
+ aio_co_wake(s->teardown_co);
|
||||
+ }
|
||||
aio_wait_kick();
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,78 @@
|
||||
From ec5408763c49cd0b63ee324bdc38a429ed1adeee Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:29 +0000
|
||||
Subject: [PATCH 09/20] block/qcow2: Move bitmap reopen into
|
||||
bdrv_reopen_commit_post
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-4-kwolf@redhat.com>
|
||||
Patchwork-id: 94280
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 03/13] block/qcow2: Move bitmap reopen into bdrv_reopen_commit_post
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The bitmap code requires writing the 'file' child when the qcow2 driver
|
||||
is reopened in read-write mode.
|
||||
|
||||
If the 'file' child is being reopened due to a permissions change, the
|
||||
modification is commited yet when qcow2_reopen_commit is called. This
|
||||
means that any attempt to write the 'file' child will end with EBADFD
|
||||
as the original fd was already closed.
|
||||
|
||||
Moving bitmap reopening to the new callback which is called after
|
||||
permission modifications are commited fixes this as the file descriptor
|
||||
will be replaced with the correct one.
|
||||
|
||||
The above problem manifests itself when reopening 'qcow2' format layer
|
||||
which uses a 'file-posix' file child which was opened with the
|
||||
'auto-read-only' property set.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <db118dbafe1955afbc0a18d3dd220931074ce349.1582893284.git.pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 65eb7c85a3e62529e2bad782e94d5a7b11dd5a92)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/qcow2.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index 7c18721..83b1fc0 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -1881,6 +1881,11 @@ fail:
|
||||
static void qcow2_reopen_commit(BDRVReopenState *state)
|
||||
{
|
||||
qcow2_update_options_commit(state->bs, state->opaque);
|
||||
+ g_free(state->opaque);
|
||||
+}
|
||||
+
|
||||
+static void qcow2_reopen_commit_post(BDRVReopenState *state)
|
||||
+{
|
||||
if (state->flags & BDRV_O_RDWR) {
|
||||
Error *local_err = NULL;
|
||||
|
||||
@@ -1895,7 +1900,6 @@ static void qcow2_reopen_commit(BDRVReopenState *state)
|
||||
bdrv_get_node_name(state->bs));
|
||||
}
|
||||
}
|
||||
- g_free(state->opaque);
|
||||
}
|
||||
|
||||
static void qcow2_reopen_abort(BDRVReopenState *state)
|
||||
@@ -5492,6 +5496,7 @@ BlockDriver bdrv_qcow2 = {
|
||||
.bdrv_close = qcow2_close,
|
||||
.bdrv_reopen_prepare = qcow2_reopen_prepare,
|
||||
.bdrv_reopen_commit = qcow2_reopen_commit,
|
||||
+ .bdrv_reopen_commit_post = qcow2_reopen_commit_post,
|
||||
.bdrv_reopen_abort = qcow2_reopen_abort,
|
||||
.bdrv_join_options = qcow2_join_options,
|
||||
.bdrv_child_perm = bdrv_format_default_perms,
|
||||
--
|
||||
1.8.3.1
|
||||
|
85
kvm-exec-rom_reset-Free-rom-data-during-inmigrate-skip.patch
Normal file
85
kvm-exec-rom_reset-Free-rom-data-during-inmigrate-skip.patch
Normal file
@ -0,0 +1,85 @@
|
||||
From 5770fe43fe1e15e6f53cfd3705605e8645b95a98 Mon Sep 17 00:00:00 2001
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 17:17:08 +0000
|
||||
Subject: [PATCH 20/20] exec/rom_reset: Free rom data during inmigrate skip
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Message-id: <20200313171708.242774-1-dgilbert@redhat.com>
|
||||
Patchwork-id: 94292
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] exec/rom_reset: Free rom data during inmigrate skip
|
||||
Bugzilla: 1809380
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||||
|
||||
bz: https://bugzilla.redhat.com/show_bug.cgi?id=1809380
|
||||
brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=27249921
|
||||
branch: rhel-av-8.2.0
|
||||
upstream: Posted and with review-by, not merged yet
|
||||
|
||||
Commit 355477f8c73e9 skips rom reset when we're an incoming migration
|
||||
so as not to overwrite shared ram in the ignore-shared migration
|
||||
optimisation.
|
||||
However, it's got an unexpected side effect that because it skips
|
||||
freeing the ROM data, when rom_reset gets called later on, after
|
||||
migration (e.g. during a reboot), the ROM does get reset to the original
|
||||
file contents. Because of seabios/x86's weird reboot process
|
||||
this confuses a reboot into hanging after a migration.
|
||||
|
||||
Fixes: 355477f8c73e9 ("migration: do not rom_reset() during incoming migration")
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1809380
|
||||
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/core/loader.c | 25 ++++++++++++++++---------
|
||||
1 file changed, 16 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/core/loader.c b/hw/core/loader.c
|
||||
index 5099f27..375b29b 100644
|
||||
--- a/hw/core/loader.c
|
||||
+++ b/hw/core/loader.c
|
||||
@@ -1118,19 +1118,26 @@ static void rom_reset(void *unused)
|
||||
{
|
||||
Rom *rom;
|
||||
|
||||
- /*
|
||||
- * We don't need to fill in the RAM with ROM data because we'll fill
|
||||
- * the data in during the next incoming migration in all cases. Note
|
||||
- * that some of those RAMs can actually be modified by the guest on ARM
|
||||
- * so this is probably the only right thing to do here.
|
||||
- */
|
||||
- if (runstate_check(RUN_STATE_INMIGRATE))
|
||||
- return;
|
||||
-
|
||||
QTAILQ_FOREACH(rom, &roms, next) {
|
||||
if (rom->fw_file) {
|
||||
continue;
|
||||
}
|
||||
+ /*
|
||||
+ * We don't need to fill in the RAM with ROM data because we'll fill
|
||||
+ * the data in during the next incoming migration in all cases. Note
|
||||
+ * that some of those RAMs can actually be modified by the guest.
|
||||
+ */
|
||||
+ if (runstate_check(RUN_STATE_INMIGRATE)) {
|
||||
+ if (rom->data && rom->isrom) {
|
||||
+ /*
|
||||
+ * Free it so that a rom_reset after migration doesn't
|
||||
+ * overwrite a potentially modified 'rom'.
|
||||
+ */
|
||||
+ rom_free_data(rom);
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if (rom->data == NULL) {
|
||||
continue;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
131
kvm-file-posix-Drop-hdev_co_create_opts.patch
Normal file
131
kvm-file-posix-Drop-hdev_co_create_opts.patch
Normal file
@ -0,0 +1,131 @@
|
||||
From 3d3509c010129bd15eb1f5ec1a7b9eedcdbf23f6 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:44 +0000
|
||||
Subject: [PATCH 03/20] file-posix: Drop hdev_co_create_opts()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-4-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94225
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 3/6] file-posix: Drop hdev_co_create_opts()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
The generic fallback implementation effectively does the same.
|
||||
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-4-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 87ca3b8fa615b278b33cabf9ed22b3f44b5214ba)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 67 ------------------------------------------------------
|
||||
1 file changed, 67 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 1b805bd..fd29372 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3418,67 +3418,6 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
return raw_do_pwrite_zeroes(bs, offset, bytes, flags, true);
|
||||
}
|
||||
|
||||
-static int coroutine_fn hdev_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
- Error **errp)
|
||||
-{
|
||||
- int fd;
|
||||
- int ret = 0;
|
||||
- struct stat stat_buf;
|
||||
- int64_t total_size = 0;
|
||||
- bool has_prefix;
|
||||
-
|
||||
- /* This function is used by both protocol block drivers and therefore either
|
||||
- * of these prefixes may be given.
|
||||
- * The return value has to be stored somewhere, otherwise this is an error
|
||||
- * due to -Werror=unused-value. */
|
||||
- has_prefix =
|
||||
- strstart(filename, "host_device:", &filename) ||
|
||||
- strstart(filename, "host_cdrom:" , &filename);
|
||||
-
|
||||
- (void)has_prefix;
|
||||
-
|
||||
- ret = raw_normalize_devicepath(&filename, errp);
|
||||
- if (ret < 0) {
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- /* Read out options */
|
||||
- total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
|
||||
- BDRV_SECTOR_SIZE);
|
||||
-
|
||||
- fd = qemu_open(filename, O_WRONLY | O_BINARY);
|
||||
- if (fd < 0) {
|
||||
- ret = -errno;
|
||||
- error_setg_errno(errp, -ret, "Could not open device");
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- if (fstat(fd, &stat_buf) < 0) {
|
||||
- ret = -errno;
|
||||
- error_setg_errno(errp, -ret, "Could not stat device");
|
||||
- } else if (!S_ISBLK(stat_buf.st_mode) && !S_ISCHR(stat_buf.st_mode)) {
|
||||
- error_setg(errp,
|
||||
- "The given file is neither a block nor a character device");
|
||||
- ret = -ENODEV;
|
||||
- } else if (lseek(fd, 0, SEEK_END) < total_size) {
|
||||
- error_setg(errp, "Device is too small");
|
||||
- ret = -ENOSPC;
|
||||
- }
|
||||
-
|
||||
- if (!ret && total_size) {
|
||||
- uint8_t buf[BDRV_SECTOR_SIZE] = { 0 };
|
||||
- int64_t zero_size = MIN(BDRV_SECTOR_SIZE, total_size);
|
||||
- if (lseek(fd, 0, SEEK_SET) == -1) {
|
||||
- ret = -errno;
|
||||
- } else {
|
||||
- ret = qemu_write_full(fd, buf, zero_size);
|
||||
- ret = ret == zero_size ? 0 : -errno;
|
||||
- }
|
||||
- }
|
||||
- qemu_close(fd);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static BlockDriver bdrv_host_device = {
|
||||
.format_name = "host_device",
|
||||
.protocol_name = "host_device",
|
||||
@@ -3491,8 +3430,6 @@ static BlockDriver bdrv_host_device = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
||||
@@ -3619,8 +3556,6 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||
|
||||
@@ -3753,8 +3688,6 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||
.bdrv_reopen_commit = raw_reopen_commit,
|
||||
.bdrv_reopen_abort = raw_reopen_abort,
|
||||
- .bdrv_co_create_opts = hdev_co_create_opts,
|
||||
- .create_opts = &raw_create_opts,
|
||||
.mutable_opts = mutable_opts,
|
||||
|
||||
.bdrv_co_preadv = raw_co_preadv,
|
||||
--
|
||||
1.8.3.1
|
||||
|
147
kvm-iotests-Add-iothread-cases-to-155.patch
Normal file
147
kvm-iotests-Add-iothread-cases-to-155.patch
Normal file
@ -0,0 +1,147 @@
|
||||
From 2366cd9066e79d6c93a3a28710aea987b2c8f454 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:38 +0000
|
||||
Subject: [PATCH 18/20] iotests: Add iothread cases to 155
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-13-kwolf@redhat.com>
|
||||
Patchwork-id: 94289
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 12/13] iotests: Add iothread cases to 155
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
This patch adds test cases for attaching the backing chain to a mirror
|
||||
job target right before finalising the job, where the image is in a
|
||||
non-mainloop AioContext (i.e. the backing chain needs to be moved to the
|
||||
AioContext of the mirror target).
|
||||
|
||||
This requires switching the test case from virtio-blk to virtio-scsi
|
||||
because virtio-blk only actually starts using the iothreads when the
|
||||
guest driver initialises the device (which never happens in a test case
|
||||
without a guest OS). virtio-scsi always keeps its block nodes in the
|
||||
AioContext of the the requested iothread without guest interaction.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-7-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 6a5f6403a11307794ec79d277a065c137cfc12b2)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 32 +++++++++++++++++++++++---------
|
||||
tests/qemu-iotests/155.out | 4 ++--
|
||||
2 files changed, 25 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index 3053e50..b552d1f 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -49,11 +49,14 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
|
||||
# chain opened right away. If False, blockdev-add
|
||||
# opens it without a backing file and job completion
|
||||
# is supposed to open the backing chain.
|
||||
+# use_iothread: If True, an iothread is configured for the virtio-blk device
|
||||
+# that uses the image being mirrored
|
||||
|
||||
class BaseClass(iotests.QMPTestCase):
|
||||
target_blockdev_backing = None
|
||||
target_real_backing = None
|
||||
target_open_with_backing = True
|
||||
+ use_iothread = False
|
||||
|
||||
def setUp(self):
|
||||
qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
|
||||
@@ -69,7 +72,16 @@ class BaseClass(iotests.QMPTestCase):
|
||||
'file': {'driver': 'file',
|
||||
'filename': source_img}}
|
||||
self.vm.add_blockdev(self.vm.qmp_to_opts(blockdev))
|
||||
- self.vm.add_device('virtio-blk,id=qdev0,drive=source')
|
||||
+
|
||||
+ if self.use_iothread:
|
||||
+ self.vm.add_object('iothread,id=iothread0')
|
||||
+ iothread = ",iothread=iothread0"
|
||||
+ else:
|
||||
+ iothread = ""
|
||||
+
|
||||
+ self.vm.add_device('virtio-scsi%s' % iothread)
|
||||
+ self.vm.add_device('scsi-hd,id=qdev0,drive=source')
|
||||
+
|
||||
self.vm.launch()
|
||||
|
||||
self.assertIntactSourceBackingChain()
|
||||
@@ -182,24 +194,21 @@ class MirrorBaseClass(BaseClass):
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, None)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
def testTop(self):
|
||||
self.runMirror('top')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, back2_img)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
def testNone(self):
|
||||
self.runMirror('none')
|
||||
|
||||
- node = self.findBlockNode('target',
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode('target', 'qdev0')
|
||||
self.assertCorrectBackingImage(node, source_img)
|
||||
self.assertIntactSourceBackingChain()
|
||||
|
||||
@@ -252,6 +261,9 @@ class TestBlockdevMirrorReopen(MirrorBaseClass):
|
||||
backing="backing")
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
+class TestBlockdevMirrorReopenIothread(TestBlockdevMirrorReopen):
|
||||
+ use_iothread = True
|
||||
+
|
||||
# Attach the backing chain only during completion, with blockdev-snapshot
|
||||
class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
cmd = 'blockdev-mirror'
|
||||
@@ -268,6 +280,9 @@ class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
overlay="target")
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
+class TestBlockdevMirrorSnapshotIothread(TestBlockdevMirrorSnapshot):
|
||||
+ use_iothread = True
|
||||
+
|
||||
class TestCommit(BaseClass):
|
||||
existing = False
|
||||
|
||||
@@ -283,8 +298,7 @@ class TestCommit(BaseClass):
|
||||
|
||||
self.vm.event_wait('BLOCK_JOB_COMPLETED')
|
||||
|
||||
- node = self.findBlockNode(None,
|
||||
- '/machine/peripheral/qdev0/virtio-backend')
|
||||
+ node = self.findBlockNode(None, 'qdev0')
|
||||
self.assert_qmp(node, 'image' + '/backing-image' * 0 + '/filename',
|
||||
back1_img)
|
||||
self.assert_qmp(node, 'image' + '/backing-image' * 1 + '/filename',
|
||||
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
|
||||
index 4fd1c2d..ed714d5 100644
|
||||
--- a/tests/qemu-iotests/155.out
|
||||
+++ b/tests/qemu-iotests/155.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-.........................
|
||||
+...............................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 25 tests
|
||||
+Ran 31 tests
|
||||
|
||||
OK
|
||||
--
|
||||
1.8.3.1
|
||||
|
138
kvm-iotests-Add-test-for-image-creation-fallback.patch
Normal file
138
kvm-iotests-Add-test-for-image-creation-fallback.patch
Normal file
@ -0,0 +1,138 @@
|
||||
From 55f3a02574da226299d99bd74d12dd91b0f228dc Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:46 +0000
|
||||
Subject: [PATCH 05/20] iotests: Add test for image creation fallback
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-6-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94228
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 5/6] iotests: Add test for image creation fallback
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-6-mreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
[mreitz: Added a note that NBD does not support resizing, which is why
|
||||
the second case is expected to fail]
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 4dddeac115c5a2c5f74731fda0afd031a0b45490)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/259 | 62 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
tests/qemu-iotests/259.out | 14 +++++++++++
|
||||
tests/qemu-iotests/group | 1 +
|
||||
3 files changed, 77 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/259
|
||||
create mode 100644 tests/qemu-iotests/259.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/259 b/tests/qemu-iotests/259
|
||||
new file mode 100755
|
||||
index 0000000..62e29af
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/259
|
||||
@@ -0,0 +1,62 @@
|
||||
+#!/usr/bin/env bash
|
||||
+#
|
||||
+# Test generic image creation fallback (by using NBD)
|
||||
+#
|
||||
+# Copyright (C) 2019 Red Hat, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+# creator
|
||||
+owner=mreitz@redhat.com
|
||||
+
|
||||
+seq=$(basename $0)
|
||||
+echo "QA output created by $seq"
|
||||
+
|
||||
+status=1 # failure is the default!
|
||||
+
|
||||
+_cleanup()
|
||||
+{
|
||||
+ _cleanup_test_img
|
||||
+}
|
||||
+trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
+
|
||||
+# get standard environment, filters and checks
|
||||
+. ./common.rc
|
||||
+. ./common.filter
|
||||
+
|
||||
+_supported_fmt raw
|
||||
+_supported_proto nbd
|
||||
+_supported_os Linux
|
||||
+
|
||||
+
|
||||
+_make_test_img 64M
|
||||
+
|
||||
+echo
|
||||
+echo '--- Testing creation ---'
|
||||
+
|
||||
+$QEMU_IMG create -f qcow2 "$TEST_IMG" 64M | _filter_img_create
|
||||
+$QEMU_IMG info "$TEST_IMG" | _filter_img_info
|
||||
+
|
||||
+echo
|
||||
+echo '--- Testing creation for which the node would need to grow ---'
|
||||
+
|
||||
+# NBD does not support resizing, so this will fail
|
||||
+$QEMU_IMG create -f qcow2 -o preallocation=metadata "$TEST_IMG" 64M 2>&1 \
|
||||
+ | _filter_img_create
|
||||
+
|
||||
+# success, all done
|
||||
+echo "*** done"
|
||||
+rm -f $seq.full
|
||||
+status=0
|
||||
diff --git a/tests/qemu-iotests/259.out b/tests/qemu-iotests/259.out
|
||||
new file mode 100644
|
||||
index 0000000..ffed19c
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/259.out
|
||||
@@ -0,0 +1,14 @@
|
||||
+QA output created by 259
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
+
|
||||
+--- Testing creation ---
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=qcow2 size=67108864
|
||||
+image: TEST_DIR/t.IMGFMT
|
||||
+file format: qcow2
|
||||
+virtual size: 64 MiB (67108864 bytes)
|
||||
+disk size: unavailable
|
||||
+
|
||||
+--- Testing creation for which the node would need to grow ---
|
||||
+qemu-img: TEST_DIR/t.IMGFMT: Could not resize image: Image format driver does not support resize
|
||||
+Formatting 'TEST_DIR/t.IMGFMT', fmt=qcow2 size=67108864 preallocation=metadata
|
||||
+*** done
|
||||
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
|
||||
index c0e8197..e47cbfc 100644
|
||||
--- a/tests/qemu-iotests/group
|
||||
+++ b/tests/qemu-iotests/group
|
||||
@@ -273,6 +273,7 @@
|
||||
256 rw quick
|
||||
257 rw
|
||||
258 rw quick
|
||||
+259 rw auto quick
|
||||
260 rw quick
|
||||
261 rw
|
||||
262 rw quick migration
|
||||
--
|
||||
1.8.3.1
|
||||
|
47
kvm-iotests-Fix-run_job-with-use_log-False.patch
Normal file
47
kvm-iotests-Fix-run_job-with-use_log-False.patch
Normal file
@ -0,0 +1,47 @@
|
||||
From bb7b968a02c97564596b73d8d080cd745d96ed6b Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:35 +0000
|
||||
Subject: [PATCH 15/20] iotests: Fix run_job() with use_log=False
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-10-kwolf@redhat.com>
|
||||
Patchwork-id: 94284
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 09/13] iotests: Fix run_job() with use_log=False
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The 'job-complete' QMP command should be run with qmp() rather than
|
||||
qmp_log() if use_log=False is passed.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-4-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit b31b532122ec6f68d17168449c034d2197bf96ec)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/iotests.py | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
|
||||
index 0c55f7b..46f880c 100644
|
||||
--- a/tests/qemu-iotests/iotests.py
|
||||
+++ b/tests/qemu-iotests/iotests.py
|
||||
@@ -618,7 +618,10 @@ class VM(qtest.QEMUQtestMachine):
|
||||
if use_log:
|
||||
log('Job failed: %s' % (j['error']))
|
||||
elif status == 'ready':
|
||||
- self.qmp_log('job-complete', id=job)
|
||||
+ if use_log:
|
||||
+ self.qmp_log('job-complete', id=job)
|
||||
+ else:
|
||||
+ self.qmp('job-complete', id=job)
|
||||
elif status == 'pending' and not auto_finalize:
|
||||
if pre_finalize:
|
||||
pre_finalize()
|
||||
--
|
||||
1.8.3.1
|
||||
|
122
kvm-iotests-Refactor-blockdev-reopen-test-for-iothreads.patch
Normal file
122
kvm-iotests-Refactor-blockdev-reopen-test-for-iothreads.patch
Normal file
@ -0,0 +1,122 @@
|
||||
From 7e23b64dc20b64ca6fa887cd06cc5e52374f6268 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:30 +0000
|
||||
Subject: [PATCH 10/20] iotests: Refactor blockdev-reopen test for iothreads
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-5-kwolf@redhat.com>
|
||||
Patchwork-id: 94281
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 04/13] iotests: Refactor blockdev-reopen test for iothreads
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
We'll want to test more than one successful case in the future, so
|
||||
prepare the test for that by a refactoring that runs each scenario in a
|
||||
separate VM.
|
||||
|
||||
test_iothreads_switch_{backing,overlay} currently produce errors, but
|
||||
these are cases that should actually work, by switching either the
|
||||
backing file node or the overlay node to the AioContext of the other
|
||||
node.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Tested-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Message-Id: <20200306141413.30705-2-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 97518e11c3d902a32386d33797044f6b79bccc6f)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/245 | 47 ++++++++++++++++++++++++++++++++++++----------
|
||||
tests/qemu-iotests/245.out | 4 ++--
|
||||
2 files changed, 39 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245
|
||||
index e66a23c..f69c2fa 100644
|
||||
--- a/tests/qemu-iotests/245
|
||||
+++ b/tests/qemu-iotests/245
|
||||
@@ -968,8 +968,7 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
self.assertEqual(self.get_node('hd1'), None)
|
||||
self.assert_qmp(self.get_node('hd2'), 'ro', True)
|
||||
|
||||
- # We don't allow setting a backing file that uses a different AioContext
|
||||
- def test_iothreads(self):
|
||||
+ def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None):
|
||||
opts = hd_opts(0)
|
||||
result = self.vm.qmp('blockdev-add', conv_keys = False, **opts)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
@@ -984,20 +983,48 @@ class TestBlockdevReopen(iotests.QMPTestCase):
|
||||
result = self.vm.qmp('object-add', qom_type='iothread', id='iothread1')
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd0', iothread='iothread0')
|
||||
+ result = self.vm.qmp('device_add', driver='virtio-scsi', id='scsi0',
|
||||
+ iothread=iothread_a)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'}, "Cannot use a new backing file with a different AioContext")
|
||||
-
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd2', iothread='iothread1')
|
||||
+ result = self.vm.qmp('device_add', driver='virtio-scsi', id='scsi1',
|
||||
+ iothread=iothread_b)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'}, "Cannot use a new backing file with a different AioContext")
|
||||
+ if iothread_a:
|
||||
+ result = self.vm.qmp('device_add', driver='scsi-hd', drive='hd0',
|
||||
+ share_rw=True, bus="scsi0.0")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
- result = self.vm.qmp('x-blockdev-set-iothread', node_name='hd2', iothread='iothread0')
|
||||
- self.assert_qmp(result, 'return', {})
|
||||
+ if iothread_b:
|
||||
+ result = self.vm.qmp('device_add', driver='scsi-hd', drive='hd2',
|
||||
+ share_rw=True, bus="scsi1.0")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.reopen(opts, {'backing': 'hd2'})
|
||||
+ # Attaching the backing file may or may not work
|
||||
+ self.reopen(opts, {'backing': 'hd2'}, errmsg)
|
||||
+
|
||||
+ # But removing the backing file should always work
|
||||
+ self.reopen(opts, {'backing': None})
|
||||
+
|
||||
+ self.vm.shutdown()
|
||||
+
|
||||
+ # We don't allow setting a backing file that uses a different AioContext if
|
||||
+ # neither of them can switch to the other AioContext
|
||||
+ def test_iothreads_error(self):
|
||||
+ self.run_test_iothreads('iothread0', 'iothread1',
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
+
|
||||
+ def test_iothreads_compatible_users(self):
|
||||
+ self.run_test_iothreads('iothread0', 'iothread0')
|
||||
+
|
||||
+ def test_iothreads_switch_backing(self):
|
||||
+ self.run_test_iothreads('iothread0', None,
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
+
|
||||
+ def test_iothreads_switch_overlay(self):
|
||||
+ self.run_test_iothreads(None, 'iothread0',
|
||||
+ "Cannot use a new backing file with a different AioContext")
|
||||
|
||||
if __name__ == '__main__':
|
||||
iotests.main(supported_fmts=["qcow2"],
|
||||
diff --git a/tests/qemu-iotests/245.out b/tests/qemu-iotests/245.out
|
||||
index a19de52..682b933 100644
|
||||
--- a/tests/qemu-iotests/245.out
|
||||
+++ b/tests/qemu-iotests/245.out
|
||||
@@ -1,6 +1,6 @@
|
||||
-..................
|
||||
+.....................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 18 tests
|
||||
+Ran 21 tests
|
||||
|
||||
OK
|
||||
{"execute": "job-finalize", "arguments": {"id": "commit0"}}
|
||||
--
|
||||
1.8.3.1
|
||||
|
162
kvm-iotests-Test-mirror-with-temporarily-disabled-target.patch
Normal file
162
kvm-iotests-Test-mirror-with-temporarily-disabled-target.patch
Normal file
@ -0,0 +1,162 @@
|
||||
From 239f7bdeef48a3c0b07098617371b9955dc55348 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:36 +0000
|
||||
Subject: [PATCH 16/20] iotests: Test mirror with temporarily disabled target
|
||||
backing file
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-11-kwolf@redhat.com>
|
||||
Patchwork-id: 94288
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 10/13] iotests: Test mirror with temporarily disabled target backing file
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
The newly tested scenario is a common live storage migration scenario:
|
||||
The target node is opened without a backing file so that the active
|
||||
layer is mirrored while its backing chain can be copied in the
|
||||
background.
|
||||
|
||||
The backing chain should be attached to the mirror target node when
|
||||
finalising the job, just before switching the users of the source node
|
||||
to the new copy (at which point the mirror job still has a reference to
|
||||
the node). drive-mirror did this automatically, but with blockdev-mirror
|
||||
this is the job of the QMP client.
|
||||
|
||||
This patch adds test cases for two ways to achieve the desired result,
|
||||
using either x-blockdev-reopen or blockdev-snapshot.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-5-kwolf@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 8bdee9f10eac2aefdcc5095feef756354c87bdec)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 56 +++++++++++++++++++++++++++++++++++++++++-----
|
||||
tests/qemu-iotests/155.out | 4 ++--
|
||||
2 files changed, 53 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index d7ef257..3053e50 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -45,10 +45,15 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
|
||||
# image during runtime, only makes sense if
|
||||
# target_blockdev_backing is not None
|
||||
# (None: same as target_backing)
|
||||
+# target_open_with_backing: If True, the target image is added with its backing
|
||||
+# chain opened right away. If False, blockdev-add
|
||||
+# opens it without a backing file and job completion
|
||||
+# is supposed to open the backing chain.
|
||||
|
||||
class BaseClass(iotests.QMPTestCase):
|
||||
target_blockdev_backing = None
|
||||
target_real_backing = None
|
||||
+ target_open_with_backing = True
|
||||
|
||||
def setUp(self):
|
||||
qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
|
||||
@@ -80,9 +85,13 @@ class BaseClass(iotests.QMPTestCase):
|
||||
options = { 'node-name': 'target',
|
||||
'driver': iotests.imgfmt,
|
||||
'file': { 'driver': 'file',
|
||||
+ 'node-name': 'target-file',
|
||||
'filename': target_img } }
|
||||
- if self.target_blockdev_backing:
|
||||
- options['backing'] = self.target_blockdev_backing
|
||||
+
|
||||
+ if not self.target_open_with_backing:
|
||||
+ options['backing'] = None
|
||||
+ elif self.target_blockdev_backing:
|
||||
+ options['backing'] = self.target_blockdev_backing
|
||||
|
||||
result = self.vm.qmp('blockdev-add', **options)
|
||||
self.assert_qmp(result, 'return', {})
|
||||
@@ -147,10 +156,14 @@ class BaseClass(iotests.QMPTestCase):
|
||||
# cmd: Mirroring command to execute, either drive-mirror or blockdev-mirror
|
||||
|
||||
class MirrorBaseClass(BaseClass):
|
||||
+ def openBacking(self):
|
||||
+ pass
|
||||
+
|
||||
def runMirror(self, sync):
|
||||
if self.cmd == 'blockdev-mirror':
|
||||
result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
|
||||
- sync=sync, target='target')
|
||||
+ sync=sync, target='target',
|
||||
+ auto_finalize=False)
|
||||
else:
|
||||
if self.existing:
|
||||
mode = 'existing'
|
||||
@@ -159,11 +172,12 @@ class MirrorBaseClass(BaseClass):
|
||||
result = self.vm.qmp(self.cmd, job_id='mirror-job', device='source',
|
||||
sync=sync, target=target_img,
|
||||
format=iotests.imgfmt, mode=mode,
|
||||
- node_name='target')
|
||||
+ node_name='target', auto_finalize=False)
|
||||
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.complete_and_wait('mirror-job')
|
||||
+ self.vm.run_job('mirror-job', use_log=False, auto_finalize=False,
|
||||
+ pre_finalize=self.openBacking, auto_dismiss=True)
|
||||
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
@@ -221,6 +235,38 @@ class TestBlockdevMirrorForcedBacking(MirrorBaseClass):
|
||||
target_blockdev_backing = { 'driver': 'null-co' }
|
||||
target_real_backing = 'null-co://'
|
||||
|
||||
+# Attach the backing chain only during completion, with blockdev-reopen
|
||||
+class TestBlockdevMirrorReopen(MirrorBaseClass):
|
||||
+ cmd = 'blockdev-mirror'
|
||||
+ existing = True
|
||||
+ target_backing = 'null-co://'
|
||||
+ target_open_with_backing = False
|
||||
+
|
||||
+ def openBacking(self):
|
||||
+ if not self.target_open_with_backing:
|
||||
+ result = self.vm.qmp('blockdev-add', node_name="backing",
|
||||
+ driver="null-co")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+ result = self.vm.qmp('x-blockdev-reopen', node_name="target",
|
||||
+ driver=iotests.imgfmt, file="target-file",
|
||||
+ backing="backing")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+
|
||||
+# Attach the backing chain only during completion, with blockdev-snapshot
|
||||
+class TestBlockdevMirrorSnapshot(MirrorBaseClass):
|
||||
+ cmd = 'blockdev-mirror'
|
||||
+ existing = True
|
||||
+ target_backing = 'null-co://'
|
||||
+ target_open_with_backing = False
|
||||
+
|
||||
+ def openBacking(self):
|
||||
+ if not self.target_open_with_backing:
|
||||
+ result = self.vm.qmp('blockdev-add', node_name="backing",
|
||||
+ driver="null-co")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
+ result = self.vm.qmp('blockdev-snapshot', node="backing",
|
||||
+ overlay="target")
|
||||
+ self.assert_qmp(result, 'return', {})
|
||||
|
||||
class TestCommit(BaseClass):
|
||||
existing = False
|
||||
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
|
||||
index 4176bb9..4fd1c2d 100644
|
||||
--- a/tests/qemu-iotests/155.out
|
||||
+++ b/tests/qemu-iotests/155.out
|
||||
@@ -1,5 +1,5 @@
|
||||
-...................
|
||||
+.........................
|
||||
----------------------------------------------------------------------
|
||||
-Ran 19 tests
|
||||
+Ran 25 tests
|
||||
|
||||
OK
|
||||
--
|
||||
1.8.3.1
|
||||
|
50
kvm-iotests-Use-complete_and_wait-in-155.patch
Normal file
50
kvm-iotests-Use-complete_and_wait-in-155.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From 872fbd32d06bda4aba3a7e67a95f76f62e475dbe Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:27 +0000
|
||||
Subject: [PATCH 07/20] iotests: Use complete_and_wait() in 155
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-2-kwolf@redhat.com>
|
||||
Patchwork-id: 94279
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 01/13] iotests: Use complete_and_wait() in 155
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
This way, we get to see errors during the completion phase.
|
||||
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20200218103454.296704-14-mreitz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 6644d0e6192b36cdf2902c9774e1afb8ab2e7223)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/155 | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
|
||||
index e194859..d7ef257 100755
|
||||
--- a/tests/qemu-iotests/155
|
||||
+++ b/tests/qemu-iotests/155
|
||||
@@ -163,12 +163,7 @@ class MirrorBaseClass(BaseClass):
|
||||
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
- self.vm.event_wait('BLOCK_JOB_READY')
|
||||
-
|
||||
- result = self.vm.qmp('block-job-complete', device='mirror-job')
|
||||
- self.assert_qmp(result, 'return', {})
|
||||
-
|
||||
- self.vm.event_wait('BLOCK_JOB_COMPLETED')
|
||||
+ self.complete_and_wait('mirror-job')
|
||||
|
||||
def testFull(self):
|
||||
self.runMirror('full')
|
||||
--
|
||||
1.8.3.1
|
||||
|
113
kvm-iscsi-Drop-iscsi_co_create_opts.patch
Normal file
113
kvm-iscsi-Drop-iscsi_co_create_opts.patch
Normal file
@ -0,0 +1,113 @@
|
||||
From 58b7d33e1bc17b89103ceaa39f5722a69b35d810 Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Date: Wed, 11 Mar 2020 10:51:45 +0000
|
||||
Subject: [PATCH 04/20] iscsi: Drop iscsi_co_create_opts()
|
||||
|
||||
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Message-id: <20200311105147.13208-5-mlevitsk@redhat.com>
|
||||
Patchwork-id: 94226
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 4/6] iscsi: Drop iscsi_co_create_opts()
|
||||
Bugzilla: 1640894
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
From: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
The generic fallback implementation effectively does the same.
|
||||
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
Message-Id: <20200122164532.178040-5-mreitz@redhat.com>
|
||||
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||||
(cherry picked from commit 80f0900905b555f00d644894c786b6d66ac2e00e)
|
||||
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/iscsi.c | 56 --------------------------------------------------------
|
||||
1 file changed, 56 deletions(-)
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index cbd5729..b45da65 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -2164,58 +2164,6 @@ static int coroutine_fn iscsi_co_truncate(BlockDriverState *bs, int64_t offset,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int coroutine_fn iscsi_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
- Error **errp)
|
||||
-{
|
||||
- int ret = 0;
|
||||
- int64_t total_size = 0;
|
||||
- BlockDriverState *bs;
|
||||
- IscsiLun *iscsilun = NULL;
|
||||
- QDict *bs_options;
|
||||
- Error *local_err = NULL;
|
||||
-
|
||||
- bs = bdrv_new();
|
||||
-
|
||||
- /* Read out options */
|
||||
- total_size = DIV_ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
|
||||
- BDRV_SECTOR_SIZE);
|
||||
- bs->opaque = g_new0(struct IscsiLun, 1);
|
||||
- iscsilun = bs->opaque;
|
||||
-
|
||||
- bs_options = qdict_new();
|
||||
- iscsi_parse_filename(filename, bs_options, &local_err);
|
||||
- if (local_err) {
|
||||
- error_propagate(errp, local_err);
|
||||
- ret = -EINVAL;
|
||||
- } else {
|
||||
- ret = iscsi_open(bs, bs_options, 0, NULL);
|
||||
- }
|
||||
- qobject_unref(bs_options);
|
||||
-
|
||||
- if (ret != 0) {
|
||||
- goto out;
|
||||
- }
|
||||
- iscsi_detach_aio_context(bs);
|
||||
- if (iscsilun->type != TYPE_DISK) {
|
||||
- ret = -ENODEV;
|
||||
- goto out;
|
||||
- }
|
||||
- if (bs->total_sectors < total_size) {
|
||||
- ret = -ENOSPC;
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- ret = 0;
|
||||
-out:
|
||||
- if (iscsilun->iscsi != NULL) {
|
||||
- iscsi_destroy_context(iscsilun->iscsi);
|
||||
- }
|
||||
- g_free(bs->opaque);
|
||||
- bs->opaque = NULL;
|
||||
- bdrv_unref(bs);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||
{
|
||||
IscsiLun *iscsilun = bs->opaque;
|
||||
@@ -2486,8 +2434,6 @@ static BlockDriver bdrv_iscsi = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
- .bdrv_co_create_opts = iscsi_co_create_opts,
|
||||
- .create_opts = &iscsi_create_opts,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
@@ -2525,8 +2471,6 @@ static BlockDriver bdrv_iser = {
|
||||
.bdrv_parse_filename = iscsi_parse_filename,
|
||||
.bdrv_file_open = iscsi_open,
|
||||
.bdrv_close = iscsi_close,
|
||||
- .bdrv_co_create_opts = iscsi_co_create_opts,
|
||||
- .create_opts = &iscsi_create_opts,
|
||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,64 @@
|
||||
From 428eb7260718b69b1f3f421d03bce10b8785fc49 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 13 Mar 2020 12:34:39 +0000
|
||||
Subject: [PATCH 19/20] qapi: Add '@allow-write-only-overlay' feature for
|
||||
'blockdev-snapshot'
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20200313123439.10548-14-kwolf@redhat.com>
|
||||
Patchwork-id: 94290
|
||||
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 13/13] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot'
|
||||
Bugzilla: 1790482 1805143
|
||||
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
RH-Acked-by: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
|
||||
Anounce that 'blockdev-snapshot' command's permissions allow changing
|
||||
of the backing file if the 'consistent_read' permission is not required.
|
||||
|
||||
This is useful for libvirt to allow late opening of the backing chain
|
||||
during a blockdev-mirror.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200310113831.27293-8-kwolf@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit c6bdc312f30d5c7326aa2fdca3e0f98c15eb541a)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
qapi/block-core.json | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index a1e85b0..a64ad81 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -1541,6 +1541,12 @@
|
||||
#
|
||||
# For the arguments, see the documentation of BlockdevSnapshot.
|
||||
#
|
||||
+# Features:
|
||||
+# @allow-write-only-overlay: If present, the check whether this operation is safe
|
||||
+# was relaxed so that it can be used to change
|
||||
+# backing file of a destination of a blockdev-mirror.
|
||||
+# (since 5.0)
|
||||
+#
|
||||
# Since: 2.5
|
||||
#
|
||||
# Example:
|
||||
@@ -1561,7 +1567,8 @@
|
||||
#
|
||||
##
|
||||
{ 'command': 'blockdev-snapshot',
|
||||
- 'data': 'BlockdevSnapshot' }
|
||||
+ 'data': 'BlockdevSnapshot',
|
||||
+ 'features': [ 'allow-write-only-overlay' ] }
|
||||
|
||||
##
|
||||
# @change-backing-file:
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -67,7 +67,7 @@ Obsoletes: %1-rhev
|
||||
Summary: QEMU is a machine emulator and virtualizer
|
||||
Name: qemu-kvm
|
||||
Version: 4.2.0
|
||||
Release: 14%{?dist}
|
||||
Release: 15%{?dist}
|
||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||
Epoch: 15
|
||||
License: GPLv2 and GPLv2+ and CC-BY
|
||||
@ -564,6 +564,59 @@ Patch213: kvm-tools-virtiofsd-fuse_lowlevel-Fix-fuse_out_header-er.patch
|
||||
Patch214: kvm-virtiofsd-passthrough_ll-cleanup-getxattr-listxattr.patch
|
||||
# For bz#1797064 - virtiofsd: Fixes
|
||||
Patch215: kvm-virtiofsd-Fix-xattr-operations.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch216: kvm-block-nbd-Fix-hang-in-.bdrv_close.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch217: kvm-block-Generic-file-creation-fallback.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch218: kvm-file-posix-Drop-hdev_co_create_opts.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch219: kvm-iscsi-Drop-iscsi_co_create_opts.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch220: kvm-iotests-Add-test-for-image-creation-fallback.patch
|
||||
# For bz#1640894 - Fix generic file creation fallback for qemu-img nvme:// image creation support
|
||||
Patch221: kvm-block-Fix-leak-in-bdrv_create_file_fallback.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch222: kvm-iotests-Use-complete_and_wait-in-155.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch223: kvm-block-Introduce-bdrv_reopen_commit_post-step.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch224: kvm-block-qcow2-Move-bitmap-reopen-into-bdrv_reopen_comm.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch225: kvm-iotests-Refactor-blockdev-reopen-test-for-iothreads.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch226: kvm-block-bdrv_reopen-with-backing-file-in-different-Aio.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch227: kvm-block-Versioned-x-blockdev-reopen-API-with-feature-f.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch228: kvm-block-Make-bdrv_get_cumulative_perm-public.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch229: kvm-block-Relax-restrictions-for-blockdev-snapshot.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch230: kvm-iotests-Fix-run_job-with-use_log-False.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch231: kvm-iotests-Test-mirror-with-temporarily-disabled-target.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch232: kvm-block-Fix-cross-AioContext-blockdev-snapshot.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch233: kvm-iotests-Add-iothread-cases-to-155.patch
|
||||
# For bz#1790482 - bitmaps in backing images can't be modified
|
||||
# For bz#1805143 - allow late/lazy opening of backing chain for shallow blockdev-mirror
|
||||
Patch234: kvm-qapi-Add-allow-write-only-overlay-feature-for-blockd.patch
|
||||
# For bz#1809380 - guest hang during reboot process after migration from RHEl7.8 to RHEL8.2.0.
|
||||
Patch235: kvm-exec-rom_reset-Free-rom-data-during-inmigrate-skip.patch
|
||||
|
||||
BuildRequires: wget
|
||||
BuildRequires: rpm-build
|
||||
@ -1497,6 +1550,36 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
|
||||
|
||||
%changelog
|
||||
* Tue Mar 17 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.2.0-15.el8
|
||||
- kvm-block-nbd-Fix-hang-in-.bdrv_close.patch [bz#1640894]
|
||||
- kvm-block-Generic-file-creation-fallback.patch [bz#1640894]
|
||||
- kvm-file-posix-Drop-hdev_co_create_opts.patch [bz#1640894]
|
||||
- kvm-iscsi-Drop-iscsi_co_create_opts.patch [bz#1640894]
|
||||
- kvm-iotests-Add-test-for-image-creation-fallback.patch [bz#1640894]
|
||||
- kvm-block-Fix-leak-in-bdrv_create_file_fallback.patch [bz#1640894]
|
||||
- kvm-iotests-Use-complete_and_wait-in-155.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-Introduce-bdrv_reopen_commit_post-step.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-qcow2-Move-bitmap-reopen-into-bdrv_reopen_comm.patch [bz#1790482 bz#1805143]
|
||||
- kvm-iotests-Refactor-blockdev-reopen-test-for-iothreads.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-bdrv_reopen-with-backing-file-in-different-Aio.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-Versioned-x-blockdev-reopen-API-with-feature-f.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-Make-bdrv_get_cumulative_perm-public.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-Relax-restrictions-for-blockdev-snapshot.patch [bz#1790482 bz#1805143]
|
||||
- kvm-iotests-Fix-run_job-with-use_log-False.patch [bz#1790482 bz#1805143]
|
||||
- kvm-iotests-Test-mirror-with-temporarily-disabled-target.patch [bz#1790482 bz#1805143]
|
||||
- kvm-block-Fix-cross-AioContext-blockdev-snapshot.patch [bz#1790482 bz#1805143]
|
||||
- kvm-iotests-Add-iothread-cases-to-155.patch [bz#1790482 bz#1805143]
|
||||
- kvm-qapi-Add-allow-write-only-overlay-feature-for-blockd.patch [bz#1790482 bz#1805143]
|
||||
- kvm-exec-rom_reset-Free-rom-data-during-inmigrate-skip.patch [bz#1809380]
|
||||
- Resolves: bz#1640894
|
||||
(Fix generic file creation fallback for qemu-img nvme:// image creation support)
|
||||
- Resolves: bz#1790482
|
||||
(bitmaps in backing images can't be modified)
|
||||
- Resolves: bz#1805143
|
||||
(allow late/lazy opening of backing chain for shallow blockdev-mirror)
|
||||
- Resolves: bz#1809380
|
||||
(guest hang during reboot process after migration from RHEl7.8 to RHEL8.2.0.)
|
||||
|
||||
* Wed Mar 11 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.2.0-14.el8
|
||||
- kvm-hw-smbios-set-new-default-SMBIOS-fields-for-Windows-.patch [bz#1782529]
|
||||
- kvm-migration-multifd-clean-pages-after-filling-packet.patch [bz#1738451]
|
||||
|
Loading…
Reference in New Issue
Block a user