From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v3 qemu 4/7] update submodule and patches to QEMU 8.1.2
Date: Tue, 17 Oct 2023 14:10:09 +0200 [thread overview]
Message-ID: <20231017121012.132636-5-f.ebner@proxmox.com> (raw)
In-Reply-To: <20231017121012.132636-1-f.ebner@proxmox.com>
Bigger notable changes:
* Commit 1a30b0f5d7 ("block: .bdrv_open is non-coroutine and
unlocked") broke the PVE backup patches, in particular setting up
the backup dump block driver, because bdrv_new_open_driver() cannot
be called from a coroutine. To fix it, bdrv_co_open() is used
instead, and while it's a much more involved function, the result
should be essentially the same. The only difference I noticed is
that the BDRV_O_ALLOW_RDWR flag is also set in the resulting bds
(block driver state), but that shouldn't hurt.
Smaller notable changes:
* aio_set_fd_handler() dropped its 'is_external' parameter stating
that all callers now pass false in 60f782b6b7 ("aio: remove
aio_disable_external() API"). The calls in the PVE patches also
passed false, so just drop the parameter too.
* global_state_store() does not have a return value anymore, so the
user in the PVE savevm-async patch was adapted. For context, see
c33f1829f8 ("migration: never fail in global_state_store()").
* Renames affecting the PVE savevm-async patch:
migrate_use_block() -> migrate_block() and ram_counters -> mig_stats
9d4b1e5f22 ("migration: Move migrate_use_block() to options.c")
aff3f6606d ("migration: Rename ram_counters to mig_stats")
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
Changes in v3:
* Rebase on QEMU 8.1.2.
...d-support-for-sync-bitmap-mode-never.patch | 124 ++++++++---------
...-support-for-conditional-and-always-.patch | 10 +-
...check-for-bitmap-mode-without-bitmap.patch | 4 +-
...-to-bdrv_dirty_bitmap_merge_internal.patch | 6 +-
.../0006-mirror-move-some-checks-to-qmp.patch | 8 +-
...race-with-clients-disconnecting-earl.patch | 22 +--
...as-Internal-cdbs-have-16-byte-length.patch | 10 +-
...ial-deadlock-when-draining-during-tr.patch | 10 +-
...irty-bitmap-fix-loading-bitmap-when.patch} | 2 +-
...hen-getting-cursor-without-a-console.patch | 36 -----
...el-async-DMA-operation-before-reset.patch} | 4 +-
...-memory-prevent-dma-reentracy-issues.patch | 130 ------------------
...le-reentrancy-detection-for-script-R.patch | 39 ------
...-disable-reentrancy-detection-for-io.patch | 37 -----
...sable-reentrancy-detection-for-iomem.patch | 35 -----
...le-reentrancy-detection-for-apic-msi.patch | 36 -----
| 29 ----
...k-file-change-locking-default-to-off.patch | 6 +-
...he-CPU-model-to-kvm64-32-instead-of-.patch | 4 +-
...erfs-no-default-logfile-if-daemonize.patch | 4 +-
...PVE-Up-glusterfs-allow-partial-reads.patch | 2 +-
...return-success-on-info-without-snaps.patch | 4 +-
...dd-add-osize-and-read-from-to-stdin-.patch | 12 +-
...E-Up-qemu-img-dd-add-isize-parameter.patch | 14 +-
...PVE-Up-qemu-img-dd-add-n-skip_create.patch | 10 +-
...-add-l-option-for-loading-a-snapshot.patch | 14 +-
...virtio-balloon-improve-query-balloon.patch | 12 +-
.../0014-PVE-qapi-modify-query-machines.patch | 12 +-
.../0015-PVE-qapi-modify-spice-query.patch | 4 +-
...nnel-implementation-for-savevm-async.patch | 8 +-
...async-for-background-state-snapshots.patch | 58 ++++----
...add-optional-buffer-size-to-QEMUFile.patch | 44 +++---
...add-the-zeroinit-block-driver-filter.patch | 10 +-
...-Add-dummy-id-command-line-parameter.patch | 10 +-
...le-posix-make-locking-optiono-on-cre.patch | 18 +--
...3-PVE-monitor-disable-oob-capability.patch | 4 +-
...sed-balloon-qemu-4-0-config-size-fal.patch | 4 +-
...E-Allow-version-code-in-machine-type.patch | 22 +--
...VE-Backup-add-vma-backup-format-code.patch | 22 +--
...-Backup-add-backup-dump-block-driver.patch | 4 +-
...ckup-Proxmox-backup-patches-for-QEMU.patch | 127 ++++++++++++-----
...estore-new-command-to-restore-from-p.patch | 4 +-
...k-driver-to-map-backup-archives-into.patch | 54 ++++----
...ct-stderr-to-journal-when-daemonized.patch | 12 +-
...igrate-dirty-bitmap-state-via-savevm.patch | 23 ++--
...dirty-bitmap-migrate-other-bitmaps-e.patch | 4 +-
...all-back-to-open-iscsi-initiatorname.patch | 4 +-
...PVE-block-stream-increase-chunk-size.patch | 2 +-
...accept-NULL-qiov-in-bdrv_pad_request.patch | 14 +-
.../0039-block-add-alloc-track-driver.patch | 2 +-
...apshots-hold-the-BQL-during-setup-ca.patch | 24 ++--
...vm-async-don-t-hold-BQL-during-setup.patch | 4 +-
debian/patches/series | 11 +-
qemu | 2 +-
54 files changed, 411 insertions(+), 720 deletions(-)
rename debian/patches/extra/{0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch => 0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch} (98%)
delete mode 100644 debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch
rename debian/patches/extra/{0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch => 0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch} (97%)
delete mode 100644 debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch
delete mode 100644 debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch
delete mode 100644 debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch
delete mode 100644 debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch
delete mode 100644 debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch
delete mode 100644 debian/patches/extra/0011-vhost-fix-the-fd-leak.patch
diff --git a/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch b/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
index 4d9b8b9..c0cb23f 100644
--- a/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
+++ b/debian/patches/bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
@@ -27,18 +27,18 @@ Signed-off-by: Ma Haocong <mahaocong@didichuxing.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
-[FE: rebased for 8.0]
+[FE: rebased for 8.1.1]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
block/mirror.c | 98 +++++++++++++++++++++-----
blockdev.c | 38 +++++++++-
include/block/block_int-global-state.h | 4 +-
- qapi/block-core.json | 29 ++++++--
+ qapi/block-core.json | 25 ++++++-
tests/unit/test-block-iothread.c | 4 +-
- 5 files changed, 144 insertions(+), 29 deletions(-)
+ 5 files changed, 142 insertions(+), 27 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
-index 663e2b7002..9099c75992 100644
+index d3cacd1708..1ff42c8af1 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -51,7 +51,7 @@ typedef struct MirrorBlockJob {
@@ -59,7 +59,7 @@ index 663e2b7002..9099c75992 100644
BdrvDirtyBitmap *dirty_bitmap;
BdrvDirtyBitmapIter *dbi;
uint8_t *buf;
-@@ -703,7 +705,8 @@ static int mirror_exit_common(Job *job)
+@@ -705,7 +707,8 @@ static int mirror_exit_common(Job *job)
bdrv_child_refresh_perms(mirror_top_bs, mirror_top_bs->backing,
&error_abort);
if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
@@ -69,7 +69,7 @@ index 663e2b7002..9099c75992 100644
BlockDriverState *unfiltered_target = bdrv_skip_filters(target_bs);
if (bdrv_cow_bs(unfiltered_target) != backing) {
-@@ -801,6 +804,16 @@ static void mirror_abort(Job *job)
+@@ -809,6 +812,16 @@ static void mirror_abort(Job *job)
assert(ret == 0);
}
@@ -86,7 +86,7 @@ index 663e2b7002..9099c75992 100644
static void coroutine_fn mirror_throttle(MirrorBlockJob *s)
{
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
-@@ -987,7 +1000,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
+@@ -997,7 +1010,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
mirror_free_init(s);
s->last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
@@ -96,7 +96,7 @@ index 663e2b7002..9099c75992 100644
ret = mirror_dirty_init(s);
if (ret < 0 || job_is_cancelled(&s->common.job)) {
goto immediate_exit;
-@@ -1240,6 +1254,7 @@ static const BlockJobDriver mirror_job_driver = {
+@@ -1251,6 +1265,7 @@ static const BlockJobDriver mirror_job_driver = {
.run = mirror_run,
.prepare = mirror_prepare,
.abort = mirror_abort,
@@ -104,7 +104,7 @@ index 663e2b7002..9099c75992 100644
.pause = mirror_pause,
.complete = mirror_complete,
.cancel = mirror_cancel,
-@@ -1256,6 +1271,7 @@ static const BlockJobDriver commit_active_job_driver = {
+@@ -1267,6 +1282,7 @@ static const BlockJobDriver commit_active_job_driver = {
.run = mirror_run,
.prepare = mirror_prepare,
.abort = mirror_abort,
@@ -112,7 +112,7 @@ index 663e2b7002..9099c75992 100644
.pause = mirror_pause,
.complete = mirror_complete,
.cancel = commit_active_cancel,
-@@ -1647,7 +1663,10 @@ static BlockJob *mirror_start_job(
+@@ -1658,7 +1674,10 @@ static BlockJob *mirror_start_job(
BlockCompletionFunc *cb,
void *opaque,
const BlockJobDriver *driver,
@@ -124,7 +124,7 @@ index 663e2b7002..9099c75992 100644
bool auto_complete, const char *filter_node_name,
bool is_mirror, MirrorCopyMode copy_mode,
Error **errp)
-@@ -1659,10 +1678,39 @@ static BlockJob *mirror_start_job(
+@@ -1670,10 +1689,39 @@ static BlockJob *mirror_start_job(
uint64_t target_perms, target_shared_perms;
int ret;
@@ -166,7 +166,7 @@ index 663e2b7002..9099c75992 100644
assert(is_power_of_2(granularity));
if (buf_size < 0) {
-@@ -1793,7 +1841,9 @@ static BlockJob *mirror_start_job(
+@@ -1804,7 +1852,9 @@ static BlockJob *mirror_start_job(
s->replaces = g_strdup(replaces);
s->on_source_error = on_source_error;
s->on_target_error = on_target_error;
@@ -177,7 +177,7 @@ index 663e2b7002..9099c75992 100644
s->backing_mode = backing_mode;
s->zero_target = zero_target;
s->copy_mode = copy_mode;
-@@ -1814,6 +1864,18 @@ static BlockJob *mirror_start_job(
+@@ -1825,6 +1875,18 @@ static BlockJob *mirror_start_job(
bdrv_disable_dirty_bitmap(s->dirty_bitmap);
}
@@ -196,7 +196,7 @@ index 663e2b7002..9099c75992 100644
ret = block_job_add_bdrv(&s->common, "source", bs, 0,
BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE |
BLK_PERM_CONSISTENT_READ,
-@@ -1891,6 +1953,9 @@ fail:
+@@ -1902,6 +1964,9 @@ fail:
if (s->dirty_bitmap) {
bdrv_release_dirty_bitmap(s->dirty_bitmap);
}
@@ -206,7 +206,7 @@ index 663e2b7002..9099c75992 100644
job_early_fail(&s->common.job);
}
-@@ -1908,31 +1973,25 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
+@@ -1919,31 +1984,25 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
BlockDriverState *target, const char *replaces,
int creation_flags, int64_t speed,
uint32_t granularity, int64_t buf_size,
@@ -243,7 +243,7 @@ index 663e2b7002..9099c75992 100644
}
BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
-@@ -1959,7 +2018,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
+@@ -1970,7 +2029,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
job_id, bs, creation_flags, base, NULL, speed, 0, 0,
MIRROR_LEAVE_BACKING_CHAIN, false,
on_error, on_error, true, cb, opaque,
@@ -254,10 +254,10 @@ index 663e2b7002..9099c75992 100644
errp);
if (!job) {
diff --git a/blockdev.c b/blockdev.c
-index e464daea58..50e4a9c682 100644
+index e6eba61484..a8b1fd2a73 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -2942,6 +2942,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2848,6 +2848,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
BlockDriverState *target,
const char *replaces,
enum MirrorSyncMode sync,
@@ -267,15 +267,15 @@ index e464daea58..50e4a9c682 100644
BlockMirrorBackingMode backing_mode,
bool zero_target,
bool has_speed, int64_t speed,
-@@ -2960,6 +2963,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2866,6 +2869,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
{
BlockDriverState *unfiltered_bs;
int job_flags = JOB_DEFAULT;
+ BdrvDirtyBitmap *bitmap = NULL;
- if (!has_speed) {
- speed = 0;
-@@ -3011,6 +3015,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+ GLOBAL_STATE_CODE();
+ GRAPH_RDLOCK_GUARD_MAINLOOP();
+@@ -2920,6 +2924,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
sync = MIRROR_SYNC_MODE_FULL;
}
@@ -305,7 +305,7 @@ index e464daea58..50e4a9c682 100644
if (!replaces) {
/* We want to mirror from @bs, but keep implicit filters on top */
unfiltered_bs = bdrv_skip_implicit_filters(bs);
-@@ -3056,8 +3083,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2965,8 +2992,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
* and will allow to check whether the node still exist at mirror completion
*/
mirror_start(job_id, bs, target,
@@ -316,7 +316,7 @@ index e464daea58..50e4a9c682 100644
on_source_error, on_target_error, unmap, filter_node_name,
copy_mode, errp);
}
-@@ -3202,6 +3229,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
+@@ -3114,6 +3141,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
blockdev_mirror_common(arg->job_id, bs, target_bs,
arg->replaces, arg->sync,
@@ -325,7 +325,7 @@ index e464daea58..50e4a9c682 100644
backing_mode, zero_target,
arg->has_speed, arg->speed,
arg->has_granularity, arg->granularity,
-@@ -3223,6 +3252,8 @@ void qmp_blockdev_mirror(const char *job_id,
+@@ -3135,6 +3164,8 @@ void qmp_blockdev_mirror(const char *job_id,
const char *device, const char *target,
const char *replaces,
MirrorSyncMode sync,
@@ -334,7 +334,7 @@ index e464daea58..50e4a9c682 100644
bool has_speed, int64_t speed,
bool has_granularity, uint32_t granularity,
bool has_buf_size, int64_t buf_size,
-@@ -3271,7 +3302,8 @@ void qmp_blockdev_mirror(const char *job_id,
+@@ -3183,7 +3214,8 @@ void qmp_blockdev_mirror(const char *job_id,
}
blockdev_mirror_common(job_id, bs, target_bs,
@@ -345,7 +345,7 @@ index e464daea58..50e4a9c682 100644
has_granularity, granularity,
has_buf_size, buf_size,
diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h
-index 902406eb99..d559be928c 100644
+index da5fb31089..32f0f9858a 100644
--- a/include/block/block_int-global-state.h
+++ b/include/block/block_int-global-state.h
@@ -152,7 +152,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
@@ -360,31 +360,26 @@ index 902406eb99..d559be928c 100644
BlockdevOnError on_source_error,
BlockdevOnError on_target_error,
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index c05ad0c07e..3c945c1f93 100644
+index 2b1d493d6e..903392cb8f 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -2095,10 +2095,19 @@
- # (all the disk, only the sectors allocated in the topmost image, or
- # only new I/O).
+@@ -2145,6 +2145,15 @@
+ # destination (all the disk, only the sectors allocated in the
+ # topmost image, or only new I/O).
#
-+# @bitmap: The name of a bitmap to use for sync=bitmap mode. This argument must
-+# be present for bitmap mode and absent otherwise. The bitmap's
-+# granularity is used instead of @granularity (since 4.1).
++# @bitmap: The name of a bitmap to use for sync=bitmap mode. This
++# argument must be present for bitmap mode and absent otherwise.
++# The bitmap's granularity is used instead of @granularity (Since
++# 4.1).
+#
-+# @bitmap-mode: Specifies the type of data the bitmap should contain after
-+# the operation concludes. Must be present if sync is "bitmap".
-+# Must NOT be present otherwise. (Since 4.1)
++# @bitmap-mode: Specifies the type of data the bitmap should contain
++# after the operation concludes. Must be present if sync is
++# "bitmap". Must NOT be present otherwise. (Since 4.1)
+#
- # @granularity: granularity of the dirty bitmap, default is 64K
- # if the image format doesn't have clusters, 4K if the clusters
- # are smaller than that, else the cluster size. Must be a
--# power of 2 between 512 and 64M (since 1.4).
-+# power of 2 between 512 and 64M. Must not be specified if
-+# @bitmap is present (since 1.4).
- #
- # @buf-size: maximum amount of data in flight from source to
- # target (since 1.4).
-@@ -2138,7 +2147,9 @@
+ # @granularity: granularity of the dirty bitmap, default is 64K if the
+ # image format doesn't have clusters, 4K if the clusters are
+ # smaller than that, else the cluster size. Must be a power of 2
+@@ -2187,7 +2196,9 @@
{ 'struct': 'DriveMirror',
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
'*format': 'str', '*node-name': 'str', '*replaces': 'str',
@@ -395,28 +390,23 @@ index c05ad0c07e..3c945c1f93 100644
'*speed': 'int', '*granularity': 'uint32',
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
'*on-target-error': 'BlockdevOnError',
-@@ -2417,10 +2428,19 @@
- # (all the disk, only the sectors allocated in the topmost image, or
- # only new I/O).
+@@ -2471,6 +2482,15 @@
+ # destination (all the disk, only the sectors allocated in the
+ # topmost image, or only new I/O).
#
-+# @bitmap: The name of a bitmap to use for sync=bitmap mode. This argument must
-+# be present for bitmap mode and absent otherwise. The bitmap's
-+# granularity is used instead of @granularity (since 4.1).
++# @bitmap: The name of a bitmap to use for sync=bitmap mode. This
++# argument must be present for bitmap mode and absent otherwise.
++# The bitmap's granularity is used instead of @granularity (since
++# 4.1).
+#
-+# @bitmap-mode: Specifies the type of data the bitmap should contain after
-+# the operation concludes. Must be present if sync is "bitmap".
-+# Must NOT be present otherwise. (Since 4.1)
++# @bitmap-mode: Specifies the type of data the bitmap should contain
++# after the operation concludes. Must be present if sync is
++# "bitmap". Must NOT be present otherwise. (Since 4.1)
+#
- # @granularity: granularity of the dirty bitmap, default is 64K
- # if the image format doesn't have clusters, 4K if the clusters
- # are smaller than that, else the cluster size. Must be a
--# power of 2 between 512 and 64M
-+# power of 2 between 512 and 64M . Must not be specified if
-+# @bitmap is present.
- #
- # @buf-size: maximum amount of data in flight from source to
- # target
-@@ -2470,7 +2490,8 @@
+ # @granularity: granularity of the dirty bitmap, default is 64K if the
+ # image format doesn't have clusters, 4K if the clusters are
+ # smaller than that, else the cluster size. Must be a power of 2
+@@ -2521,7 +2541,8 @@
{ 'command': 'blockdev-mirror',
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
'*replaces': 'str',
@@ -427,7 +417,7 @@ index c05ad0c07e..3c945c1f93 100644
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
'*on-target-error': 'BlockdevOnError',
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
-index 3a5e1eb2c4..c1ecc49073 100644
+index d727a5fee8..8a34aa2328 100644
--- a/tests/unit/test-block-iothread.c
+++ b/tests/unit/test-block-iothread.c
@@ -757,8 +757,8 @@ static void test_propagate_mirror(void)
diff --git a/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch b/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
index b0ade68..a4a5a0b 100644
--- a/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
+++ b/debian/patches/bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
@@ -24,10 +24,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
-index 9099c75992..e2ff42067b 100644
+index 1ff42c8af1..11b8a8e959 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -680,8 +680,6 @@ static int mirror_exit_common(Job *job)
+@@ -682,8 +682,6 @@ static int mirror_exit_common(Job *job)
bdrv_unfreeze_backing_chain(mirror_top_bs, target_bs);
}
@@ -36,7 +36,7 @@ index 9099c75992..e2ff42067b 100644
/* Make sure that the source BDS doesn't go away during bdrv_replace_node,
* before we can call bdrv_drained_end */
bdrv_ref(src);
-@@ -782,6 +780,18 @@ static int mirror_exit_common(Job *job)
+@@ -788,6 +786,18 @@ static int mirror_exit_common(Job *job)
block_job_remove_all_bdrv(bjob);
bdrv_replace_node(mirror_top_bs, mirror_top_bs->backing->bs, &error_abort);
@@ -55,7 +55,7 @@ index 9099c75992..e2ff42067b 100644
bs_opaque->job = NULL;
bdrv_drained_end(src);
-@@ -1688,10 +1698,6 @@ static BlockJob *mirror_start_job(
+@@ -1699,10 +1709,6 @@ static BlockJob *mirror_start_job(
" sync mode",
MirrorSyncMode_str(sync_mode));
return NULL;
@@ -66,7 +66,7 @@ index 9099c75992..e2ff42067b 100644
}
} else if (bitmap) {
error_setg(errp,
-@@ -1708,6 +1714,12 @@ static BlockJob *mirror_start_job(
+@@ -1719,6 +1725,12 @@ static BlockJob *mirror_start_job(
return NULL;
}
granularity = bdrv_dirty_bitmap_granularity(bitmap);
diff --git a/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch b/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
index 302bbc5..4546b78 100644
--- a/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
+++ b/debian/patches/bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
@@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 3 insertions(+)
diff --git a/blockdev.c b/blockdev.c
-index 50e4a9c682..e6b2b1e338 100644
+index a8b1fd2a73..83d5cc1e49 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -3036,6 +3036,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2945,6 +2945,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_ALLOW_RO, errp)) {
return;
}
diff --git a/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch b/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch
index b954682..93a1524 100644
--- a/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch
+++ b/debian/patches/bitmap-mirror/0004-mirror-switch-to-bdrv_dirty_bitmap_merge_internal.patch
@@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
-index e2ff42067b..f42953837b 100644
+index 11b8a8e959..00f2665ca4 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -786,8 +786,8 @@ static int mirror_exit_common(Job *job)
+@@ -792,8 +792,8 @@ static int mirror_exit_common(Job *job)
job->ret == 0 && ret == 0)) {
/* Success; synchronize copy back to sync. */
bdrv_clear_dirty_bitmap(s->sync_bitmap, NULL);
@@ -30,7 +30,7 @@ index e2ff42067b..f42953837b 100644
}
}
bdrv_release_dirty_bitmap(s->dirty_bitmap);
-@@ -1881,11 +1881,8 @@ static BlockJob *mirror_start_job(
+@@ -1892,11 +1892,8 @@ static BlockJob *mirror_start_job(
}
if (s->sync_mode == MIRROR_SYNC_MODE_BITMAP) {
diff --git a/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch b/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch
index 5298342..9a3108f 100644
--- a/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch
+++ b/debian/patches/bitmap-mirror/0006-mirror-move-some-checks-to-qmp.patch
@@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
3 files changed, 70 insertions(+), 59 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
-index f42953837b..8f79efaa87 100644
+index 00f2665ca4..60cf574de5 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -1688,31 +1688,13 @@ static BlockJob *mirror_start_job(
+@@ -1699,31 +1699,13 @@ static BlockJob *mirror_start_job(
uint64_t target_perms, target_shared_perms;
int ret;
@@ -62,10 +62,10 @@ index f42953837b..8f79efaa87 100644
if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) {
diff --git a/blockdev.c b/blockdev.c
-index e6b2b1e338..bdae211a54 100644
+index 83d5cc1e49..060d86a65f 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -3015,7 +3015,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2924,7 +2924,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
sync = MIRROR_SYNC_MODE_FULL;
}
diff --git a/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch b/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
index a7fe592..5ed0d76 100644
--- a/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
+++ b/debian/patches/extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
@@ -48,7 +48,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
6 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
-index 033390f699..ad35d4fea8 100644
+index 965f5d5450..e04bd059b6 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -16,6 +16,7 @@ extern QemuOptsList qemu_mon_opts;
@@ -60,10 +60,10 @@ index 033390f699..ad35d4fea8 100644
void monitor_init_globals(void);
void monitor_init_globals_core(void);
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
-index 53e3808054..a19f8cbc2b 100644
+index 252de85681..8db28f9272 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
-@@ -152,6 +152,13 @@ typedef struct {
+@@ -151,6 +151,13 @@ typedef struct {
QemuMutex qmp_queue_lock;
/* Input queue that holds all the parsed QMP requests */
GQueue *qmp_requests;
@@ -78,10 +78,10 @@ index 53e3808054..a19f8cbc2b 100644
/**
diff --git a/monitor/monitor.c b/monitor/monitor.c
-index 8dc96f6af9..f3c38cb714 100644
+index dc352f9e9d..56e1307014 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
-@@ -135,6 +135,21 @@ bool monitor_cur_is_qmp(void)
+@@ -117,6 +117,21 @@ bool monitor_cur_is_qmp(void)
return cur_mon && monitor_is_qmp(cur_mon);
}
@@ -104,10 +104,10 @@ index 8dc96f6af9..f3c38cb714 100644
* Is @mon is using readline?
* Note: not all HMP monitors use readline, e.g., gdbserver has a
diff --git a/monitor/qmp.c b/monitor/qmp.c
-index 092c527b6f..6b8cfcf6d8 100644
+index 6eee450fe4..c15bf1e1fc 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
-@@ -141,6 +141,8 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
+@@ -165,6 +165,8 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
QDict *rsp;
QDict *error;
@@ -116,7 +116,7 @@ index 092c527b6f..6b8cfcf6d8 100644
rsp = qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon),
&mon->common);
-@@ -156,7 +158,17 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
+@@ -180,7 +182,17 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
}
}
@@ -135,7 +135,7 @@ index 092c527b6f..6b8cfcf6d8 100644
qobject_unref(rsp);
}
-@@ -444,6 +456,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
+@@ -478,6 +490,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
switch (event) {
case CHR_EVENT_OPENED:
@@ -144,7 +144,7 @@ index 092c527b6f..6b8cfcf6d8 100644
monitor_qmp_caps_reset(mon);
data = qmp_greeting(mon);
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
-index 0990873ec8..e605003771 100644
+index 555528b6bb..3baa508b4b 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -117,16 +117,28 @@ typedef struct QmpDispatchBH {
@@ -180,7 +180,7 @@ index 0990873ec8..e605003771 100644
aio_co_wake(data->co);
}
-@@ -231,6 +243,7 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
+@@ -231,6 +243,7 @@ QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *requ
.ret = &ret,
.errp = &err,
.co = qemu_coroutine_self(),
diff --git a/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch b/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
index 20ec053..328f6fb 100644
--- a/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
+++ b/debian/patches/extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
@@ -22,10 +22,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
-index 9cbbb16121..d624866bb6 100644
+index 32c70c9e99..984b6a3145 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
-@@ -1780,7 +1780,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
+@@ -1781,7 +1781,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
uint8_t cdb[16];
int len;
struct SCSIDevice *sdev = NULL;
@@ -34,7 +34,7 @@ index 9cbbb16121..d624866bb6 100644
lba_count = le32_to_cpu(cmd->frame->io.header.data_len);
lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo);
-@@ -1789,7 +1789,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
+@@ -1790,7 +1790,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
target_id = cmd->frame->header.target_id;
lun_id = cmd->frame->header.lun_id;
@@ -42,7 +42,7 @@ index 9cbbb16121..d624866bb6 100644
if (target_id < MFI_MAX_LD && lun_id == 0) {
sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
-@@ -1804,15 +1803,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
+@@ -1805,15 +1804,6 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
return MFI_STAT_DEVICE_NOT_FOUND;
}
@@ -58,7 +58,7 @@ index 9cbbb16121..d624866bb6 100644
cmd->iov_size = lba_count * sdev->blocksize;
if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) {
megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE));
-@@ -1823,7 +1813,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
+@@ -1824,7 +1814,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
megasas_encode_lba(cdb, lba_start, lba_count, is_write);
cmd->req = scsi_req_new(sdev, cmd->index,
diff --git a/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch b/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
index 89491a5..018f0c9 100644
--- a/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
+++ b/debian/patches/extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
@@ -55,7 +55,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
-index 45d14a25e9..08e1f0c3d7 100644
+index 07971c0218..6a74afe564 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -444,7 +444,7 @@ static void ide_trim_bh_cb(void *opaque)
@@ -76,8 +76,8 @@ index 45d14a25e9..08e1f0c3d7 100644
replay_bh_schedule_event(iocb->bh);
}
}
-@@ -515,9 +517,6 @@ BlockAIOCB *ide_issue_trim(
- IDEState *s = opaque;
+@@ -516,9 +518,6 @@ BlockAIOCB *ide_issue_trim(
+ IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
TrimAIOCB *iocb;
- /* Paired with a decrement in ide_trim_bh_cb() */
@@ -85,8 +85,8 @@ index 45d14a25e9..08e1f0c3d7 100644
-
iocb = blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque);
iocb->s = s;
- iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
-@@ -740,8 +739,9 @@ void ide_cancel_dma_sync(IDEState *s)
+ iocb->bh = qemu_bh_new_guarded(ide_trim_bh_cb, iocb,
+@@ -742,8 +741,9 @@ void ide_cancel_dma_sync(IDEState *s)
*/
if (s->bus->dma->aiocb) {
trace_ide_cancel_dma_sync_remaining();
diff --git a/debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch b/debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
similarity index 98%
rename from debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
rename to debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
index bb01ced..4dae6ca 100644
--- a/debian/patches/extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
+++ b/debian/patches/extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
@@ -20,7 +20,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 6 insertions(+)
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
-index fe73aa94b1..7eaf498439 100644
+index 032fc5f405..e1ae3b7316 100644
--- a/migration/block-dirty-bitmap.c
+++ b/migration/block-dirty-bitmap.c
@@ -805,8 +805,11 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
diff --git a/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch b/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch
deleted file mode 100644
index 0b8d2c0..0000000
--- a/debian/patches/extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
-Date: Fri, 28 Apr 2023 19:48:06 +0400
-Subject: [PATCH] ui: return NULL when getting cursor without a console
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-VNC may try to get the current cursor even when there are no consoles
-and crashes. Simple reproducer is qemu with -nodefaults.
-
-Fixes: (again)
-https://gitlab.com/qemu-project/qemu/-/issues/1548
-
-Fixes: commit 385ac97f8 ("ui: keep current cursor with QemuConsole")
-Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
-Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
-(picked up from https://lists.nongnu.org/archive/html/qemu-devel/2023-04/msg05598.html)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- ui/console.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/ui/console.c b/ui/console.c
-index e173731e20..7461446e71 100644
---- a/ui/console.c
-+++ b/ui/console.c
-@@ -2306,7 +2306,7 @@ QEMUCursor *qemu_console_get_cursor(QemuConsole *con)
- if (con == NULL) {
- con = active_console;
- }
-- return con->cursor;
-+ return con ? con->cursor : NULL;
- }
-
- bool qemu_console_is_visible(QemuConsole *con)
diff --git a/debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch b/debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
similarity index 97%
rename from debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
rename to debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
index d11ae00..ef1a649 100644
--- a/debian/patches/extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
+++ b/debian/patches/extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
@@ -68,10 +68,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
-index 08e1f0c3d7..148fccdef2 100644
+index 6a74afe564..289347af58 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
-@@ -2513,19 +2513,19 @@ static void ide_dummy_transfer_stop(IDEState *s)
+@@ -2515,19 +2515,19 @@ static void ide_dummy_transfer_stop(IDEState *s)
void ide_bus_reset(IDEBus *bus)
{
diff --git a/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch b/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch
deleted file mode 100644
index c9d0cd5..0000000
--- a/debian/patches/extra/0005-memory-prevent-dma-reentracy-issues.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-Date: Thu, 27 Apr 2023 17:10:06 -0400
-Subject: [PATCH] memory: prevent dma-reentracy issues
-
-Add a flag to the DeviceState, when a device is engaged in PIO/MMIO/DMA.
-This flag is set/checked prior to calling a device's MemoryRegion
-handlers, and set when device code initiates DMA. The purpose of this
-flag is to prevent two types of DMA-based reentrancy issues:
-
-1.) mmio -> dma -> mmio case
-2.) bh -> dma write -> mmio case
-
-These issues have led to problems such as stack-exhaustion and
-use-after-frees.
-
-Summary of the problem from Peter Maydell:
-https://lore.kernel.org/qemu-devel/CAFEAcA_23vc7hE3iaM-JVA6W38LK4hJoWae5KcknhPRD5fPBZA@mail.gmail.com
-
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/62
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/540
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/541
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/556
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/557
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/827
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1282
-Resolves: CVE-2023-0330
-
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Message-Id: <20230427211013.2994127-2-alxndr@bu.edu>
-[thuth: Replace warn_report() with warn_report_once()]
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit a2e1753b8054344f32cf94f31c6399a58794a380)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- include/exec/memory.h | 5 +++++
- include/hw/qdev-core.h | 7 +++++++
- softmmu/memory.c | 16 ++++++++++++++++
- 3 files changed, 28 insertions(+)
-
-diff --git a/include/exec/memory.h b/include/exec/memory.h
-index 15ade918ba..e45ce6061f 100644
---- a/include/exec/memory.h
-+++ b/include/exec/memory.h
-@@ -767,6 +767,8 @@ struct MemoryRegion {
- bool is_iommu;
- RAMBlock *ram_block;
- Object *owner;
-+ /* owner as TYPE_DEVICE. Used for re-entrancy checks in MR access hotpath */
-+ DeviceState *dev;
-
- const MemoryRegionOps *ops;
- void *opaque;
-@@ -791,6 +793,9 @@ struct MemoryRegion {
- unsigned ioeventfd_nb;
- MemoryRegionIoeventfd *ioeventfds;
- RamDiscardManager *rdm; /* Only for RAM */
-+
-+ /* For devices designed to perform re-entrant IO into their own IO MRs */
-+ bool disable_reentrancy_guard;
- };
-
- struct IOMMUMemoryRegion {
-diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
-index bd50ad5ee1..7623703943 100644
---- a/include/hw/qdev-core.h
-+++ b/include/hw/qdev-core.h
-@@ -162,6 +162,10 @@ struct NamedClockList {
- QLIST_ENTRY(NamedClockList) node;
- };
-
-+typedef struct {
-+ bool engaged_in_io;
-+} MemReentrancyGuard;
-+
- /**
- * DeviceState:
- * @realized: Indicates whether the device has been fully constructed.
-@@ -194,6 +198,9 @@ struct DeviceState {
- int alias_required_for_version;
- ResettableState reset;
- GSList *unplug_blockers;
-+
-+ /* Is the device currently in mmio/pio/dma? Used to prevent re-entrancy */
-+ MemReentrancyGuard mem_reentrancy_guard;
- };
-
- struct DeviceListener {
-diff --git a/softmmu/memory.c b/softmmu/memory.c
-index b1a6cae6f5..b7b3386e9d 100644
---- a/softmmu/memory.c
-+++ b/softmmu/memory.c
-@@ -542,6 +542,18 @@ static MemTxResult access_with_adjusted_size(hwaddr addr,
- access_size_max = 4;
- }
-
-+ /* Do not allow more than one simultaneous access to a device's IO Regions */
-+ if (mr->dev && !mr->disable_reentrancy_guard &&
-+ !mr->ram_device && !mr->ram && !mr->rom_device && !mr->readonly) {
-+ if (mr->dev->mem_reentrancy_guard.engaged_in_io) {
-+ warn_report_once("Blocked re-entrant IO on MemoryRegion: "
-+ "%s at addr: 0x%" HWADDR_PRIX,
-+ memory_region_name(mr), addr);
-+ return MEMTX_ACCESS_ERROR;
-+ }
-+ mr->dev->mem_reentrancy_guard.engaged_in_io = true;
-+ }
-+
- /* FIXME: support unaligned access? */
- access_size = MAX(MIN(size, access_size_max), access_size_min);
- access_mask = MAKE_64BIT_MASK(0, access_size * 8);
-@@ -556,6 +568,9 @@ static MemTxResult access_with_adjusted_size(hwaddr addr,
- access_mask, attrs);
- }
- }
-+ if (mr->dev) {
-+ mr->dev->mem_reentrancy_guard.engaged_in_io = false;
-+ }
- return r;
- }
-
-@@ -1170,6 +1185,7 @@ static void memory_region_do_init(MemoryRegion *mr,
- }
- mr->name = g_strdup(name);
- mr->owner = owner;
-+ mr->dev = (DeviceState *) object_dynamic_cast(mr->owner, TYPE_DEVICE);
- mr->ram_block = NULL;
-
- if (name) {
diff --git a/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch b/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch
deleted file mode 100644
index 96d254c..0000000
--- a/debian/patches/extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-Date: Thu, 27 Apr 2023 17:10:10 -0400
-Subject: [PATCH] lsi53c895a: disable reentrancy detection for script RAM
-
-As the code is designed to use the memory APIs to access the script ram,
-disable reentrancy checks for the pseudo-RAM ram_io MemoryRegion.
-
-In the future, ram_io may be converted from an IO to a proper RAM MemoryRegion.
-
-Reported-by: Fiona Ebner <f.ebner@proxmox.com>
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
-Message-Id: <20230427211013.2994127-6-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit bfd6e7ae6a72b84e2eb9574f56e6ec037f05182c)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/scsi/lsi53c895a.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
-index bbf32d3f73..17af67935f 100644
---- a/hw/scsi/lsi53c895a.c
-+++ b/hw/scsi/lsi53c895a.c
-@@ -2313,6 +2313,12 @@ static void lsi_scsi_realize(PCIDevice *dev, Error **errp)
- memory_region_init_io(&s->io_io, OBJECT(s), &lsi_io_ops, s,
- "lsi-io", 256);
-
-+ /*
-+ * Since we use the address-space API to interact with ram_io, disable the
-+ * re-entrancy guard.
-+ */
-+ s->ram_io.disable_reentrancy_guard = true;
-+
- address_space_init(&s->pci_io_as, pci_address_space_io(dev), "lsi-pci-io");
- qdev_init_gpio_out(d, &s->ext_irq, 1);
-
diff --git a/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch b/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch
deleted file mode 100644
index 6ec9d03..0000000
--- a/debian/patches/extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-Date: Thu, 27 Apr 2023 17:10:11 -0400
-Subject: [PATCH] bcm2835_property: disable reentrancy detection for iomem
-
-As the code is designed for re-entrant calls from bcm2835_property to
-bcm2835_mbox and back into bcm2835_property, mark iomem as
-reentrancy-safe.
-
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Reviewed-by: Thomas Huth <thuth@redhat.com>
-Message-Id: <20230427211013.2994127-7-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 985c4a4e547afb9573b6bd6843d20eb2c3d1d1cd)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/misc/bcm2835_property.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
-index 890ae7bae5..de056ea2df 100644
---- a/hw/misc/bcm2835_property.c
-+++ b/hw/misc/bcm2835_property.c
-@@ -382,6 +382,13 @@ static void bcm2835_property_init(Object *obj)
-
- memory_region_init_io(&s->iomem, OBJECT(s), &bcm2835_property_ops, s,
- TYPE_BCM2835_PROPERTY, 0x10);
-+
-+ /*
-+ * bcm2835_property_ops call into bcm2835_mbox, which in-turn reads from
-+ * iomem. As such, mark iomem as re-entracy safe.
-+ */
-+ s->iomem.disable_reentrancy_guard = true;
-+
- sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
- sysbus_init_irq(SYS_BUS_DEVICE(s), &s->mbox_irq);
- }
diff --git a/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch b/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch
deleted file mode 100644
index bea68d4..0000000
--- a/debian/patches/extra/0008-raven-disable-reentrancy-detection-for-iomem.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-Date: Thu, 27 Apr 2023 17:10:12 -0400
-Subject: [PATCH] raven: disable reentrancy detection for iomem
-
-As the code is designed for re-entrant calls from raven_io_ops to
-pci-conf, mark raven_io_ops as reentrancy-safe.
-
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Message-Id: <20230427211013.2994127-8-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 6dad5a6810d9c60ca320d01276f6133bbcfa1fc7)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/pci-host/raven.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
-index 072ffe3c5e..9a11ac4b2b 100644
---- a/hw/pci-host/raven.c
-+++ b/hw/pci-host/raven.c
-@@ -294,6 +294,13 @@ static void raven_pcihost_initfn(Object *obj)
- memory_region_init(&s->pci_memory, obj, "pci-memory", 0x3f000000);
- address_space_init(&s->pci_io_as, &s->pci_io, "raven-io");
-
-+ /*
-+ * Raven's raven_io_ops use the address-space API to access pci-conf-idx
-+ * (which is also owned by the raven device). As such, mark the
-+ * pci_io_non_contiguous as re-entrancy safe.
-+ */
-+ s->pci_io_non_contiguous.disable_reentrancy_guard = true;
-+
- /* CPU address space */
- memory_region_add_subregion(address_space_mem, PCI_IO_BASE_ADDR,
- &s->pci_io);
diff --git a/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch b/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch
deleted file mode 100644
index 154cc36..0000000
--- a/debian/patches/extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alexander Bulekov <alxndr@bu.edu>
-Date: Thu, 27 Apr 2023 17:10:13 -0400
-Subject: [PATCH] apic: disable reentrancy detection for apic-msi
-
-As the code is designed for re-entrant calls to apic-msi, mark apic-msi
-as reentrancy-safe.
-
-Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
-Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
-Message-Id: <20230427211013.2994127-9-alxndr@bu.edu>
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-(cherry-picked from commit 50795ee051a342c681a9b45671c552fbd6274db8)
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/intc/apic.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/hw/intc/apic.c b/hw/intc/apic.c
-index 20b5a94073..ac3d47d231 100644
---- a/hw/intc/apic.c
-+++ b/hw/intc/apic.c
-@@ -885,6 +885,13 @@ static void apic_realize(DeviceState *dev, Error **errp)
- memory_region_init_io(&s->io_memory, OBJECT(s), &apic_io_ops, s, "apic-msi",
- APIC_SPACE_SIZE);
-
-+ /*
-+ * apic-msi's apic_mem_write can call into ioapic_eoi_broadcast, which can
-+ * write back to apic-msi. As such mark the apic-msi region re-entrancy
-+ * safe.
-+ */
-+ s->io_memory.disable_reentrancy_guard = true;
-+
- s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, apic_timer, s);
- local_apics[s->id] = s;
-
diff --git a/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch b/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch
deleted file mode 100644
index 31392fb..0000000
--- a/debian/patches/extra/0011-vhost-fix-the-fd-leak.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Li Feng <fengli@smartx.com>
-Date: Mon, 31 Jul 2023 20:10:06 +0800
-Subject: [PATCH] vhost: fix the fd leak
-
-When the vhost-user reconnect to the backend, the notifer should be
-cleanup. Otherwise, the fd resource will be exhausted.
-
-Fixes: f9a09ca3ea ("vhost: add support for configure interrupt")
-
-Signed-off-by: Li Feng <fengli@smartx.com>
-Reviewed-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
----
- hw/virtio/vhost.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
-index a266396576..8e3311781f 100644
---- a/hw/virtio/vhost.c
-+++ b/hw/virtio/vhost.c
-@@ -2034,6 +2034,8 @@ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings)
- event_notifier_test_and_clear(
- &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier);
- event_notifier_test_and_clear(&vdev->config_notifier);
-+ event_notifier_cleanup(
-+ &hdev->vqs[VHOST_QUEUE_NUM_CONFIG_INR].masked_config_notifier);
-
- trace_vhost_dev_stop(hdev, vdev->name, vrings);
-
diff --git a/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch b/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch
index 4926a64..3d8785c 100644
--- a/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch
+++ b/debian/patches/pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
-index c2dee3f056..9681bd0434 100644
+index aa89789737..0db366a851 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
-@@ -553,7 +553,7 @@ static QemuOptsList raw_runtime_opts = {
+@@ -564,7 +564,7 @@ static QemuOptsList raw_runtime_opts = {
{
.name = "locking",
.type = QEMU_OPT_STRING,
@@ -26,7 +26,7 @@ index c2dee3f056..9681bd0434 100644
},
{
.name = "pr-manager",
-@@ -653,7 +653,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
+@@ -664,7 +664,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
s->use_lock = false;
break;
case ON_OFF_AUTO_AUTO:
diff --git a/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch b/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch
index 2827fa4..297e250 100644
--- a/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch
+++ b/debian/patches/pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch
@@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
-index d243e290d3..3489b05ec4 100644
+index e0771a1043..1018ccc0b8 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
-@@ -2203,9 +2203,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
+@@ -2243,9 +2243,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
#ifdef TARGET_X86_64
diff --git a/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch b/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch
index 6f3afdb..947fc90 100644
--- a/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch
+++ b/debian/patches/pve/0005-PVE-Config-glusterfs-no-default-logfile-if-daemonize.patch
@@ -9,7 +9,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/block/gluster.c b/block/gluster.c
-index 185a83e5e5..f11a40aa9e 100644
+index ad5fadbe79..d0011085c4 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -43,7 +43,7 @@
@@ -24,7 +24,7 @@ index 185a83e5e5..f11a40aa9e 100644
@@ -425,6 +425,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
int old_errno;
SocketAddressList *server;
- unsigned long long port;
+ uint64_t port;
+ const char *logfile;
glfs = glfs_find_preopened(gconf->volume);
diff --git a/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch b/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch
index 122a07d..c4e6729 100644
--- a/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch
+++ b/debian/patches/pve/0007-PVE-Up-glusterfs-allow-partial-reads.patch
@@ -16,7 +16,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/block/gluster.c b/block/gluster.c
-index f11a40aa9e..6756e6b886 100644
+index d0011085c4..2df3d6e35d 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -58,6 +58,7 @@ typedef struct GlusterAIOCB {
diff --git a/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch b/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch
index feb1ef3..fb505e5 100644
--- a/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch
+++ b/debian/patches/pve/0008-PVE-Up-qemu-img-return-success-on-info-without-snaps.patch
@@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/qemu-img.c b/qemu-img.c
-index 9aeac69fa6..0919fac1f1 100644
+index 27f48051b0..bb287d8538 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -3059,7 +3059,8 @@ static int img_info(int argc, char **argv)
+@@ -3062,7 +3062,8 @@ static int img_info(int argc, char **argv)
list = collect_image_info_list(image_opts, filename, fmt, chain,
force_share);
if (!list) {
diff --git a/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch b/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch
index ffc30d0..5b88664 100644
--- a/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch
+++ b/debian/patches/pve/0009-PVE-Up-qemu-img-dd-add-osize-and-read-from-to-stdin-.patch
@@ -54,10 +54,10 @@ index 1b1dab5b17..d1616c045a 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index 0919fac1f1..c584de648c 100644
+index bb287d8538..09c0340d16 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -4885,10 +4885,12 @@ static int img_bitmap(int argc, char **argv)
+@@ -4888,10 +4888,12 @@ static int img_bitmap(int argc, char **argv)
#define C_IF 04
#define C_OF 010
#define C_SKIP 020
@@ -70,7 +70,7 @@ index 0919fac1f1..c584de648c 100644
};
struct DdIo {
-@@ -4964,6 +4966,19 @@ static int img_dd_skip(const char *arg,
+@@ -4967,6 +4969,19 @@ static int img_dd_skip(const char *arg,
return 0;
}
@@ -90,7 +90,7 @@ index 0919fac1f1..c584de648c 100644
static int img_dd(int argc, char **argv)
{
int ret = 0;
-@@ -5004,6 +5019,7 @@ static int img_dd(int argc, char **argv)
+@@ -5007,6 +5022,7 @@ static int img_dd(int argc, char **argv)
{ "if", img_dd_if, C_IF },
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
@@ -98,7 +98,7 @@ index 0919fac1f1..c584de648c 100644
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
-@@ -5079,91 +5095,112 @@ static int img_dd(int argc, char **argv)
+@@ -5082,91 +5098,112 @@ static int img_dd(int argc, char **argv)
arg = NULL;
}
@@ -275,7 +275,7 @@ index 0919fac1f1..c584de648c 100644
}
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
-@@ -5180,20 +5217,43 @@ static int img_dd(int argc, char **argv)
+@@ -5183,20 +5220,43 @@ static int img_dd(int argc, char **argv)
in.buf = g_new(uint8_t, in.bsz);
for (out_pos = 0; in_pos < size; ) {
diff --git a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch
index af21381..0325fe9 100644
--- a/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch
+++ b/debian/patches/pve/0010-PVE-Up-qemu-img-dd-add-isize-parameter.patch
@@ -16,10 +16,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/qemu-img.c b/qemu-img.c
-index c584de648c..a57ceeddfe 100644
+index 09c0340d16..556535d9d5 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -4886,11 +4886,13 @@ static int img_bitmap(int argc, char **argv)
+@@ -4889,11 +4889,13 @@ static int img_bitmap(int argc, char **argv)
#define C_OF 010
#define C_SKIP 020
#define C_OSIZE 040
@@ -33,7 +33,7 @@ index c584de648c..a57ceeddfe 100644
};
struct DdIo {
-@@ -4979,6 +4981,19 @@ static int img_dd_osize(const char *arg,
+@@ -4982,6 +4984,19 @@ static int img_dd_osize(const char *arg,
return 0;
}
@@ -53,7 +53,7 @@ index c584de648c..a57ceeddfe 100644
static int img_dd(int argc, char **argv)
{
int ret = 0;
-@@ -4993,12 +5008,14 @@ static int img_dd(int argc, char **argv)
+@@ -4996,12 +5011,14 @@ static int img_dd(int argc, char **argv)
int c, i;
const char *out_fmt = "raw";
const char *fmt = NULL;
@@ -69,7 +69,7 @@ index c584de648c..a57ceeddfe 100644
};
struct DdIo in = {
.bsz = 512, /* Block size is by default 512 bytes */
-@@ -5020,6 +5037,7 @@ static int img_dd(int argc, char **argv)
+@@ -5023,6 +5040,7 @@ static int img_dd(int argc, char **argv)
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
{ "osize", img_dd_osize, C_OSIZE },
@@ -77,7 +77,7 @@ index c584de648c..a57ceeddfe 100644
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
-@@ -5216,9 +5234,10 @@ static int img_dd(int argc, char **argv)
+@@ -5219,9 +5237,10 @@ static int img_dd(int argc, char **argv)
in.buf = g_new(uint8_t, in.bsz);
@@ -90,7 +90,7 @@ index c584de648c..a57ceeddfe 100644
if (blk1) {
in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
if (in_ret == 0) {
-@@ -5227,6 +5246,9 @@ static int img_dd(int argc, char **argv)
+@@ -5230,6 +5249,9 @@ static int img_dd(int argc, char **argv)
} else {
in_ret = read(STDIN_FILENO, in.buf, bytes);
if (in_ret == 0) {
diff --git a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch
index 376aa67..5cca59a 100644
--- a/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch
+++ b/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-n-skip_create.patch
@@ -65,10 +65,10 @@ index d1616c045a..b5b0bb4467 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index a57ceeddfe..06d814e39c 100644
+index 556535d9d5..289c78febb 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -5010,7 +5010,7 @@ static int img_dd(int argc, char **argv)
+@@ -5013,7 +5013,7 @@ static int img_dd(int argc, char **argv)
const char *fmt = NULL;
int64_t size = 0, readsize = 0;
int64_t out_pos, in_pos;
@@ -77,7 +77,7 @@ index a57ceeddfe..06d814e39c 100644
struct DdInfo dd = {
.flags = 0,
.count = 0,
-@@ -5048,7 +5048,7 @@ static int img_dd(int argc, char **argv)
+@@ -5051,7 +5051,7 @@ static int img_dd(int argc, char **argv)
{ 0, 0, 0, 0 }
};
@@ -86,7 +86,7 @@ index a57ceeddfe..06d814e39c 100644
if (c == EOF) {
break;
}
-@@ -5068,6 +5068,9 @@ static int img_dd(int argc, char **argv)
+@@ -5071,6 +5071,9 @@ static int img_dd(int argc, char **argv)
case 'h':
help();
break;
@@ -96,7 +96,7 @@ index a57ceeddfe..06d814e39c 100644
case 'U':
force_share = true;
break;
-@@ -5198,13 +5201,15 @@ static int img_dd(int argc, char **argv)
+@@ -5201,13 +5204,15 @@ static int img_dd(int argc, char **argv)
size - in.bsz * in.offset, &error_abort);
}
diff --git a/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch b/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch
index debfc54..d649d24 100644
--- a/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch
+++ b/debian/patches/pve/0012-qemu-img-dd-add-l-option-for-loading-a-snapshot.patch
@@ -46,10 +46,10 @@ index b5b0bb4467..36f97e1f19 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index 06d814e39c..e2c06c496d 100644
+index 289c78febb..da543d05cb 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -5002,6 +5002,7 @@ static int img_dd(int argc, char **argv)
+@@ -5005,6 +5005,7 @@ static int img_dd(int argc, char **argv)
BlockDriver *drv = NULL, *proto_drv = NULL;
BlockBackend *blk1 = NULL, *blk2 = NULL;
QemuOpts *opts = NULL;
@@ -57,7 +57,7 @@ index 06d814e39c..e2c06c496d 100644
QemuOptsList *create_opts = NULL;
Error *local_err = NULL;
bool image_opts = false;
-@@ -5011,6 +5012,7 @@ static int img_dd(int argc, char **argv)
+@@ -5014,6 +5015,7 @@ static int img_dd(int argc, char **argv)
int64_t size = 0, readsize = 0;
int64_t out_pos, in_pos;
bool force_share = false, skip_create = false;
@@ -65,7 +65,7 @@ index 06d814e39c..e2c06c496d 100644
struct DdInfo dd = {
.flags = 0,
.count = 0,
-@@ -5048,7 +5050,7 @@ static int img_dd(int argc, char **argv)
+@@ -5051,7 +5053,7 @@ static int img_dd(int argc, char **argv)
{ 0, 0, 0, 0 }
};
@@ -74,7 +74,7 @@ index 06d814e39c..e2c06c496d 100644
if (c == EOF) {
break;
}
-@@ -5071,6 +5073,19 @@ static int img_dd(int argc, char **argv)
+@@ -5074,6 +5076,19 @@ static int img_dd(int argc, char **argv)
case 'n':
skip_create = true;
break;
@@ -94,7 +94,7 @@ index 06d814e39c..e2c06c496d 100644
case 'U':
force_share = true;
break;
-@@ -5130,11 +5145,24 @@ static int img_dd(int argc, char **argv)
+@@ -5133,11 +5148,24 @@ static int img_dd(int argc, char **argv)
if (dd.flags & C_IF) {
blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
force_share);
@@ -120,7 +120,7 @@ index 06d814e39c..e2c06c496d 100644
}
if (dd.flags & C_OSIZE) {
-@@ -5289,6 +5317,7 @@ static int img_dd(int argc, char **argv)
+@@ -5292,6 +5320,7 @@ static int img_dd(int argc, char **argv)
out:
g_free(arg);
qemu_opts_del(opts);
diff --git a/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch b/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch
index b465314..2c1524f 100644
--- a/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch
+++ b/debian/patches/pve/0013-PVE-virtio-balloon-improve-query-balloon.patch
@@ -59,10 +59,10 @@ index c3e55ef9e9..0e32e6201f 100644
qapi_free_BalloonInfo(info);
}
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
-index 746f07c4d2..a41854b902 100644
+index d004cf29d2..2660ed520b 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
-@@ -804,8 +804,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
+@@ -782,8 +782,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
static void virtio_balloon_stat(void *opaque, BalloonInfo *info)
{
VirtIOBalloon *dev = opaque;
@@ -103,12 +103,12 @@ index 746f07c4d2..a41854b902 100644
static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
diff --git a/qapi/machine.json b/qapi/machine.json
-index 604b686e59..15f5f86683 100644
+index a08b6576ca..5c9a4d55f4 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -1056,9 +1056,29 @@
- # @actual: the logical size of the VM in bytes
- # Formula used: logical_vm_size = vm_ram_size - balloon_size
+@@ -1063,9 +1063,29 @@
+ # @actual: the logical size of the VM in bytes Formula used:
+ # logical_vm_size = vm_ram_size - balloon_size
#
+# @last_update: time when stats got updated from guest
+#
diff --git a/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch b/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch
index e40d67f..ab331f3 100644
--- a/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch
+++ b/debian/patches/pve/0014-PVE-qapi-modify-query-machines.patch
@@ -13,10 +13,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
-index b98ff15089..24595f618c 100644
+index 3860a50c3b..40821e2317 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
-@@ -103,6 +103,12 @@ MachineInfoList *qmp_query_machines(Error **errp)
+@@ -91,6 +91,12 @@ MachineInfoList *qmp_query_machines(Error **errp)
info->numa_mem_supported = mc->numa_mem_supported;
info->deprecated = !!mc->deprecation_reason;
info->acpi = !!object_class_property_find(OBJECT_CLASS(mc), "acpi");
@@ -30,19 +30,19 @@ index b98ff15089..24595f618c 100644
info->default_cpu_type = g_strdup(mc->default_cpu_type);
}
diff --git a/qapi/machine.json b/qapi/machine.json
-index 15f5f86683..c904280085 100644
+index 5c9a4d55f4..fbb61f18e4 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -138,6 +138,8 @@
+@@ -139,6 +139,8 @@
#
# @is-default: whether the machine is default
#
+# @is-current: whether this machine is currently used
+#
# @cpu-max: maximum number of CPUs supported by the machine type
- # (since 1.5)
+ # (since 1.5)
#
-@@ -161,7 +163,7 @@
+@@ -163,7 +165,7 @@
##
{ 'struct': 'MachineInfo',
'data': { 'name': 'str', '*alias': 'str',
diff --git a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
index df551da..26c6840 100644
--- a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
+++ b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
@@ -14,10 +14,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2 files changed, 7 insertions(+)
diff --git a/qapi/ui.json b/qapi/ui.json
-index 98322342f7..316d4dc933 100644
+index 006616aa77..dfd1d3e36b 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
-@@ -310,11 +310,14 @@
+@@ -317,11 +317,14 @@
#
# @channels: a list of @SpiceChannel for each active spice channel
#
diff --git a/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch b/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch
index ce12543..40c9b32 100644
--- a/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch
+++ b/debian/patches/pve/0016-PVE-add-IOChannel-implementation-for-savevm-async.patch
@@ -269,14 +269,14 @@ index 0000000000..17ae2cb261
+
+#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */
diff --git a/migration/meson.build b/migration/meson.build
-index 0d1bb9f96e..8a142fc7a9 100644
+index 1ae28523a1..37ddcb5d60 100644
--- a/migration/meson.build
+++ b/migration/meson.build
-@@ -13,6 +13,7 @@ softmmu_ss.add(files(
+@@ -13,6 +13,7 @@ system_ss.add(files(
'block-dirty-bitmap.c',
'channel.c',
'channel-block.c',
+ 'channel-savevm-async.c',
- 'colo-failover.c',
- 'colo.c',
+ 'dirtyrate.c',
'exec.c',
+ 'fd.c',
diff --git a/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch
index 0c98142..976f73f 100644
--- a/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch
+++ b/debian/patches/pve/0017-PVE-add-savevm-async-for-background-state-snapshots.patch
@@ -35,20 +35,20 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
include/migration/snapshot.h | 2 +
include/monitor/hmp.h | 3 +
migration/meson.build | 1 +
- migration/savevm-async.c | 533 +++++++++++++++++++++++++++++++++++
+ migration/savevm-async.c | 531 +++++++++++++++++++++++++++++++++++
monitor/hmp-cmds.c | 38 +++
qapi/migration.json | 34 +++
qapi/misc.json | 16 ++
qemu-options.hx | 12 +
softmmu/vl.c | 10 +
- 11 files changed, 679 insertions(+)
+ 11 files changed, 677 insertions(+)
create mode 100644 migration/savevm-async.c
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
-index 47d63d26db..a166bff3d5 100644
+index f5b37eb74a..10fdd822e0 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
-@@ -540,6 +540,19 @@ SRST
+@@ -525,6 +525,19 @@ SRST
Show current migration parameters.
ERST
@@ -69,10 +69,10 @@ index 47d63d26db..a166bff3d5 100644
.name = "balloon",
.args_type = "",
diff --git a/hmp-commands.hx b/hmp-commands.hx
-index bb85ee1d26..d9f9f42d11 100644
+index 2cbd0f77a0..e352f86872 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
-@@ -1846,3 +1846,20 @@ SRST
+@@ -1865,3 +1865,20 @@ SRST
List event channels in the guest
ERST
#endif
@@ -105,7 +105,7 @@ index e72083b117..c846d37806 100644
+
#endif
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
-index fdb69b7f9c..fdf6b45fb8 100644
+index 13f9a2dedb..7a7def7530 100644
--- a/include/monitor/hmp.h
+++ b/include/monitor/hmp.h
@@ -28,6 +28,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict);
@@ -126,11 +126,11 @@ index fdb69b7f9c..fdf6b45fb8 100644
void coroutine_fn hmp_screendump(Monitor *mon, const QDict *qdict);
void hmp_chardev_add(Monitor *mon, const QDict *qdict);
diff --git a/migration/meson.build b/migration/meson.build
-index 8a142fc7a9..a7824b5266 100644
+index 37ddcb5d60..07f6057acc 100644
--- a/migration/meson.build
+++ b/migration/meson.build
-@@ -25,6 +25,7 @@ softmmu_ss.add(files(
- 'multifd-zlib.c',
+@@ -26,6 +26,7 @@ system_ss.add(files(
+ 'options.c',
'postcopy-ram.c',
'savevm.c',
+ 'savevm-async.c',
@@ -139,13 +139,15 @@ index 8a142fc7a9..a7824b5266 100644
'threadinfo.c',
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
new file mode 100644
-index 0000000000..aa2017d496
+index 0000000000..e9fc18fb10
--- /dev/null
+++ b/migration/savevm-async.c
-@@ -0,0 +1,533 @@
+@@ -0,0 +1,531 @@
+#include "qemu/osdep.h"
+#include "migration/channel-savevm-async.h"
+#include "migration/migration.h"
++#include "migration/migration-stats.h"
++#include "migration/options.h"
+#include "migration/savevm.h"
+#include "migration/snapshot.h"
+#include "migration/global_state.h"
@@ -420,11 +422,7 @@ index 0000000000..aa2017d496
+ DPRINTF("savevm iterate pending size %lu ret %d\n", pending_size, ret);
+ } else {
+ qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL);
-+ ret = global_state_store();
-+ if (ret) {
-+ save_snapshot_error("global_state_store error %d", ret);
-+ break;
-+ }
++ global_state_store();
+
+ DPRINTF("savevm iterate complete\n");
+ break;
@@ -485,7 +483,7 @@ index 0000000000..aa2017d496
+ return;
+ }
+
-+ if (migrate_use_block()) {
++ if (migrate_block()) {
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR,
+ "Block migration and snapshots are incompatible");
+ return;
@@ -538,7 +536,7 @@ index 0000000000..aa2017d496
+ * here (blocking main thread, from QMP) to avoid race conditions.
+ */
+ migrate_init(ms);
-+ memset(&ram_counters, 0, sizeof(ram_counters));
++ memset(&mig_stats, 0, sizeof(mig_stats));
+ memset(&compression_counters, 0, sizeof(compression_counters));
+ ms->to_dst_file = snap_state.file;
+
@@ -730,12 +728,12 @@ index 6c559b48c8..91be698308 100644
+ }
+}
diff --git a/qapi/migration.json b/qapi/migration.json
-index c84fa10e86..1702b92553 100644
+index 8843e74b59..aca0ca1ac1 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
-@@ -261,6 +261,40 @@
- '*compression': 'CompressionStats',
- '*socket-address': ['SocketAddress'] } }
+@@ -291,6 +291,40 @@
+ '*dirty-limit-throttle-time-per-round': 'uint64',
+ '*dirty-limit-ring-full-time': 'uint64'} }
+##
+# @SaveVMInfo:
@@ -775,10 +773,10 @@ index c84fa10e86..1702b92553 100644
# @query-migrate:
#
diff --git a/qapi/misc.json b/qapi/misc.json
-index 6ddd16ea28..e5681ae8a2 100644
+index cda2effa81..94a58bb0bf 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
-@@ -469,6 +469,22 @@
+@@ -456,6 +456,22 @@
##
{ 'command': 'query-fdsets', 'returns': ['FdsetInfo'] }
@@ -802,10 +800,10 @@ index 6ddd16ea28..e5681ae8a2 100644
# @CommandLineParameterType:
#
diff --git a/qemu-options.hx b/qemu-options.hx
-index fdddfab6ff..fdd551c2bb 100644
+index b56f6b2fb2..c8c78c92d4 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
-@@ -4398,6 +4398,18 @@ SRST
+@@ -4479,6 +4479,18 @@ SRST
Start right away with a saved state (``loadvm`` in monitor)
ERST
@@ -825,7 +823,7 @@ index fdddfab6ff..fdd551c2bb 100644
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
"-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
diff --git a/softmmu/vl.c b/softmmu/vl.c
-index ea20b23e4c..0eabc71b68 100644
+index b0b96f67fa..f3251de3e7 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -164,6 +164,7 @@ static const char *accelerators;
@@ -836,7 +834,7 @@ index ea20b23e4c..0eabc71b68 100644
static QTAILQ_HEAD(, ObjectOption) object_opts = QTAILQ_HEAD_INITIALIZER(object_opts);
static QTAILQ_HEAD(, DeviceOption) device_opts = QTAILQ_HEAD_INITIALIZER(device_opts);
static int display_remote;
-@@ -2612,6 +2613,12 @@ void qmp_x_exit_preconfig(Error **errp)
+@@ -2643,6 +2644,12 @@ void qmp_x_exit_preconfig(Error **errp)
if (loadvm) {
load_snapshot(loadvm, NULL, false, NULL, &error_fatal);
@@ -849,7 +847,7 @@ index ea20b23e4c..0eabc71b68 100644
}
if (replay_mode != REPLAY_MODE_NONE) {
replay_vmstate_init();
-@@ -3159,6 +3166,9 @@ void qemu_init(int argc, char **argv)
+@@ -3190,6 +3197,9 @@ void qemu_init(int argc, char **argv)
case QEMU_OPTION_loadvm:
loadvm = optarg;
break;
diff --git a/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch
index f5f6f7b..c946137 100644
--- a/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch
+++ b/debian/patches/pve/0018-PVE-add-optional-buffer-size-to-QEMUFile.patch
@@ -19,11 +19,11 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
3 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
-index 102ab3b439..5ced17aba4 100644
+index 19c33c9985..e9ffff0f0a 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
-@@ -31,8 +31,8 @@
- #include "trace.h"
+@@ -33,8 +33,8 @@
+ #include "options.h"
#include "qapi/error.h"
-#define IO_BUF_SIZE 32768
@@ -33,7 +33,7 @@ index 102ab3b439..5ced17aba4 100644
struct QEMUFile {
const QEMUFileHooks *hooks;
-@@ -55,7 +55,8 @@ struct QEMUFile {
+@@ -46,7 +46,8 @@ struct QEMUFile {
int buf_index;
int buf_size; /* 0 when writing */
@@ -43,8 +43,8 @@ index 102ab3b439..5ced17aba4 100644
DECLARE_BITMAP(may_free, MAX_IOV_SIZE);
struct iovec iov[MAX_IOV_SIZE];
-@@ -127,7 +128,9 @@ bool qemu_file_mode_is_not_valid(const char *mode)
- return false;
+@@ -100,7 +101,9 @@ int qemu_file_shutdown(QEMUFile *f)
+ return 0;
}
-static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
@@ -54,7 +54,7 @@ index 102ab3b439..5ced17aba4 100644
{
QEMUFile *f;
-@@ -136,6 +139,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
+@@ -109,6 +112,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
object_ref(ioc);
f->ioc = ioc;
f->is_writable = is_writable;
@@ -63,7 +63,7 @@ index 102ab3b439..5ced17aba4 100644
return f;
}
-@@ -146,17 +151,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
+@@ -119,17 +124,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
*/
QEMUFile *qemu_file_get_return_path(QEMUFile *f)
{
@@ -94,7 +94,7 @@ index 102ab3b439..5ced17aba4 100644
}
void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks)
-@@ -414,7 +429,7 @@ static ssize_t qemu_fill_buffer(QEMUFile *f)
+@@ -375,7 +390,7 @@ static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f)
do {
len = qio_channel_read(f->ioc,
(char *)f->buf + pending,
@@ -103,7 +103,7 @@ index 102ab3b439..5ced17aba4 100644
&local_error);
if (len == QIO_CHANNEL_ERR_BLOCK) {
if (qemu_in_coroutine()) {
-@@ -464,6 +479,8 @@ int qemu_fclose(QEMUFile *f)
+@@ -425,6 +440,8 @@ int qemu_fclose(QEMUFile *f)
}
g_clear_pointer(&f->ioc, object_unref);
@@ -112,7 +112,7 @@ index 102ab3b439..5ced17aba4 100644
/* If any error was spotted before closing, we should report it
* instead of the close() return value.
*/
-@@ -518,7 +535,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len)
+@@ -479,7 +496,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len)
{
if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) {
f->buf_index += len;
@@ -121,7 +121,7 @@ index 102ab3b439..5ced17aba4 100644
qemu_fflush(f);
}
}
-@@ -544,7 +561,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size)
+@@ -504,7 +521,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size)
}
while (size > 0) {
@@ -130,7 +130,7 @@ index 102ab3b439..5ced17aba4 100644
if (l > size) {
l = size;
}
-@@ -591,8 +608,8 @@ size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset)
+@@ -549,8 +566,8 @@ size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t si
size_t index;
assert(!qemu_file_is_writable(f));
@@ -141,7 +141,7 @@ index 102ab3b439..5ced17aba4 100644
/* The 1st byte to read from */
index = f->buf_index + offset;
-@@ -642,7 +659,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size)
+@@ -600,7 +617,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
size_t res;
uint8_t *src;
@@ -150,16 +150,16 @@ index 102ab3b439..5ced17aba4 100644
if (res == 0) {
return done;
}
-@@ -676,7 +693,7 @@ size_t qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size)
+@@ -634,7 +651,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
*/
- size_t qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size)
+ size_t coroutine_mixed_fn qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size)
{
- if (size < IO_BUF_SIZE) {
+ if (size < f->buf_allocated_size) {
size_t res;
uint8_t *src = NULL;
-@@ -701,7 +718,7 @@ int qemu_peek_byte(QEMUFile *f, int offset)
+@@ -659,7 +676,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset)
int index = f->buf_index + offset;
assert(!qemu_file_is_writable(f));
@@ -168,7 +168,7 @@ index 102ab3b439..5ced17aba4 100644
if (index >= f->buf_size) {
qemu_fill_buffer(f);
-@@ -853,7 +870,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len,
+@@ -777,7 +794,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len,
ssize_t qemu_put_compression_data(QEMUFile *f, z_stream *stream,
const uint8_t *p, size_t size)
{
@@ -178,7 +178,7 @@ index 102ab3b439..5ced17aba4 100644
if (blen < compressBound(size)) {
return -1;
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
-index 9d0155a2a1..cc06240e8d 100644
+index 47015f5201..1312b7c903 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -63,7 +63,9 @@ typedef struct QEMUFileHooks {
@@ -192,10 +192,10 @@ index 9d0155a2a1..cc06240e8d 100644
int qemu_fclose(QEMUFile *f);
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
-index aa2017d496..b97f2c4f14 100644
+index e9fc18fb10..80624fada8 100644
--- a/migration/savevm-async.c
+++ b/migration/savevm-async.c
-@@ -380,7 +380,7 @@ void qmp_savevm_start(const char *statefile, Error **errp)
+@@ -378,7 +378,7 @@ void qmp_savevm_start(const char *statefile, Error **errp)
QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target,
&snap_state.bs_pos));
@@ -204,7 +204,7 @@ index aa2017d496..b97f2c4f14 100644
if (!snap_state.file) {
error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile);
-@@ -498,7 +498,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp)
+@@ -496,7 +496,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp)
blk_op_block_all(be, blocker);
/* restore the VM state */
diff --git a/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch
index 39264ee..1cb8166 100644
--- a/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch
+++ b/debian/patches/pve/0019-PVE-block-add-the-zeroinit-block-driver-filter.patch
@@ -13,17 +13,17 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
create mode 100644 block/zeroinit.c
diff --git a/block/meson.build b/block/meson.build
-index 382bec0e7d..253fe49fa2 100644
+index 529fc172c6..1833c71ce9 100644
--- a/block/meson.build
+++ b/block/meson.build
-@@ -44,6 +44,7 @@ block_ss.add(files(
- 'vmdk.c',
- 'vpc.c',
+@@ -40,6 +40,7 @@ block_ss.add(files(
+ 'throttle-groups.c',
+ 'throttle.c',
'write-threshold.c',
+ 'zeroinit.c',
), zstd, zlib, gnutls)
- softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
+ system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
diff --git a/block/zeroinit.c b/block/zeroinit.c
new file mode 100644
index 0000000000..1257342724
diff --git a/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch
index 2c44e34..5327c11 100644
--- a/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch
+++ b/debian/patches/pve/0020-PVE-Add-dummy-id-command-line-parameter.patch
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 files changed, 11 insertions(+)
diff --git a/qemu-options.hx b/qemu-options.hx
-index fdd551c2bb..4eb43b7bc5 100644
+index c8c78c92d4..20ca2cdba7 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
-@@ -1162,6 +1162,9 @@ legacy PC, they are not recommended for modern configurations.
+@@ -1197,6 +1197,9 @@ legacy PC, they are not recommended for modern configurations.
ERST
@@ -28,10 +28,10 @@ index fdd551c2bb..4eb43b7bc5 100644
"-fda/-fdb file use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
diff --git a/softmmu/vl.c b/softmmu/vl.c
-index 0eabc71b68..323f6a23d4 100644
+index f3251de3e7..1b63ffd33d 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
-@@ -2648,6 +2648,7 @@ void qemu_init(int argc, char **argv)
+@@ -2679,6 +2679,7 @@ void qemu_init(int argc, char **argv)
MachineClass *machine_class;
bool userconfig = true;
FILE *vmstate_dump_file = NULL;
@@ -39,7 +39,7 @@ index 0eabc71b68..323f6a23d4 100644
qemu_add_opts(&qemu_drive_opts);
qemu_add_drive_opts(&qemu_legacy_drive_opts);
-@@ -3271,6 +3272,13 @@ void qemu_init(int argc, char **argv)
+@@ -3302,6 +3303,13 @@ void qemu_init(int argc, char **argv)
machine_parse_property_opt(qemu_find_opts("smp-opts"),
"smp", optarg);
break;
diff --git a/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch b/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
index e9e9f12..766c4f9 100644
--- a/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
+++ b/debian/patches/pve/0022-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
@@ -13,10 +13,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
-index 9681bd0434..044890822d 100644
+index 0db366a851..46f1ee38ae 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
-@@ -2483,6 +2483,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -2870,6 +2870,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
int fd;
uint64_t perm, shared;
int result = 0;
@@ -24,7 +24,7 @@ index 9681bd0434..044890822d 100644
/* Validate options and set default values */
assert(options->driver == BLOCKDEV_DRIVER_FILE);
-@@ -2523,19 +2524,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -2910,19 +2911,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
@@ -59,7 +59,7 @@ index 9681bd0434..044890822d 100644
}
/* Clear the file by truncating it to 0 */
-@@ -2589,13 +2593,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -2976,13 +2980,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
}
out_unlock:
@@ -82,7 +82,7 @@ index 9681bd0434..044890822d 100644
}
out_close:
-@@ -2619,6 +2625,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3006,6 +3012,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
PreallocMode prealloc;
char *buf = NULL;
Error *local_err = NULL;
@@ -90,7 +90,7 @@ index 9681bd0434..044890822d 100644
/* Skip file: protocol prefix */
strstart(filename, "file:", &filename);
-@@ -2641,6 +2648,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3028,6 +3035,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
return -EINVAL;
}
@@ -109,7 +109,7 @@ index 9681bd0434..044890822d 100644
options = (BlockdevCreateOptions) {
.driver = BLOCKDEV_DRIVER_FILE,
.u.file = {
-@@ -2652,6 +2671,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3039,6 +3058,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
.nocow = nocow,
.has_extent_size_hint = has_extent_size_hint,
.extent_size_hint = extent_size_hint,
@@ -119,10 +119,10 @@ index 9681bd0434..044890822d 100644
};
return raw_co_create(&options, errp);
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 3c945c1f93..542add004b 100644
+index 903392cb8f..125aa89858 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -4740,7 +4740,8 @@
+@@ -4876,7 +4876,8 @@
'size': 'size',
'*preallocation': 'PreallocMode',
'*nocow': 'bool',
diff --git a/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch b/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch
index 9abde33..e2f16af 100644
--- a/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch
+++ b/debian/patches/pve/0023-PVE-monitor-disable-oob-capability.patch
@@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/monitor/qmp.c b/monitor/qmp.c
-index 6b8cfcf6d8..3ec67e32d3 100644
+index c15bf1e1fc..04fe25c62c 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
-@@ -519,8 +519,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)
+@@ -553,8 +553,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)
qemu_chr_fe_set_echo(&mon->common.chr, true);
/* Note: we run QMP monitor in I/O thread when @chr supports that */
diff --git a/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch b/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch
index 79008ee..277fa3f 100644
--- a/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch
+++ b/debian/patches/pve/0024-PVE-Compat-4.0-used-balloon-qemu-4-0-config-size-fal.patch
@@ -26,10 +26,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/core/machine.c b/hw/core/machine.c
-index 2f6ccf5623..a5927e92f1 100644
+index f0d35c6401..1427983543 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
-@@ -142,7 +142,8 @@ GlobalProperty hw_compat_4_0[] = {
+@@ -148,7 +148,8 @@ GlobalProperty hw_compat_4_0[] = {
{ "virtio-vga", "edid", "false" },
{ "virtio-gpu-device", "edid", "false" },
{ "virtio-device", "use-started", "false" },
diff --git a/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch
index d88d1d0..5ec00c1 100644
--- a/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch
+++ b/debian/patches/pve/0025-PVE-Allow-version-code-in-machine-type.patch
@@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
4 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
-index 24595f618c..ee9cb0cd04 100644
+index 40821e2317..ee93ddd69a 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
-@@ -107,6 +107,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
+@@ -95,6 +95,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) {
info->has_is_current = true;
info->is_current = true;
@@ -37,10 +37,10 @@ index 24595f618c..ee9cb0cd04 100644
if (mc->default_cpu_type) {
diff --git a/include/hw/boards.h b/include/hw/boards.h
-index 6fbbfd56c8..61a526e97d 100644
+index ed83360198..f8b88cd86a 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
-@@ -232,6 +232,8 @@ struct MachineClass {
+@@ -235,6 +235,8 @@ struct MachineClass {
const char *desc;
const char *deprecation_reason;
@@ -50,10 +50,10 @@ index 6fbbfd56c8..61a526e97d 100644
void (*reset)(MachineState *state, ShutdownCause reason);
void (*wakeup)(MachineState *state);
diff --git a/qapi/machine.json b/qapi/machine.json
-index c904280085..47f3facdb2 100644
+index fbb61f18e4..7da3c519ba 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -159,6 +159,8 @@
+@@ -161,6 +161,8 @@
#
# @acpi: machine type supports ACPI (since 8.0)
#
@@ -62,7 +62,7 @@ index c904280085..47f3facdb2 100644
# Since: 1.2
##
{ 'struct': 'MachineInfo',
-@@ -166,7 +168,7 @@
+@@ -168,7 +170,7 @@
'*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int',
'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool',
'deprecated': 'bool', '*default-cpu-type': 'str',
@@ -72,10 +72,10 @@ index c904280085..47f3facdb2 100644
##
# @query-machines:
diff --git a/softmmu/vl.c b/softmmu/vl.c
-index 323f6a23d4..25abdc9da7 100644
+index 1b63ffd33d..20ba2c5c87 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
-@@ -1578,6 +1578,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv,
+@@ -1597,6 +1597,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv,
static MachineClass *select_machine(QDict *qdict, Error **errp)
{
const char *optarg = qdict_get_try_str(qdict, "type");
@@ -83,7 +83,7 @@ index 323f6a23d4..25abdc9da7 100644
GSList *machines = object_class_get_list(TYPE_MACHINE, false);
MachineClass *machine_class;
Error *local_err = NULL;
-@@ -1595,6 +1596,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
+@@ -1614,6 +1615,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
}
}
@@ -95,7 +95,7 @@ index 323f6a23d4..25abdc9da7 100644
g_slist_free(machines);
if (local_err) {
error_append_hint(&local_err, "Use -machine help to list supported machines\n");
-@@ -3213,12 +3219,31 @@ void qemu_init(int argc, char **argv)
+@@ -3244,12 +3250,31 @@ void qemu_init(int argc, char **argv)
case QEMU_OPTION_machine:
{
bool help;
diff --git a/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch
index 857d22d..f42a06f 100644
--- a/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch
+++ b/debian/patches/pve/0027-PVE-Backup-add-vma-backup-format-code.patch
@@ -26,23 +26,23 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
create mode 100644 vma.h
diff --git a/block/meson.build b/block/meson.build
-index 253fe49fa2..744b698a82 100644
+index 1833c71ce9..59b71ba9f3 100644
--- a/block/meson.build
+++ b/block/meson.build
-@@ -47,6 +47,8 @@ block_ss.add(files(
+@@ -43,6 +43,8 @@ block_ss.add(files(
'zeroinit.c',
), zstd, zlib, gnutls)
+block_ss.add(files('../vma-writer.c'), libuuid)
+
- softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
- softmmu_ss.add(files('block-ram-registrar.c'))
+ system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
+ system_ss.add(files('block-ram-registrar.c'))
diff --git a/meson.build b/meson.build
-index 30447cfaef..38a4e2bcef 100644
+index a9c4f28247..cd95530d3b 100644
--- a/meson.build
+++ b/meson.build
-@@ -1527,6 +1527,8 @@ keyutils = dependency('libkeyutils', required: false,
+@@ -1778,6 +1778,8 @@ endif
has_gettid = cc.has_function('gettid')
@@ -51,7 +51,7 @@ index 30447cfaef..38a4e2bcef 100644
# libselinux
selinux = dependency('libselinux',
required: get_option('selinux'),
-@@ -3650,6 +3652,9 @@ if have_tools
+@@ -3908,6 +3910,9 @@ if have_tools
dependencies: [blockdev, qemuutil, gnutls, selinux],
install: true)
@@ -936,7 +936,7 @@ index 0000000000..81a891c6b1
+
diff --git a/vma-writer.c b/vma-writer.c
new file mode 100644
-index 0000000000..ac7da237d0
+index 0000000000..6b7af81cae
--- /dev/null
+++ b/vma-writer.c
@@ -0,0 +1,793 @@
@@ -1146,10 +1146,10 @@ index 0000000000..ac7da237d0
+{
+ assert(qemu_in_coroutine());
+ AioContext *ctx = qemu_get_current_aio_context();
-+ aio_set_fd_handler(ctx, fd, false, NULL, (IOHandler *)qemu_coroutine_enter,
-+ NULL, NULL, qemu_coroutine_self());
++ aio_set_fd_handler(ctx, fd, NULL, (IOHandler *)qemu_coroutine_enter, NULL,
++ NULL, qemu_coroutine_self());
+ qemu_coroutine_yield();
-+ aio_set_fd_handler(ctx, fd, false, NULL, NULL, NULL, NULL, NULL);
++ aio_set_fd_handler(ctx, fd, NULL, NULL, NULL, NULL, NULL);
+}
+
+static ssize_t coroutine_fn
diff --git a/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch
index cc4a679..0d7fd96 100644
--- a/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch
+++ b/debian/patches/pve/0028-PVE-Backup-add-backup-dump-block-driver.patch
@@ -243,7 +243,7 @@ index 39410dcf8d..af87fa6aa9 100644
if (perf->max_chunk && perf->max_chunk < cluster_size) {
error_setg(errp, "Required max-chunk (%" PRIi64 ") is less than backup "
diff --git a/block/meson.build b/block/meson.build
-index 744b698a82..f580f95395 100644
+index 59b71ba9f3..6fde9f7dcd 100644
--- a/block/meson.build
+++ b/block/meson.build
@@ -4,6 +4,7 @@ block_ss.add(files(
@@ -255,7 +255,7 @@ index 744b698a82..f580f95395 100644
'blkdebug.c',
'blklogwrites.c',
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
-index f01bb8b617..d7ffd1826e 100644
+index 74195c3004..0f2e1817ad 100644
--- a/include/block/block_int-common.h
+++ b/include/block/block_int-common.h
@@ -26,6 +26,7 @@
diff --git a/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch b/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch
index 7a4881b..b32c995 100644
--- a/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch
+++ b/debian/patches/pve/0030-PVE-Backup-Proxmox-backup-patches-for-QEMU.patch
@@ -84,30 +84,68 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
create jobs in a drained section]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
- block/meson.build | 5 +
- block/monitor/block-hmp-cmds.c | 39 ++
- blockdev.c | 1 +
- hmp-commands-info.hx | 14 +
- hmp-commands.hx | 29 +
- include/monitor/hmp.h | 3 +
- meson.build | 1 +
- monitor/hmp-cmds.c | 72 +++
- proxmox-backup-client.c | 146 +++++
- proxmox-backup-client.h | 60 ++
- pve-backup.c | 1067 ++++++++++++++++++++++++++++++++
- qapi/block-core.json | 229 +++++++
- qapi/common.json | 13 +
- qapi/machine.json | 15 +-
- 14 files changed, 1681 insertions(+), 13 deletions(-)
+ block/backup-dump.c | 10 +-
+ block/meson.build | 5 +
+ block/monitor/block-hmp-cmds.c | 39 ++
+ blockdev.c | 1 +
+ hmp-commands-info.hx | 14 +
+ hmp-commands.hx | 29 +
+ include/block/block_int-common.h | 2 +-
+ include/monitor/hmp.h | 3 +
+ meson.build | 1 +
+ monitor/hmp-cmds.c | 72 ++
+ proxmox-backup-client.c | 146 ++++
+ proxmox-backup-client.h | 60 ++
+ pve-backup.c | 1067 ++++++++++++++++++++++++++++++
+ qapi/block-core.json | 229 +++++++
+ qapi/common.json | 14 +
+ qapi/machine.json | 16 +-
+ 16 files changed, 1690 insertions(+), 18 deletions(-)
create mode 100644 proxmox-backup-client.c
create mode 100644 proxmox-backup-client.h
create mode 100644 pve-backup.c
+diff --git a/block/backup-dump.c b/block/backup-dump.c
+index 232a094426..e46abf1070 100644
+--- a/block/backup-dump.c
++++ b/block/backup-dump.c
+@@ -9,6 +9,8 @@
+ */
+
+ #include "qemu/osdep.h"
++
++#include "qapi/qmp/qdict.h"
+ #include "qom/object_interfaces.h"
+ #include "block/block_int.h"
+
+@@ -141,7 +143,7 @@ static void bdrv_backup_dump_init(void)
+ block_init(bdrv_backup_dump_init);
+
+
+-BlockDriverState *bdrv_backup_dump_create(
++BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
+ int dump_cb_block_size,
+ uint64_t byte_size,
+ BackupDumpFunc *dump_cb,
+@@ -149,9 +151,11 @@ BlockDriverState *bdrv_backup_dump_create(
+ Error **errp)
+ {
+ BDRVBackupDumpState *state;
+- BlockDriverState *bs = bdrv_new_open_driver(
+- &bdrv_backup_dump_drive, NULL, BDRV_O_RDWR, errp);
+
++ QDict *options = qdict_new();
++ qdict_put_str(options, "driver", "backup-dump-drive");
++
++ BlockDriverState *bs = bdrv_co_open(NULL, NULL, options, BDRV_O_RDWR, errp);
+ if (!bs) {
+ return NULL;
+ }
diff --git a/block/meson.build b/block/meson.build
-index f580f95395..5bcebb934b 100644
+index 6fde9f7dcd..6d468f89e5 100644
--- a/block/meson.build
+++ b/block/meson.build
-@@ -49,6 +49,11 @@ block_ss.add(files(
+@@ -45,6 +45,11 @@ block_ss.add(files(
), zstd, zlib, gnutls)
block_ss.add(files('../vma-writer.c'), libuuid)
@@ -117,8 +155,8 @@ index f580f95395..5bcebb934b 100644
+), libproxmox_backup_qemu)
+
- softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
- softmmu_ss.add(files('block-ram-registrar.c'))
+ system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
+ system_ss.add(files('block-ram-registrar.c'))
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
index ca2599de44..6efe28cef5 100644
--- a/block/monitor/block-hmp-cmds.c
@@ -167,7 +205,7 @@ index ca2599de44..6efe28cef5 100644
+ hmp_handle_error(mon, error);
+}
diff --git a/blockdev.c b/blockdev.c
-index bdae211a54..315a27fc09 100644
+index 060d86a65f..79c3575612 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -37,6 +37,7 @@
@@ -179,10 +217,10 @@ index bdae211a54..315a27fc09 100644
#include "monitor/monitor.h"
#include "qemu/error-report.h"
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
-index a166bff3d5..4b75966c2e 100644
+index 10fdd822e0..15937793c1 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
-@@ -486,6 +486,20 @@ SRST
+@@ -471,6 +471,20 @@ SRST
Show the current VM UUID.
ERST
@@ -204,7 +242,7 @@ index a166bff3d5..4b75966c2e 100644
{
.name = "usernet",
diff --git a/hmp-commands.hx b/hmp-commands.hx
-index d9f9f42d11..ddb9678dc3 100644
+index e352f86872..0c8b6725fb 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -101,6 +101,35 @@ ERST
@@ -243,8 +281,21 @@ index d9f9f42d11..ddb9678dc3 100644
ERST
{
+diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
+index 0f2e1817ad..0a0339eee4 100644
+--- a/include/block/block_int-common.h
++++ b/include/block/block_int-common.h
+@@ -63,7 +63,7 @@
+
+ typedef int BackupDumpFunc(void *opaque, uint64_t offset, uint64_t bytes, const void *buf);
+
+-BlockDriverState *bdrv_backup_dump_create(
++BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
+ int dump_cb_block_size,
+ uint64_t byte_size,
+ BackupDumpFunc *dump_cb,
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
-index fdf6b45fb8..e01b2201d8 100644
+index 7a7def7530..cba7afe70c 100644
--- a/include/monitor/hmp.h
+++ b/include/monitor/hmp.h
@@ -32,6 +32,7 @@ void hmp_info_savevm(Monitor *mon, const QDict *qdict);
@@ -265,10 +316,10 @@ index fdf6b45fb8..e01b2201d8 100644
void hmp_device_add(Monitor *mon, const QDict *qdict);
void hmp_device_del(Monitor *mon, const QDict *qdict);
diff --git a/meson.build b/meson.build
-index 38a4e2bcef..443b3238f9 100644
+index cd95530d3b..d53976d621 100644
--- a/meson.build
+++ b/meson.build
-@@ -1528,6 +1528,7 @@ keyutils = dependency('libkeyutils', required: false,
+@@ -1779,6 +1779,7 @@ endif
has_gettid = cc.has_function('gettid')
libuuid = cc.find_library('uuid', required: true)
@@ -586,7 +637,7 @@ index 0000000000..8cbf645b2c
+#endif /* PROXMOX_BACKUP_CLIENT_H */
diff --git a/pve-backup.c b/pve-backup.c
new file mode 100644
-index 0000000000..21441b2f97
+index 0000000000..d84d807654
--- /dev/null
+++ b/pve-backup.c
@@ -0,0 +1,1067 @@
@@ -1394,7 +1445,7 @@ index 0000000000..21441b2f97
+ goto err_mutex;
+ }
+
-+ if (!(di->target = bdrv_backup_dump_create(dump_cb_block_size, di->size, pvebackup_co_dump_pbs_cb, di, errp))) {
++ if (!(di->target = bdrv_co_backup_dump_create(dump_cb_block_size, di->size, pvebackup_co_dump_pbs_cb, di, errp))) {
+ goto err_mutex;
+ }
+
@@ -1422,7 +1473,7 @@ index 0000000000..21441b2f97
+ PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
+ l = g_list_next(l);
+
-+ if (!(di->target = bdrv_backup_dump_create(VMA_CLUSTER_SIZE, di->size, pvebackup_co_dump_vma_cb, di, errp))) {
++ if (!(di->target = bdrv_co_backup_dump_create(VMA_CLUSTER_SIZE, di->size, pvebackup_co_dump_vma_cb, di, errp))) {
+ goto err_mutex;
+ }
+
@@ -1658,10 +1709,10 @@ index 0000000000..21441b2f97
+ return ret;
+}
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 542add004b..985859ddee 100644
+index 125aa89858..331c8336d1 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -835,6 +835,235 @@
+@@ -839,6 +839,235 @@
{ 'command': 'query-block', 'returns': ['BlockInfo'],
'allow-preconfig': true }
@@ -1898,10 +1949,10 @@ index 542add004b..985859ddee 100644
# @BlockDeviceTimedStats:
#
diff --git a/qapi/common.json b/qapi/common.json
-index 356db3f670..aae8a3b682 100644
+index 6fed9cde1a..630a2a8f9a 100644
--- a/qapi/common.json
+++ b/qapi/common.json
-@@ -206,3 +206,16 @@
+@@ -207,3 +207,17 @@
##
{ 'struct': 'HumanReadableText',
'data': { 'human-readable-text': 'str' } }
@@ -1915,11 +1966,12 @@ index 356db3f670..aae8a3b682 100644
+#
+# Since: 0.14.0
+#
-+# Notes: If no UUID was specified for the guest, a null UUID is returned.
++# Notes: If no UUID was specified for the guest, a null UUID is
++# returned.
+##
+{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
diff --git a/qapi/machine.json b/qapi/machine.json
-index 47f3facdb2..46760978ae 100644
+index 7da3c519ba..888457f810 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -4,6 +4,8 @@
@@ -1931,7 +1983,7 @@ index 47f3facdb2..46760978ae 100644
##
# = Machines
##
-@@ -228,19 +230,6 @@
+@@ -230,20 +232,6 @@
##
{ 'command': 'query-target', 'returns': 'TargetInfo' }
@@ -1944,7 +1996,8 @@ index 47f3facdb2..46760978ae 100644
-#
-# Since: 0.14
-#
--# Notes: If no UUID was specified for the guest, a null UUID is returned.
+-# Notes: If no UUID was specified for the guest, a null UUID is
+-# returned.
-##
-{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
-
diff --git a/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch b/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch
index da798b9..2d35795 100644
--- a/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch
+++ b/debian/patches/pve/0031-PVE-Backup-pbs-restore-new-command-to-restore-from-p.patch
@@ -14,10 +14,10 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
create mode 100644 pbs-restore.c
diff --git a/meson.build b/meson.build
-index 443b3238f9..32ab849ce6 100644
+index d53976d621..c3330310d9 100644
--- a/meson.build
+++ b/meson.build
-@@ -3656,6 +3656,10 @@ if have_tools
+@@ -3914,6 +3914,10 @@ if have_tools
vma = executable('vma', files('vma.c', 'vma-reader.c') + genh,
dependencies: [authz, block, crypto, io, qom], install: true)
diff --git a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch b/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
index 102cfcf..5657376 100644
--- a/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
+++ b/debian/patches/pve/0032-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch
@@ -24,10 +24,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
create mode 100644 block/pbs.c
diff --git a/block/meson.build b/block/meson.build
-index 5bcebb934b..eece0d5743 100644
+index 6d468f89e5..becc99ac4e 100644
--- a/block/meson.build
+++ b/block/meson.build
-@@ -54,6 +54,9 @@ block_ss.add(files(
+@@ -50,6 +50,9 @@ block_ss.add(files(
'../pve-backup.c',
), libproxmox_backup_qemu)
@@ -35,8 +35,8 @@ index 5bcebb934b..eece0d5743 100644
+block_ss.add(when: 'CONFIG_PBS_BDRV', if_true: libproxmox_backup_qemu)
+
- softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
- softmmu_ss.add(files('block-ram-registrar.c'))
+ system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
+ system_ss.add(files('block-ram-registrar.c'))
diff --git a/block/pbs.c b/block/pbs.c
new file mode 100644
index 0000000000..a2211e0f3b
@@ -349,40 +349,40 @@ index 0000000000..a2211e0f3b
+
+block_init(bdrv_pbs_init);
diff --git a/configure b/configure
-index a62a3e6be9..1ac0feb46b 100755
+index 133f4e3235..f5a830c1f3 100755
--- a/configure
+++ b/configure
-@@ -288,6 +288,7 @@ linux_user=""
+@@ -256,6 +256,7 @@ qemu_suffix="qemu"
+ softmmu="yes"
+ linux_user=""
bsd_user=""
- pie=""
- coroutine=""
+pbs_bdrv="yes"
plugins="$default_feature"
- meson=""
ninja=""
-@@ -873,6 +874,10 @@ for opt do
+ python=
+@@ -809,6 +810,10 @@ for opt do
;;
- --with-coroutine=*) coroutine="$optarg"
+ --enable-download) download="enabled"; git_submodules_action=update;
;;
+ --disable-pbs-bdrv) pbs_bdrv="no"
+ ;;
+ --enable-pbs-bdrv) pbs_bdrv="yes"
+ ;;
- --with-git=*) git="$optarg"
- ;;
- --with-git-submodules=*)
-@@ -1049,6 +1054,7 @@ cat << EOF
- debug-info debugging information
- safe-stack SafeStack Stack Smash Protection. Depends on
- clang/llvm and requires coroutine backend ucontext.
+ --enable-plugins) if test "$mingw32" = "yes"; then
+ error_exit "TCG plugins not currently supported on Windows platforms"
+ else
+@@ -959,6 +964,7 @@ cat << EOF
+ bsd-user all BSD usermode emulation targets
+ pie Position Independent Executables
+ debug-tcg TCG debugging (default is disabled)
+ pbs-bdrv Proxmox backup server read-only block driver support
NOTE: The object files are built at the place where configure is launched
EOF
-@@ -2386,6 +2392,9 @@ echo "TARGET_DIRS=$target_list" >> $config_host_mak
- if test "$modules" = "yes"; then
- echo "CONFIG_MODULES=y" >> $config_host_mak
+@@ -1744,6 +1750,9 @@ if test "$solaris" = "yes" ; then
fi
+ echo "SRC_PATH=$source_path" >> $config_host_mak
+ echo "TARGET_DIRS=$target_list" >> $config_host_mak
+if test "$pbs_bdrv" = "yes" ; then
+ echo "CONFIG_PBS_BDRV=y" >> $config_host_mak
+fi
@@ -390,10 +390,10 @@ index a62a3e6be9..1ac0feb46b 100755
# XXX: suppress that
if [ "$bsd" = "yes" ] ; then
diff --git a/meson.build b/meson.build
-index 32ab849ce6..69afe3441b 100644
+index c3330310d9..cbfc9a43fb 100644
--- a/meson.build
+++ b/meson.build
-@@ -4041,7 +4041,7 @@ summary_info += {'bzip2 support': libbzip2}
+@@ -4319,7 +4319,7 @@ summary_info += {'bzip2 support': libbzip2}
summary_info += {'lzfse support': liblzfse}
summary_info += {'zstd support': zstd}
summary_info += {'NUMA host support': numa}
@@ -403,10 +403,10 @@ index 32ab849ce6..69afe3441b 100644
summary_info += {'libdaxctl support': libdaxctl}
summary_info += {'libudev': libudev}
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 985859ddee..d601fb4ab2 100644
+index 331c8336d1..a818d5f90f 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -3304,6 +3304,7 @@
+@@ -3396,6 +3396,7 @@
'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum',
'raw', 'rbd',
{ 'name': 'replication', 'if': 'CONFIG_REPLICATION' },
@@ -414,7 +414,7 @@ index 985859ddee..d601fb4ab2 100644
'ssh', 'throttle', 'vdi', 'vhdx',
{ 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' },
{ 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' },
-@@ -3380,6 +3381,17 @@
+@@ -3482,6 +3483,17 @@
{ 'struct': 'BlockdevOptionsNull',
'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } }
@@ -432,7 +432,7 @@ index 985859ddee..d601fb4ab2 100644
##
# @BlockdevOptionsNVMe:
#
-@@ -4753,6 +4765,7 @@
+@@ -4886,6 +4898,7 @@
'nfs': 'BlockdevOptionsNfs',
'null-aio': 'BlockdevOptionsNull',
'null-co': 'BlockdevOptionsNull',
diff --git a/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch b/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch
index 147951c..2a5b43e 100644
--- a/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch
+++ b/debian/patches/pve/0033-PVE-redirect-stderr-to-journal-when-daemonized.patch
@@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/meson.build b/meson.build
-index 69afe3441b..b2e9b2aec7 100644
+index cbfc9a43fb..8206270272 100644
--- a/meson.build
+++ b/meson.build
-@@ -1528,6 +1528,7 @@ keyutils = dependency('libkeyutils', required: false,
+@@ -1779,6 +1779,7 @@ endif
has_gettid = cc.has_function('gettid')
libuuid = cc.find_library('uuid', required: true)
@@ -25,16 +25,16 @@ index 69afe3441b..b2e9b2aec7 100644
libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true)
# libselinux
-@@ -3144,6 +3145,7 @@ if have_block
+@@ -3406,6 +3407,7 @@ if have_block
# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
# os-win32.c does not
blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
+ blockdev_ss.add(when: 'CONFIG_POSIX', if_true: libsystemd)
- softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
+ system_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
endif
diff --git a/os-posix.c b/os-posix.c
-index 90ea71725f..33745a8c22 100644
+index cfcb96533c..fb2ad87009 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -28,6 +28,8 @@
@@ -46,7 +46,7 @@ index 90ea71725f..33745a8c22 100644
/* Needed early for CONFIG_BSD etc. */
#include "net/slirp.h"
-@@ -301,9 +303,10 @@ void os_setup_post(void)
+@@ -310,9 +312,10 @@ void os_setup_post(void)
dup2(fd, 0);
dup2(fd, 1);
diff --git a/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch b/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch
index 6da71b7..f6cd3c3 100644
--- a/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch
+++ b/debian/patches/pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch
@@ -26,7 +26,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
create mode 100644 migration/pbs-state.c
diff --git a/include/migration/misc.h b/include/migration/misc.h
-index 8b49841016..78f63ca400 100644
+index 7dcc0b5c2c..4c940b2475 100644
--- a/include/migration/misc.h
+++ b/include/migration/misc.h
@@ -77,4 +77,7 @@ bool migration_in_bg_snapshot(void);
@@ -38,25 +38,24 @@ index 8b49841016..78f63ca400 100644
+
#endif
diff --git a/migration/meson.build b/migration/meson.build
-index a7824b5266..de6a271b58 100644
+index 07f6057acc..343994d891 100644
--- a/migration/meson.build
+++ b/migration/meson.build
-@@ -6,8 +6,10 @@ migration_files = files(
+@@ -7,7 +7,9 @@ migration_files = files(
'vmstate.c',
'qemu-file.c',
'yank_functions.c',
+ 'pbs-state.c',
)
- softmmu_ss.add(migration_files)
-+softmmu_ss.add(libproxmox_backup_qemu)
++system_ss.add(libproxmox_backup_qemu)
- softmmu_ss.add(files(
+ system_ss.add(files(
'block-dirty-bitmap.c',
diff --git a/migration/migration.c b/migration/migration.c
-index 99f86bd6c2..db229e72c9 100644
+index 7a4c8beb5d..0a955a2a18 100644
--- a/migration/migration.c
+++ b/migration/migration.c
-@@ -245,6 +245,7 @@ void migration_object_init(void)
+@@ -162,6 +162,7 @@ void migration_object_init(void)
blk_mig_init();
ram_mig_init();
dirty_bitmap_mig_init();
@@ -175,7 +174,7 @@ index 0000000000..887e998b9e
+ NULL);
+}
diff --git a/pve-backup.c b/pve-backup.c
-index 21441b2f97..5e5c37e06d 100644
+index d84d807654..9c8b88d075 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -1060,6 +1060,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
@@ -187,10 +186,10 @@ index 21441b2f97..5e5c37e06d 100644
ret->pbs_masterkey = true;
ret->backup_max_workers = true;
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index d601fb4ab2..16be1e02ec 100644
+index a818d5f90f..48eb47c6ea 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -987,6 +987,11 @@
+@@ -991,6 +991,11 @@
# @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can
# safely be set for savevm-async.
#
@@ -202,7 +201,7 @@ index d601fb4ab2..16be1e02ec 100644
# @pbs-masterkey: True if the QMP backup call supports the 'master_keyfile'
# parameter.
#
-@@ -997,6 +1002,7 @@
+@@ -1001,6 +1006,7 @@
'data': { 'pbs-dirty-bitmap': 'bool',
'query-bitmap-info': 'bool',
'pbs-dirty-bitmap-savevm': 'bool',
diff --git a/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch b/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
index bd721fc..75f5c28 100644
--- a/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
+++ b/debian/patches/pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
@@ -19,10 +19,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
-index 7eaf498439..509f3df0a6 100644
+index e1ae3b7316..285dd1d148 100644
--- a/migration/block-dirty-bitmap.c
+++ b/migration/block-dirty-bitmap.c
-@@ -539,7 +539,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
+@@ -540,7 +540,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_DEFAULT, &local_err)) {
error_report_err(local_err);
diff --git a/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch b/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
index 0e50c93..f9fee14 100644
--- a/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
+++ b/debian/patches/pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
@@ -21,10 +21,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 30 insertions(+)
diff --git a/block/iscsi.c b/block/iscsi.c
-index 9fc0bed90b..1d40933165 100644
+index 34f97ab646..398782963d 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
-@@ -1392,12 +1392,42 @@ static char *get_initiator_name(QemuOpts *opts)
+@@ -1391,12 +1391,42 @@ static char *get_initiator_name(QemuOpts *opts)
const char *name;
char *iscsi_name;
UuidInfo *uuid_info;
diff --git a/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch b/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch
index 5707bee..28dd8d1 100644
--- a/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch
+++ b/debian/patches/pve/0037-PVE-block-stream-increase-chunk-size.patch
@@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/stream.c b/block/stream.c
-index 7f9e1ecdbb..6a29d80398 100644
+index e522bbdec5..afed72db55 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -27,7 +27,7 @@ enum {
diff --git a/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch b/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
index d1bd74d..0e43de5 100644
--- a/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
+++ b/debian/patches/pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
@@ -17,17 +17,17 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 4 insertions(+)
diff --git a/block/io.c b/block/io.c
-index 2e267a85ab..449a44bf20 100644
+index 055fcf7438..63f7b3ad3e 100644
--- a/block/io.c
+++ b/block/io.c
-@@ -1576,6 +1576,10 @@ static int bdrv_pad_request(BlockDriverState *bs,
- {
- int ret;
+@@ -1710,6 +1710,10 @@ static int bdrv_pad_request(BlockDriverState *bs,
+ int sliced_niov;
+ size_t sliced_head, sliced_tail;
+ if (!qiov) {
+ return 0;
+ }
+
- bdrv_check_qiov_request(*offset, *bytes, *qiov, *qiov_offset, &error_abort);
-
- if (!bdrv_init_padding(bs, *offset, *bytes, pad)) {
+ /* Should have been checked by the caller already */
+ ret = bdrv_check_request32(*offset, *bytes, *qiov, *qiov_offset);
+ if (ret < 0) {
diff --git a/debian/patches/pve/0039-block-add-alloc-track-driver.patch b/debian/patches/pve/0039-block-add-alloc-track-driver.patch
index 823be87..ea5f105 100644
--- a/debian/patches/pve/0039-block-add-alloc-track-driver.patch
+++ b/debian/patches/pve/0039-block-add-alloc-track-driver.patch
@@ -393,7 +393,7 @@ index 0000000000..b75d7c6460
+
+block_init(bdrv_alloc_track_init);
diff --git a/block/meson.build b/block/meson.build
-index eece0d5743..8a68162cc0 100644
+index becc99ac4e..0a69836593 100644
--- a/block/meson.build
+++ b/block/meson.build
@@ -2,6 +2,7 @@ block_ss.add(genh)
diff --git a/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch b/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch
index 04ef6cb..a7f6e4d 100644
--- a/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch
+++ b/debian/patches/pve/0044-migration-for-snapshots-hold-the-BQL-during-setup-ca.patch
@@ -52,7 +52,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
5 files changed, 38 insertions(+), 12 deletions(-)
diff --git a/include/migration/register.h b/include/migration/register.h
-index a8dfd8fefd..fa9b0b0f10 100644
+index 90914f32f5..c728fd9120 100644
--- a/include/migration/register.h
+++ b/include/migration/register.h
@@ -43,9 +43,9 @@ typedef struct SaveVMHandlers {
@@ -67,10 +67,10 @@ index a8dfd8fefd..fa9b0b0f10 100644
* must_precopy:
* - must be migrated in precopy or in stopped state
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
-index 509f3df0a6..42dc4a8d61 100644
+index 285dd1d148..f7ee5a74d9 100644
--- a/migration/block-dirty-bitmap.c
+++ b/migration/block-dirty-bitmap.c
-@@ -1220,10 +1220,17 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
+@@ -1219,10 +1219,17 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
{
DBMSaveState *s = &((DBMState *)opaque)->save;
SaveBitmapState *dbms = NULL;
@@ -90,7 +90,7 @@ index 509f3df0a6..42dc4a8d61 100644
return -1;
}
-@@ -1231,7 +1238,9 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
+@@ -1230,7 +1237,9 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque)
send_bitmap_start(f, s, dbms);
}
qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS);
@@ -102,10 +102,10 @@ index 509f3df0a6..42dc4a8d61 100644
}
diff --git a/migration/block.c b/migration/block.c
-index b2497bbd32..c9d55be642 100644
+index 86c2256a2b..8423e0c9f9 100644
--- a/migration/block.c
+++ b/migration/block.c
-@@ -716,21 +716,30 @@ static void block_migration_cleanup(void *opaque)
+@@ -725,21 +725,30 @@ static void block_migration_cleanup(void *opaque)
static int block_save_setup(QEMUFile *f, void *opaque)
{
int ret;
@@ -140,10 +140,10 @@ index b2497bbd32..c9d55be642 100644
if (ret) {
return ret;
diff --git a/migration/ram.c b/migration/ram.c
-index 79d881f735..0ecbbc3202 100644
+index 9040d66e61..01532c9fc9 100644
--- a/migration/ram.c
+++ b/migration/ram.c
-@@ -3117,8 +3117,16 @@ static void migration_bitmap_clear_discarded_pages(RAMState *rs)
+@@ -2895,8 +2895,16 @@ static void migration_bitmap_clear_discarded_pages(RAMState *rs)
static void ram_init_bitmaps(RAMState *rs)
{
@@ -162,7 +162,7 @@ index 79d881f735..0ecbbc3202 100644
qemu_mutex_lock_ramlist();
WITH_RCU_READ_LOCK_GUARD() {
-@@ -3130,7 +3138,9 @@ static void ram_init_bitmaps(RAMState *rs)
+@@ -2908,7 +2916,9 @@ static void ram_init_bitmaps(RAMState *rs)
}
}
qemu_mutex_unlock_ramlist();
@@ -174,11 +174,11 @@ index 79d881f735..0ecbbc3202 100644
/*
* After an eventual first bitmap sync, fixup the initial bitmap
diff --git a/migration/savevm.c b/migration/savevm.c
-index aa54a67fda..fc6a82a555 100644
+index a2cb8855e2..ea8b30a630 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
-@@ -1621,10 +1621,8 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
- memset(&compression_counters, 0, sizeof(compression_counters));
+@@ -1625,10 +1625,8 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
+ reset_vfio_bytes_transferred();
ms->to_dst_file = f;
- qemu_mutex_unlock_iothread();
diff --git a/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch b/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch
index f5fa200..3ff0bf7 100644
--- a/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch
+++ b/debian/patches/pve/0045-savevm-async-don-t-hold-BQL-during-setup.patch
@@ -13,10 +13,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
1 file changed, 2 deletions(-)
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
-index b97f2c4f14..87ea0573d3 100644
+index 80624fada8..b1d85a4b41 100644
--- a/migration/savevm-async.c
+++ b/migration/savevm-async.c
-@@ -403,10 +403,8 @@ void qmp_savevm_start(const char *statefile, Error **errp)
+@@ -401,10 +401,8 @@ void qmp_savevm_start(const char *statefile, Error **errp)
snap_state.state = SAVE_STATE_ACTIVE;
snap_state.finalize_bh = qemu_bh_new(process_savevm_finalize, &snap_state);
snap_state.co = qemu_coroutine_create(&process_savevm_co, NULL);
diff --git a/debian/patches/series b/debian/patches/series
index 996fa1f..01d4d3c 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,15 +1,8 @@
extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
-extra/0004-ui-return-NULL-when-getting-cursor-without-a-console.patch
-extra/0005-memory-prevent-dma-reentracy-issues.patch
-extra/0006-lsi53c895a-disable-reentrancy-detection-for-script-R.patch
-extra/0007-bcm2835_property-disable-reentrancy-detection-for-io.patch
-extra/0008-raven-disable-reentrancy-detection-for-iomem.patch
-extra/0009-apic-disable-reentrancy-detection-for-apic-msi.patch
-extra/0010-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
-extra/0011-vhost-fix-the-fd-leak.patch
-extra/0012-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
+extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
+extra/0005-hw-ide-reset-cancel-async-DMA-operation-before-reset.patch
bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
diff --git a/qemu b/qemu
index f7f686b..78385bc 160000
--- a/qemu
+++ b/qemu
@@ -1 +1 @@
-Subproject commit f7f686b61cf7ee142c9264d2e04ac2c6a96d37f8
+Subproject commit 78385bc738108a9b5b20e639520dc60425ca2a5a
--
2.39.2
next prev parent reply other threads:[~2023-10-17 12:10 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-17 12:10 [pve-devel] [PATCH-SERIES v3 qemu] update " Fiona Ebner
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 1/7] d/rules: use disable-download option instead of git-submodules=ignore Fiona Ebner
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 2/7] buildsys: fixup submodule target Fiona Ebner
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 3/7] buildsys: use QEMU's keycodemapdb again Fiona Ebner
2023-10-17 12:10 ` Fiona Ebner [this message]
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 5/7] add patch to disable graph locking Fiona Ebner
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 6/7] add patch to avoid huge snapshot performance regression Fiona Ebner
2023-10-17 12:10 ` [pve-devel] [PATCH v3 qemu 7/7] d/control: add versioned Breaks for qemu-server <= 8.0.6 Fiona Ebner
2023-10-25 11:21 ` [pve-devel] applied-series: [PATCH-SERIES v3 qemu] update to QEMU 8.1.2 Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231017121012.132636-5-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox