* [pve-devel] [PATCH qemu 4/5] update submodule and patches to QEMU 10.1.0
2025-09-24 14:47 [pve-devel] [PATCH qemu 0/5] QEMU 10.1.0 Fiona Ebner
` (2 preceding siblings ...)
2025-09-24 14:47 ` [pve-devel] [PATCH qemu 3/5] alloc-track/zeroinit: squash patches enabling using with blockdev into patches adding block drivers Fiona Ebner
@ 2025-09-24 14:47 ` Fiona Ebner
2025-09-24 14:47 ` [pve-devel] [PATCH qemu 5/5] stable fixes for " Fiona Ebner
4 siblings, 0 replies; 6+ messages in thread
From: Fiona Ebner @ 2025-09-24 14:47 UTC (permalink / raw)
To: pve-devel
Notable changes:
* Finally can drop RBD reverts for block-status callbacks:
https://gitlab.com/qemu-project/qemu/-/issues/1026
https://tracker.ceph.com/issues/63341
* dropped HPET reverts, see
https://lore.proxmox.com/pve-devel/20250924143611.166858-1-f.ebner@proxmox.com/T/
* PVE backup required adaptation, because of 3d3911f16b
("blockdev-backup: Add error handling option for copy-before-write
jobs"). It was kept as the default ON_CBW_ERROR_BREAK_GUEST_WRITE.
While this should be changed to ON_CBW_ERROR_BREAK_SNAPSHOT like is
done for fleecing, that requires more changes to actually detect
that error in the main backup loop. Otherwise, the backup would be
completed and corrupt! What is also missing compared to fleecing
and fixing those bugs for good is having a timeout.
* machine version checks required adaptation, because of f59ee04406
("include/hw/boards: cope with dev/rc versions in deprecation
checks") to not diverge even more from upstream. Remove the, now
superfluous, check for QEMU version >= 10.1 that should've been
for >= 10.0 actually, see commit "bump baseline machine version to
6.0 for Proxmox VE 9" for context.
* Context changes during rebase for bitmap mirror patches. Upstream
now already switched to passing the full mirror sync-mode 9474d97bd7
("mirror: Pass full sync mode rather than bool to internals") and
dropped a parameter 253b43a290 ("mirror: Drop redundant zero_target
parameter") and there were other smaller context changes.
Minor changes:
* Squash "block/zeroinit: support using as blockdev driver" and
"block/alloc-track: support using as blockdev driver" into the
respective commits adding the drivers.
* alloc-track required a minor adaptation, because of c33159dec7
("block: Expand block status mode from bool to flags"). The flags
are only hints and the change was motivated by detecting zeroes for
mirror targets, so no need to change the implementation in
alloc-track.
* The savevm-async IO channel class needed a signature update for the
init function, because of 12d1a768bd ("qom: Have class_init() take a
const data argument").
* The qemu-img patches adding isze and osize needed adaptation,
because of d7bd47bf84 ("qemu-img: extend cvtnum() and use it in more
places") Calls to cvtnum() need to indicate that the argument is to
be treated as a size. While at it, fix the passed-in name (was
"size" both times), which is used for error messages.
* Minor context changes during rebase for qemu-img dd patches and
savevm-async header.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
...d-support-for-sync-bitmap-mode-never.patch | 155 ++++------
...-support-for-conditional-and-always-.patch | 10 +-
...check-for-bitmap-mode-without-bitmap.patch | 4 +-
...-to-bdrv_dirty_bitmap_merge_internal.patch | 8 +-
.../0006-mirror-move-some-checks-to-qmp.patch | 12 +-
...race-with-clients-disconnecting-earl.patch | 4 +-
...k-file-change-locking-default-to-off.patch | 6 +-
...djust-network-script-path-to-etc-kvm.patch | 4 +-
...he-CPU-model-to-kvm64-32-instead-of-.patch | 6 +-
...ui-spice-default-to-pve-certificates.patch | 4 +-
...erfs-no-default-logfile-if-daemonize.patch | 2 +-
...lock-rbd-disable-rbd_cache_writethro.patch | 4 +-
...PVE-Up-glusterfs-allow-partial-reads.patch | 10 +-
...return-success-on-info-without-snaps.patch | 4 +-
...dd-add-osize-and-read-from-to-stdin-.patch | 19 +-
...E-Up-qemu-img-dd-add-isize-parameter.patch | 19 +-
...PVE-Up-qemu-img-dd-add-n-skip_create.patch | 25 +-
...-add-l-option-for-loading-a-snapshot.patch | 24 +-
...virtio-balloon-improve-query-balloon.patch | 12 +-
.../0014-PVE-qapi-modify-query-machines.patch | 10 +-
.../0015-PVE-qapi-modify-spice-query.patch | 10 +-
...nnel-implementation-for-savevm-async.patch | 6 +-
...async-for-background-state-snapshots.patch | 37 +--
...add-optional-buffer-size-to-QEMUFile.patch | 10 +-
...add-the-zeroinit-block-driver-filter.patch | 6 +-
...-Add-dummy-id-command-line-parameter.patch | 10 +-
...t-target-i386-disable-LINT0-after-re.patch | 2 +-
...le-posix-make-locking-optiono-on-cre.patch | 20 +-
...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 +-
...e-bcs-bitmap-initialization-to-job-c.patch | 4 +-
...VE-Backup-add-vma-backup-format-code.patch | 6 +-
...-Backup-add-backup-dump-block-driver.patch | 6 +-
...d-sequential-job-transaction-support.patch | 2 +-
...ckup-Proxmox-backup-patches-for-QEMU.patch | 47 +--
...estore-new-command-to-restore-from-p.patch | 4 +-
...k-driver-to-map-backup-archives-into.patch | 12 +-
...ct-stderr-to-journal-when-daemonized.patch | 10 +-
...igrate-dirty-bitmap-state-via-savevm.patch | 16 +-
...dirty-bitmap-migrate-other-bitmaps-e.patch | 2 +-
...all-back-to-open-iscsi-initiatorname.patch | 2 +-
...PVE-block-stream-increase-chunk-size.patch | 2 +-
.../0038-block-add-alloc-track-driver.patch | 16 +-
...0039-PVE-backup-add-fleecing-option.patch} | 32 +-
...-rbd-workaround-for-ceph-issue-53784.patch | 81 -----
...-fix-handling-of-holes-in-.bdrv_co_b.patch | 36 ---
...-version-deprecation-for-Proxmox-VE.patch} | 73 +++--
...-out-helper-to-clear-backup-state-s.patch} | 2 +-
...k-rbd-implement-bdrv_co_block_status.patch | 162 ----------
...-out-helper-to-initialize-backup-st.patch} | 2 +-
...ackup-add-target-ID-in-backup-state.patch} | 2 +-
...vice-info-allow-caller-to-specify-f.patch} | 2 +-
...void-timer-storms-on-periodic-timers.patch | 50 ----
...ent-backup-access-setup-and-teardow.patch} | 16 +-
...e-full-64-bit-target-value-of-the-co.patch | 202 -------------
...e-for-the-switch-to-using-blockdev-.patch} | 2 +-
...-hpet-accept-64-bit-reads-and-writes.patch | 281 ------------------
...e-read-only-bits-directly-in-new_val.patch | 64 ----
...e-migration-blocker-check-for-snaps.patch} | 10 +-
...et-remove-unnecessary-variable-index.patch | 68 -----
...re-high-bits-of-comparator-in-32-bit.patch | 40 ---
...and-cleanup-persistence-of-interrupt.patch | 120 --------
...de-child-references-in-block-device-.patch | 133 ---------
debian/patches/series | 29 +-
qemu | 2 +-
66 files changed, 387 insertions(+), 1624 deletions(-)
rename debian/patches/pve/{0042-PVE-backup-add-fleecing-option.patch => 0039-PVE-backup-add-fleecing-option.patch} (95%)
delete mode 100644 debian/patches/pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
delete mode 100644 debian/patches/pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
rename debian/patches/pve/{0043-adapt-machine-version-deprecation-for-Proxmox-VE.patch => 0040-adapt-machine-version-deprecation-for-Proxmox-VE.patch} (70%)
rename debian/patches/pve/{0051-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch => 0041-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch} (98%)
delete mode 100644 debian/patches/pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch
rename debian/patches/pve/{0052-PVE-backup-factor-out-helper-to-initialize-backup-st.patch => 0042-PVE-backup-factor-out-helper-to-initialize-backup-st.patch} (98%)
rename debian/patches/pve/{0053-PVE-backup-add-target-ID-in-backup-state.patch => 0043-PVE-backup-add-target-ID-in-backup-state.patch} (98%)
rename debian/patches/pve/{0054-PVE-backup-get-device-info-allow-caller-to-specify-f.patch => 0044-PVE-backup-get-device-info-allow-caller-to-specify-f.patch} (98%)
delete mode 100644 debian/patches/pve/0044-Revert-hpet-avoid-timer-storms-on-periodic-timers.patch
rename debian/patches/pve/{0055-PVE-backup-implement-backup-access-setup-and-teardow.patch => 0045-PVE-backup-implement-backup-access-setup-and-teardow.patch} (99%)
delete mode 100644 debian/patches/pve/0045-Revert-hpet-store-full-64-bit-target-value-of-the-co.patch
rename debian/patches/pve/{0056-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch => 0046-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch} (99%)
delete mode 100644 debian/patches/pve/0046-Revert-hpet-accept-64-bit-reads-and-writes.patch
delete mode 100644 debian/patches/pve/0047-Revert-hpet-place-read-only-bits-directly-in-new_val.patch
rename debian/patches/pve/{0058-savevm-async-reuse-migration-blocker-check-for-snaps.patch => 0047-savevm-async-reuse-migration-blocker-check-for-snaps.patch} (96%)
delete mode 100644 debian/patches/pve/0048-Revert-hpet-remove-unnecessary-variable-index.patch
delete mode 100644 debian/patches/pve/0049-Revert-hpet-ignore-high-bits-of-comparator-in-32-bit.patch
delete mode 100644 debian/patches/pve/0050-Revert-hpet-fix-and-cleanup-persistence-of-interrupt.patch
delete mode 100644 debian/patches/pve/0057-block-qapi-include-child-references-in-block-device-.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 ba25f6f..1a20886 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,49 +27,30 @@ 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 9.1.2]
+[FE: rebased for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
- block/mirror.c | 99 ++++++++++++++++++++------
- blockdev.c | 38 +++++++++-
+ block/mirror.c | 87 +++++++++++++++++++++-----
+ blockdev.c | 36 ++++++++++-
include/block/block_int-global-state.h | 4 +-
- qapi/block-core.json | 25 ++++++-
+ qapi/block-core.json | 25 +++++++-
tests/unit/test-block-iothread.c | 4 +-
- 5 files changed, 142 insertions(+), 28 deletions(-)
+ 5 files changed, 135 insertions(+), 21 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
-index a53582f17b..fafca1360e 100644
+index b344182c74..a184e91478 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -51,7 +51,7 @@ typedef struct MirrorBlockJob {
- BlockDriverState *to_replace;
- /* Used to block operations on the drive-mirror-replace target */
- Error *replace_blocker;
-- bool is_none_mode;
-+ MirrorSyncMode sync_mode;
- BlockMirrorBackingMode backing_mode;
- /* Whether the target image requires explicit zero-initialization */
- bool zero_target;
-@@ -73,6 +73,8 @@ typedef struct MirrorBlockJob {
- size_t buf_size;
+@@ -74,6 +74,8 @@ typedef struct MirrorBlockJob {
int64_t bdev_length;
unsigned long *cow_bitmap;
+ unsigned long *zero_bitmap;
+ BdrvDirtyBitmap *sync_bitmap;
+ BitmapSyncMode bitmap_mode;
BdrvDirtyBitmap *dirty_bitmap;
BdrvDirtyBitmapIter *dbi;
uint8_t *buf;
-@@ -723,7 +725,8 @@ static int mirror_exit_common(Job *job)
- &error_abort);
-
- if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
-- BlockDriverState *backing = s->is_none_mode ? src : s->base;
-+ BlockDriverState *backing;
-+ backing = s->sync_mode == MIRROR_SYNC_MODE_NONE ? src : s->base;
- BlockDriverState *unfiltered_target = bdrv_skip_filters(target_bs);
-
- if (bdrv_cow_bs(unfiltered_target) != backing) {
-@@ -824,6 +827,16 @@ static void mirror_abort(Job *job)
+@@ -871,6 +873,16 @@ static void mirror_abort(Job *job)
assert(ret == 0);
}
@@ -86,17 +67,17 @@ index a53582f17b..fafca1360e 100644
static void coroutine_fn mirror_throttle(MirrorBlockJob *s)
{
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
-@@ -1020,7 +1033,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
+@@ -1110,7 +1122,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);
-- if (!s->is_none_mode) {
+- if (s->sync_mode != MIRROR_SYNC_MODE_NONE) {
+ if ((s->sync_mode == MIRROR_SYNC_MODE_TOP) ||
+ (s->sync_mode == MIRROR_SYNC_MODE_FULL)) {
ret = mirror_dirty_init(s);
if (ret < 0 || job_is_cancelled(&s->common.job)) {
goto immediate_exit;
-@@ -1309,6 +1323,7 @@ static const BlockJobDriver mirror_job_driver = {
+@@ -1400,6 +1413,7 @@ static const BlockJobDriver mirror_job_driver = {
.run = mirror_run,
.prepare = mirror_prepare,
.abort = mirror_abort,
@@ -104,7 +85,7 @@ index a53582f17b..fafca1360e 100644
.pause = mirror_pause,
.complete = mirror_complete,
.cancel = mirror_cancel,
-@@ -1327,6 +1342,7 @@ static const BlockJobDriver commit_active_job_driver = {
+@@ -1418,6 +1432,7 @@ static const BlockJobDriver commit_active_job_driver = {
.run = mirror_run,
.prepare = mirror_prepare,
.abort = mirror_abort,
@@ -112,19 +93,16 @@ index a53582f17b..fafca1360e 100644
.pause = mirror_pause,
.complete = mirror_complete,
.cancel = commit_active_cancel,
-@@ -1719,7 +1735,10 @@ static BlockJob *mirror_start_job(
+@@ -1835,6 +1850,8 @@ static BlockJob *mirror_start_job(
BlockCompletionFunc *cb,
void *opaque,
const BlockJobDriver *driver,
-- bool is_none_mode, BlockDriverState *base,
-+ MirrorSyncMode sync_mode,
+ BdrvDirtyBitmap *bitmap,
+ BitmapSyncMode bitmap_mode,
-+ BlockDriverState *base,
+ BlockDriverState *base,
bool auto_complete, const char *filter_node_name,
bool is_mirror, MirrorCopyMode copy_mode,
- bool base_ro,
-@@ -1734,10 +1753,39 @@ static BlockJob *mirror_start_job(
+@@ -1850,10 +1867,39 @@ static BlockJob *mirror_start_job(
GLOBAL_STATE_CODE();
@@ -166,18 +144,16 @@ index a53582f17b..fafca1360e 100644
assert(is_power_of_2(granularity));
if (buf_size < 0) {
-@@ -1878,7 +1926,9 @@ static BlockJob *mirror_start_job(
- s->replaces = g_strdup(replaces);
+@@ -1995,6 +2041,8 @@ static BlockJob *mirror_start_job(
s->on_source_error = on_source_error;
s->on_target_error = on_target_error;
-- s->is_none_mode = is_none_mode;
-+ s->sync_mode = sync_mode;
+ s->sync_mode = sync_mode;
+ s->sync_bitmap = bitmap;
+ s->bitmap_mode = bitmap_mode;
s->backing_mode = backing_mode;
- s->zero_target = zero_target;
+ s->target_is_zero = target_is_zero;
qatomic_set(&s->copy_mode, copy_mode);
-@@ -1904,6 +1954,18 @@ static BlockJob *mirror_start_job(
+@@ -2020,6 +2068,18 @@ static BlockJob *mirror_start_job(
*/
bdrv_disable_dirty_bitmap(s->dirty_bitmap);
@@ -193,10 +169,10 @@ index a53582f17b..fafca1360e 100644
+ }
+ }
+
- bdrv_graph_wrlock();
+ bdrv_graph_wrlock_drained();
ret = block_job_add_bdrv(&s->common, "source", bs, 0,
BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE |
-@@ -1986,6 +2048,9 @@ fail:
+@@ -2102,6 +2162,9 @@ fail:
if (s->dirty_bitmap) {
bdrv_release_dirty_bitmap(s->dirty_bitmap);
}
@@ -206,22 +182,19 @@ index a53582f17b..fafca1360e 100644
job_early_fail(&s->common.job);
}
-@@ -2008,35 +2073,28 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
+@@ -2124,7 +2187,10 @@ 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,
- MirrorSyncMode mode, BlockMirrorBackingMode backing_mode,
-+ MirrorSyncMode mode, BdrvDirtyBitmap *bitmap,
++ MirrorSyncMode mode,
++ BdrvDirtyBitmap *bitmap,
+ BitmapSyncMode bitmap_mode,
+ BlockMirrorBackingMode backing_mode,
- bool zero_target,
+ bool target_is_zero,
BlockdevOnError on_source_error,
BlockdevOnError on_target_error,
- bool unmap, const char *filter_node_name,
- MirrorCopyMode copy_mode, Error **errp)
- {
-- bool is_none_mode;
- BlockDriverState *base;
+@@ -2135,13 +2201,6 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
GLOBAL_STATE_CODE();
@@ -233,35 +206,33 @@ index a53582f17b..fafca1360e 100644
- }
-
bdrv_graph_rdlock_main_loop();
-- is_none_mode = mode == MIRROR_SYNC_MODE_NONE;
base = mode == MIRROR_SYNC_MODE_TOP ? bdrv_backing_chain_next(bs) : NULL;
bdrv_graph_rdunlock_main_loop();
-
+@@ -2149,8 +2208,8 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
mirror_start_job(job_id, bs, creation_flags, target, replaces,
- speed, granularity, buf_size, backing_mode, zero_target,
- on_source_error, on_target_error, unmap, NULL, NULL,
-- &mirror_job_driver, is_none_mode, base, false,
+ speed, granularity, buf_size, mode, backing_mode,
+ target_is_zero, on_source_error, on_target_error, unmap,
+- NULL, NULL, &mirror_job_driver, base, false,
- filter_node_name, true, copy_mode, false, errp);
-+ &mirror_job_driver, mode, bitmap, bitmap_mode, base,
++ NULL, NULL, &mirror_job_driver, bitmap, bitmap_mode, base,
+ false, filter_node_name, true, copy_mode, false, errp);
}
BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
-@@ -2063,7 +2121,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
+@@ -2177,7 +2236,7 @@ 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,
+ MIRROR_SYNC_MODE_TOP, MIRROR_LEAVE_BACKING_CHAIN, false,
on_error, on_error, true, cb, opaque,
-- &commit_active_job_driver, false, base, auto_complete,
-+ &commit_active_job_driver, MIRROR_SYNC_MODE_FULL,
-+ NULL, 0, base, auto_complete,
+- &commit_active_job_driver, base, auto_complete,
++ &commit_active_job_driver, NULL, 0, base, auto_complete,
filter_node_name, false, MIRROR_COPY_MODE_BACKGROUND,
base_read_only, errp);
if (!job) {
diff --git a/blockdev.c b/blockdev.c
-index 1d1f27cfff..ec45bbaa52 100644
+index b451fee6e1..5855e9cac2 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -2797,6 +2797,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2857,6 +2857,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
BlockDriverState *target,
const char *replaces,
enum MirrorSyncMode sync,
@@ -269,9 +240,9 @@ index 1d1f27cfff..ec45bbaa52 100644
+ bool has_bitmap_mode,
+ BitmapSyncMode bitmap_mode,
BlockMirrorBackingMode backing_mode,
- bool zero_target,
+ bool target_is_zero,
bool has_speed, int64_t speed,
-@@ -2815,6 +2818,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2875,6 +2878,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
{
BlockDriverState *unfiltered_bs;
int job_flags = JOB_DEFAULT;
@@ -279,8 +250,8 @@ index 1d1f27cfff..ec45bbaa52 100644
GLOBAL_STATE_CODE();
GRAPH_RDLOCK_GUARD_MAINLOOP();
-@@ -2869,6 +2873,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
- sync = MIRROR_SYNC_MODE_FULL;
+@@ -2925,6 +2929,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+ return;
}
+ if (bitmap_name) {
@@ -309,27 +280,25 @@ index 1d1f27cfff..ec45bbaa52 100644
if (!replaces) {
/* We want to mirror from @bs, but keep implicit filters on top */
unfiltered_bs = bdrv_skip_implicit_filters(bs);
-@@ -2910,8 +2937,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2966,7 +2993,7 @@ 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,
-- replaces, job_flags,
-- speed, granularity, buf_size, sync, backing_mode, zero_target,
-+ replaces, job_flags, speed, granularity, buf_size, sync,
-+ bitmap, bitmap_mode, backing_mode, zero_target,
- on_source_error, on_target_error, unmap, filter_node_name,
- copy_mode, errp);
+ mirror_start(job_id, bs, target, replaces, job_flags,
+- speed, granularity, buf_size, sync, backing_mode,
++ speed, granularity, buf_size, sync, bitmap, bitmap_mode, backing_mode,
+ target_is_zero, on_source_error, on_target_error, unmap,
+ filter_node_name, copy_mode, errp);
}
-@@ -3055,6 +3082,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
+@@ -3109,6 +3136,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
blockdev_mirror_common(arg->job_id, bs, target_bs,
arg->replaces, arg->sync,
+ arg->bitmap,
+ arg->has_bitmap_mode, arg->bitmap_mode,
- backing_mode, zero_target,
+ backing_mode, target_is_zero,
arg->has_speed, arg->speed,
arg->has_granularity, arg->granularity,
-@@ -3074,6 +3103,8 @@ void qmp_blockdev_mirror(const char *job_id,
+@@ -3128,6 +3157,8 @@ void qmp_blockdev_mirror(const char *job_id,
const char *device, const char *target,
const char *replaces,
MirrorSyncMode sync,
@@ -338,18 +307,18 @@ index 1d1f27cfff..ec45bbaa52 100644
bool has_speed, int64_t speed,
bool has_granularity, uint32_t granularity,
bool has_buf_size, int64_t buf_size,
-@@ -3114,7 +3145,8 @@ void qmp_blockdev_mirror(const char *job_id,
+@@ -3166,7 +3197,8 @@ void qmp_blockdev_mirror(const char *job_id,
}
blockdev_mirror_common(job_id, bs, target_bs,
- replaces, sync, backing_mode,
+ replaces, sync,
+ bitmap, has_bitmap_mode, bitmap_mode, backing_mode,
- zero_target, has_speed, speed,
+ has_target_is_zero && target_is_zero,
+ has_speed, speed,
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 eb2d92a226..f0c642b194 100644
+index e7c8f1a856..d5aa68caeb 100644
--- a/include/block/block_int-global-state.h
+++ b/include/block/block_int-global-state.h
@@ -158,7 +158,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
@@ -360,14 +329,14 @@ index eb2d92a226..f0c642b194 100644
+ MirrorSyncMode mode, BdrvDirtyBitmap *bitmap,
+ BitmapSyncMode bitmap_mode,
+ BlockMirrorBackingMode backing_mode,
- bool zero_target,
+ bool target_is_zero,
BlockdevOnError on_source_error,
BlockdevOnError on_target_error,
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index b1937780e1..0e5f148d30 100644
+index dc6eb4ae23..7d281ab7ae 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -2182,6 +2182,15 @@
+@@ -2205,6 +2205,15 @@
# destination (all the disk, only the sectors allocated in the
# topmost image, or only new I/O).
#
@@ -383,7 +352,7 @@ index b1937780e1..0e5f148d30 100644
# @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
-@@ -2224,7 +2233,9 @@
+@@ -2246,7 +2255,9 @@
{ 'struct': 'DriveMirror',
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
'*format': 'str', '*node-name': 'str', '*replaces': 'str',
@@ -394,7 +363,7 @@ index b1937780e1..0e5f148d30 100644
'*speed': 'int', '*granularity': 'uint32',
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
'*on-target-error': 'BlockdevOnError',
-@@ -2503,6 +2514,15 @@
+@@ -2522,6 +2533,15 @@
# destination (all the disk, only the sectors allocated in the
# topmost image, or only new I/O).
#
@@ -410,7 +379,7 @@ index b1937780e1..0e5f148d30 100644
# @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
-@@ -2551,7 +2571,8 @@
+@@ -2574,7 +2594,8 @@
{ 'command': 'blockdev-mirror',
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
'*replaces': 'str',
@@ -421,7 +390,7 @@ index b1937780e1..0e5f148d30 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 2b358eaaa8..2a149fe021 100644
+index e26b3be593..396a53a757 100644
--- a/tests/unit/test-block-iothread.c
+++ b/tests/unit/test-block-iothread.c
@@ -755,8 +755,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 f22b013..7771887 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 fafca1360e..05e738bcce 100644
+index a184e91478..79b6f16d27 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -694,8 +694,6 @@ static int mirror_exit_common(Job *job)
+@@ -734,8 +734,6 @@ static int mirror_exit_common(Job *job)
bdrv_unfreeze_backing_chain(mirror_top_bs, target_bs);
}
@@ -36,7 +36,7 @@ index fafca1360e..05e738bcce 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);
-@@ -805,6 +803,18 @@ static int mirror_exit_common(Job *job)
+@@ -851,6 +849,18 @@ static int mirror_exit_common(Job *job)
bdrv_drained_end(target_bs);
bdrv_unref(target_bs);
@@ -55,7 +55,7 @@ index fafca1360e..05e738bcce 100644
bs_opaque->job = NULL;
bdrv_drained_end(src);
-@@ -1763,10 +1773,6 @@ static BlockJob *mirror_start_job(
+@@ -1877,10 +1887,6 @@ static BlockJob *mirror_start_job(
" sync mode",
MirrorSyncMode_str(sync_mode));
return NULL;
@@ -66,7 +66,7 @@ index fafca1360e..05e738bcce 100644
}
} else if (bitmap) {
error_setg(errp,
-@@ -1783,6 +1789,12 @@ static BlockJob *mirror_start_job(
+@@ -1897,6 +1903,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 81c750b..c2d4d9e 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 ec45bbaa52..9fab7ec554 100644
+index 5855e9cac2..f132b4985b 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -2894,6 +2894,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+@@ -2950,6 +2950,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 abece60..9468058 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 05e738bcce..2a2a227f3b 100644
+index 79b6f16d27..4741930d9b 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -809,8 +809,8 @@ static int mirror_exit_common(Job *job)
+@@ -855,8 +855,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 05e738bcce..2a2a227f3b 100644
}
}
bdrv_release_dirty_bitmap(s->dirty_bitmap);
-@@ -1971,11 +1971,8 @@ static BlockJob *mirror_start_job(
+@@ -2085,11 +2085,8 @@ static BlockJob *mirror_start_job(
}
if (s->sync_mode == MIRROR_SYNC_MODE_BITMAP) {
@@ -43,4 +43,4 @@ index 05e738bcce..2a2a227f3b 100644
+ NULL, true);
}
- bdrv_graph_wrlock();
+ bdrv_graph_wrlock_drained();
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 50746b6..7014368 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
@@ -12,7 +12,7 @@ uniform w.r.t. backup block jobs.
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
-[FE: rebase for 8.2.2]
+[FE: rebase for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
block/mirror.c | 28 +++------------
@@ -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 2a2a227f3b..87c0856979 100644
+index 4741930d9b..17f19ca015 100644
--- a/block/mirror.c
+++ b/block/mirror.c
-@@ -1763,31 +1763,13 @@ static BlockJob *mirror_start_job(
+@@ -1877,31 +1877,13 @@ static BlockJob *mirror_start_job(
GLOBAL_STATE_CODE();
@@ -62,11 +62,11 @@ index 2a2a227f3b..87c0856979 100644
if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) {
diff --git a/blockdev.c b/blockdev.c
-index 9fab7ec554..158ac9314b 100644
+index f132b4985b..782cc5dd75 100644
--- a/blockdev.c
+++ b/blockdev.c
-@@ -2873,7 +2873,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
- sync = MIRROR_SYNC_MODE_FULL;
+@@ -2929,7 +2929,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
+ return;
}
+ if ((sync == MIRROR_SYNC_MODE_BITMAP) ||
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 de0a350..1029ef5 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
@@ -104,7 +104,7 @@ index c5a5d30877..07775784d4 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 2f46cf9e49..f093e256e9 100644
+index cb99a12d94..170fef4531 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -165,6 +165,8 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
@@ -135,7 +135,7 @@ index 2f46cf9e49..f093e256e9 100644
qobject_unref(rsp);
}
-@@ -461,6 +473,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
+@@ -462,6 +474,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
switch (event) {
case CHR_EVENT_OPENED:
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 60e6981..2538947 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 56d1972d15..cfa0b832ba 100644
+index 8c738674ce..6a9433c836 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
-@@ -565,7 +565,7 @@ static QemuOptsList raw_runtime_opts = {
+@@ -588,7 +588,7 @@ static QemuOptsList raw_runtime_opts = {
{
.name = "locking",
.type = QEMU_OPT_STRING,
@@ -26,7 +26,7 @@ index 56d1972d15..cfa0b832ba 100644
},
{
.name = "pr-manager",
-@@ -665,7 +665,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
+@@ -688,7 +688,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/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch b/debian/patches/pve/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch
index 426c6e6..9582fc1 100644
--- a/debian/patches/pve/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch
+++ b/debian/patches/pve/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch
@@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/net/net.h b/include/net/net.h
-index cdd5b109b0..653a37e9d1 100644
+index 84ee18e0f9..d42d935db5 100644
--- a/include/net/net.h
+++ b/include/net/net.h
-@@ -305,8 +305,8 @@ void netdev_add(QemuOpts *opts, Error **errp);
+@@ -311,8 +311,8 @@ void netdev_add(QemuOpts *opts, Error **errp);
int net_hub_id_for_client(NetClientState *nc, int *id);
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 c960164..65d18b9 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 76f24446a5..2a47d79b49 100644
+index f977fc49a7..d96c57c182 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
-@@ -2556,9 +2556,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
+@@ -2613,9 +2613,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
#ifdef TARGET_X86_64
@@ -24,4 +24,4 @@ index 76f24446a5..2a47d79b49 100644
+#define TARGET_DEFAULT_CPU_TYPE X86_CPU_TYPE_NAME("kvm32")
#endif
- #define cpu_list x86_cpu_list
+ /* MMU modes definitions */
diff --git a/debian/patches/pve/0004-PVE-Config-ui-spice-default-to-pve-certificates.patch b/debian/patches/pve/0004-PVE-Config-ui-spice-default-to-pve-certificates.patch
index 558f66e..61719e7 100644
--- a/debian/patches/pve/0004-PVE-Config-ui-spice-default-to-pve-certificates.patch
+++ b/debian/patches/pve/0004-PVE-Config-ui-spice-default-to-pve-certificates.patch
@@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/ui/spice-core.c b/ui/spice-core.c
-index 0326c63bec..d523d00200 100644
+index 5992f9daec..cd1ec9c082 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
-@@ -690,32 +690,35 @@ static void qemu_spice_init(void)
+@@ -698,32 +698,35 @@ static void qemu_spice_init(void)
if (tls_port) {
x509_dir = qemu_opt_get(opts, "x509-dir");
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 bbc9e36..aaf2050 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 c6d25ae733..ccca125c3a 100644
+index 89abd40f31..d3f2e56229 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -42,7 +42,7 @@
diff --git a/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch b/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch
index 84e7a57..573d26a 100644
--- a/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch
+++ b/debian/patches/pve/0006-PVE-Config-rbd-block-rbd-disable-rbd_cache_writethro.patch
@@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 2 insertions(+)
diff --git a/block/rbd.c b/block/rbd.c
-index af984fb7db..bf143fac00 100644
+index 3611dc81cf..d114119671 100644
--- a/block/rbd.c
+++ b/block/rbd.c
-@@ -963,6 +963,8 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
+@@ -1017,6 +1017,8 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
rados_conf_set(*cluster, "rbd_cache", "false");
}
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 92c539d..dd3b92f 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 ccca125c3a..301a653ea7 100644
+index d3f2e56229..de0fb4cf68 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -57,6 +57,7 @@ typedef struct GlusterAIOCB {
@@ -39,7 +39,7 @@ index ccca125c3a..301a653ea7 100644
}
aio_co_schedule(acb->aio_context, acb->coroutine);
-@@ -1018,6 +1021,7 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
+@@ -1014,6 +1017,7 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
acb.ret = 0;
acb.coroutine = qemu_coroutine_self();
acb.aio_context = bdrv_get_aio_context(bs);
@@ -47,7 +47,7 @@ index ccca125c3a..301a653ea7 100644
ret = glfs_zerofill_async(s->fd, offset, bytes, gluster_finish_aiocb, &acb);
if (ret < 0) {
-@@ -1198,9 +1202,11 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
+@@ -1194,9 +1198,11 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
acb.aio_context = bdrv_get_aio_context(bs);
if (write) {
@@ -59,7 +59,7 @@ index ccca125c3a..301a653ea7 100644
ret = glfs_preadv_async(s->fd, qiov->iov, qiov->niov, offset, 0,
gluster_finish_aiocb, &acb);
}
-@@ -1263,6 +1269,7 @@ static coroutine_fn int qemu_gluster_co_flush_to_disk(BlockDriverState *bs)
+@@ -1259,6 +1265,7 @@ static coroutine_fn int qemu_gluster_co_flush_to_disk(BlockDriverState *bs)
acb.ret = 0;
acb.coroutine = qemu_coroutine_self();
acb.aio_context = bdrv_get_aio_context(bs);
@@ -67,7 +67,7 @@ index ccca125c3a..301a653ea7 100644
ret = glfs_fsync_async(s->fd, gluster_finish_aiocb, &acb);
if (ret < 0) {
-@@ -1311,6 +1318,7 @@ static coroutine_fn int qemu_gluster_co_pdiscard(BlockDriverState *bs,
+@@ -1307,6 +1314,7 @@ static coroutine_fn int qemu_gluster_co_pdiscard(BlockDriverState *bs,
acb.ret = 0;
acb.coroutine = qemu_coroutine_self();
acb.aio_context = bdrv_get_aio_context(bs);
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 f3ab731..7710b06 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 2044c22a4c..4c8b5412c6 100644
+index 7a162fdc08..0bed551960 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -3075,7 +3075,8 @@ static int img_info(int argc, char **argv)
+@@ -3158,7 +3158,8 @@ static int img_info(const img_cmd_t *ccmd, 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 0e8c047..c9e1f34 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
@@ -31,6 +31,7 @@ override the output file's size.
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+[FE: rebase for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
qemu-img-cmds.hx | 4 +-
@@ -38,7 +39,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2 files changed, 133 insertions(+), 73 deletions(-)
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
-index c9dd70a892..048788b23d 100644
+index 2c5a8a28f9..a6de1434a3 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -60,9 +60,9 @@ SRST
@@ -54,10 +55,10 @@ index c9dd70a892..048788b23d 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index 4c8b5412c6..d5fa89a204 100644
+index 0bed551960..0a0ca0cec7 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -4997,10 +4997,12 @@ static int img_bitmap(int argc, char **argv)
+@@ -5253,10 +5253,12 @@ static int img_bitmap(const img_cmd_t *ccmd, int argc, char **argv)
#define C_IF 04
#define C_OF 010
#define C_SKIP 020
@@ -70,7 +71,7 @@ index 4c8b5412c6..d5fa89a204 100644
};
struct DdIo {
-@@ -5076,6 +5078,19 @@ static int img_dd_skip(const char *arg,
+@@ -5332,6 +5334,19 @@ static int img_dd_skip(const char *arg,
return 0;
}
@@ -78,7 +79,7 @@ index 4c8b5412c6..d5fa89a204 100644
+ struct DdIo *in, struct DdIo *out,
+ struct DdInfo *dd)
+{
-+ dd->osize = cvtnum("size", arg);
++ dd->osize = cvtnum("osize", arg, true);
+
+ if (dd->osize < 0) {
+ return 1;
@@ -87,10 +88,10 @@ index 4c8b5412c6..d5fa89a204 100644
+ return 0;
+}
+
- static int img_dd(int argc, char **argv)
+ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{
int ret = 0;
-@@ -5116,6 +5131,7 @@ static int img_dd(int argc, char **argv)
+@@ -5372,6 +5387,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{ "if", img_dd_if, C_IF },
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
@@ -98,7 +99,7 @@ index 4c8b5412c6..d5fa89a204 100644
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
-@@ -5191,91 +5207,112 @@ static int img_dd(int argc, char **argv)
+@@ -5469,91 +5485,112 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
arg = NULL;
}
@@ -275,7 +276,7 @@ index 4c8b5412c6..d5fa89a204 100644
}
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
-@@ -5292,20 +5329,43 @@ static int img_dd(int argc, char **argv)
+@@ -5570,20 +5607,43 @@ static int img_dd(const img_cmd_t *ccmd, 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 af2c520..fbf92a1 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
@@ -10,16 +10,17 @@ an expected end of input.
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+[FE: rebase for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
qemu-img.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/qemu-img.c b/qemu-img.c
-index d5fa89a204..d458e85af2 100644
+index 0a0ca0cec7..89ef74ae07 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -4998,11 +4998,13 @@ static int img_bitmap(int argc, char **argv)
+@@ -5254,11 +5254,13 @@ static int img_bitmap(const img_cmd_t *ccmd, int argc, char **argv)
#define C_OF 010
#define C_SKIP 020
#define C_OSIZE 040
@@ -33,7 +34,7 @@ index d5fa89a204..d458e85af2 100644
};
struct DdIo {
-@@ -5091,6 +5093,19 @@ static int img_dd_osize(const char *arg,
+@@ -5347,6 +5349,19 @@ static int img_dd_osize(const char *arg,
return 0;
}
@@ -41,7 +42,7 @@ index d5fa89a204..d458e85af2 100644
+ struct DdIo *in, struct DdIo *out,
+ struct DdInfo *dd)
+{
-+ dd->isize = cvtnum("size", arg);
++ dd->isize = cvtnum("isize", arg, true);
+
+ if (dd->isize < 0) {
+ return 1;
@@ -50,10 +51,10 @@ index d5fa89a204..d458e85af2 100644
+ return 0;
+}
+
- static int img_dd(int argc, char **argv)
+ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{
int ret = 0;
-@@ -5105,12 +5120,14 @@ static int img_dd(int argc, char **argv)
+@@ -5361,12 +5376,14 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
int c, i;
const char *out_fmt = "raw";
const char *fmt = NULL;
@@ -69,7 +70,7 @@ index d5fa89a204..d458e85af2 100644
};
struct DdIo in = {
.bsz = 512, /* Block size is by default 512 bytes */
-@@ -5132,6 +5149,7 @@ static int img_dd(int argc, char **argv)
+@@ -5388,6 +5405,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
{ "osize", img_dd_osize, C_OSIZE },
@@ -77,7 +78,7 @@ index d5fa89a204..d458e85af2 100644
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
-@@ -5328,9 +5346,10 @@ static int img_dd(int argc, char **argv)
+@@ -5606,9 +5624,10 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
in.buf = g_new(uint8_t, in.bsz);
@@ -90,7 +91,7 @@ index d5fa89a204..d458e85af2 100644
if (blk1) {
in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
if (in_ret == 0) {
-@@ -5339,6 +5358,9 @@ static int img_dd(int argc, char **argv)
+@@ -5617,6 +5636,9 @@ static int img_dd(const img_cmd_t *ccmd, 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 cf94190..ee936c5 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
@@ -4,7 +4,8 @@ Date: Mon, 6 Apr 2020 12:16:42 +0200
Subject: [PATCH] PVE: [Up] qemu-img dd: add -n skip_create
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
-[FE: fix getopt-string + add documentation]
+[FE: fix getopt-string + add documentation
+ rebase for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
docs/tools/qemu-img.rst | 11 ++++++++++-
@@ -13,7 +14,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
-index 3653adb963..d83e8fb3c0 100644
+index 5e7b85079d..6249e01da9 100644
--- a/docs/tools/qemu-img.rst
+++ b/docs/tools/qemu-img.rst
@@ -212,6 +212,10 @@ Parameters to convert subcommand:
@@ -49,7 +50,7 @@ index 3653adb963..d83e8fb3c0 100644
Give information about the disk image *FILENAME*. Use it in
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
-index 048788b23d..0b29a67a06 100644
+index a6de1434a3..d584624f8e 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -60,9 +60,9 @@ SRST
@@ -65,10 +66,10 @@ index 048788b23d..0b29a67a06 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index d458e85af2..dc13efba8b 100644
+index 89ef74ae07..6e92a70254 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -5122,7 +5122,7 @@ static int img_dd(int argc, char **argv)
+@@ -5378,7 +5378,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
const char *fmt = NULL;
int64_t size = 0, readsize = 0;
int64_t out_pos, in_pos;
@@ -77,18 +78,18 @@ index d458e85af2..dc13efba8b 100644
struct DdInfo dd = {
.flags = 0,
.count = 0,
-@@ -5160,7 +5160,7 @@ static int img_dd(int argc, char **argv)
+@@ -5418,7 +5418,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{ 0, 0, 0, 0 }
};
-- while ((c = getopt_long(argc, argv, ":hf:O:U", long_options, NULL))) {
-+ while ((c = getopt_long(argc, argv, ":hf:O:Un", long_options, NULL))) {
+- while ((c = getopt_long(argc, argv, "hf:O:U", long_options, NULL))) {
++ while ((c = getopt_long(argc, argv, "hf:O:Un", long_options, NULL))) {
if (c == EOF) {
break;
}
-@@ -5180,6 +5180,9 @@ static int img_dd(int argc, char **argv)
- case 'h':
- help();
+@@ -5459,6 +5459,9 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
+ case 'O':
+ out_fmt = optarg;
break;
+ case 'n':
+ skip_create = true;
@@ -96,7 +97,7 @@ index d458e85af2..dc13efba8b 100644
case 'U':
force_share = true;
break;
-@@ -5310,13 +5313,15 @@ static int img_dd(int argc, char **argv)
+@@ -5588,13 +5591,15 @@ static int img_dd(const img_cmd_t *ccmd, 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 493c61e..edea617 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
@@ -5,6 +5,8 @@ Subject: [PATCH] qemu-img dd: add -l option for loading a snapshot
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+[FE: rebase for 10.1.0]
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
docs/tools/qemu-img.rst | 6 +++---
qemu-img-cmds.hx | 4 ++--
@@ -12,7 +14,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
-index d83e8fb3c0..61c6b21859 100644
+index 6249e01da9..0ea21e061f 100644
--- a/docs/tools/qemu-img.rst
+++ b/docs/tools/qemu-img.rst
@@ -496,10 +496,10 @@ Command description:
@@ -30,7 +32,7 @@ index d83e8fb3c0..61c6b21859 100644
The data is by default read and written using blocks of 512 bytes but can be
modified by specifying *BLOCK_SIZE*. If count=\ *BLOCKS* is specified
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
-index 0b29a67a06..758f397232 100644
+index d584624f8e..be30905374 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -60,9 +60,9 @@ SRST
@@ -46,10 +48,10 @@ index 0b29a67a06..758f397232 100644
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index dc13efba8b..02f2e0aa45 100644
+index 6e92a70254..e38317a445 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -5114,6 +5114,7 @@ static int img_dd(int argc, char **argv)
+@@ -5370,6 +5370,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
BlockDriver *drv = NULL, *proto_drv = NULL;
BlockBackend *blk1 = NULL, *blk2 = NULL;
QemuOpts *opts = NULL;
@@ -57,7 +59,7 @@ index dc13efba8b..02f2e0aa45 100644
QemuOptsList *create_opts = NULL;
Error *local_err = NULL;
bool image_opts = false;
-@@ -5123,6 +5124,7 @@ static int img_dd(int argc, char **argv)
+@@ -5379,6 +5380,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
int64_t size = 0, readsize = 0;
int64_t out_pos, in_pos;
bool force_share = false, skip_create = false;
@@ -65,16 +67,16 @@ index dc13efba8b..02f2e0aa45 100644
struct DdInfo dd = {
.flags = 0,
.count = 0,
-@@ -5160,7 +5162,7 @@ static int img_dd(int argc, char **argv)
+@@ -5418,7 +5420,7 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
{ 0, 0, 0, 0 }
};
-- while ((c = getopt_long(argc, argv, ":hf:O:Un", long_options, NULL))) {
-+ while ((c = getopt_long(argc, argv, ":hf:O:l:Un", long_options, NULL))) {
+- while ((c = getopt_long(argc, argv, "hf:O:Un", long_options, NULL))) {
++ while ((c = getopt_long(argc, argv, "hf:O:l:Un", long_options, NULL))) {
if (c == EOF) {
break;
}
-@@ -5183,6 +5185,19 @@ static int img_dd(int argc, char **argv)
+@@ -5462,6 +5464,19 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
case 'n':
skip_create = true;
break;
@@ -94,7 +96,7 @@ index dc13efba8b..02f2e0aa45 100644
case 'U':
force_share = true;
break;
-@@ -5242,11 +5257,24 @@ static int img_dd(int argc, char **argv)
+@@ -5520,11 +5535,24 @@ static int img_dd(const img_cmd_t *ccmd, int argc, char **argv)
if (dd.flags & C_IF) {
blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
force_share);
@@ -120,7 +122,7 @@ index dc13efba8b..02f2e0aa45 100644
}
if (dd.flags & C_OSIZE) {
-@@ -5401,6 +5429,7 @@ static int img_dd(int argc, char **argv)
+@@ -5679,6 +5707,7 @@ static int img_dd(const img_cmd_t *ccmd, 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 ec4b348..d440dbb 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
@@ -18,10 +18,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
4 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/hw/core/machine-hmp-cmds.c b/hw/core/machine-hmp-cmds.c
-index c6325cdcaa..7f817d622d 100644
+index 3a612e2232..036d87cc90 100644
--- a/hw/core/machine-hmp-cmds.c
+++ b/hw/core/machine-hmp-cmds.c
-@@ -179,7 +179,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
+@@ -182,7 +182,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
return;
}
@@ -59,7 +59,7 @@ index c6325cdcaa..7f817d622d 100644
qapi_free_BalloonInfo(info);
}
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
-index 2eb5a14fa2..aa2fd6c32f 100644
+index db787d00b3..26ebf3a5ce 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -795,8 +795,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
@@ -103,11 +103,11 @@ index 2eb5a14fa2..aa2fd6c32f 100644
static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
diff --git a/qapi/machine.json b/qapi/machine.json
-index a6b8795b09..9f7ed0eaa0 100644
+index 038eab281c..5f172ece18 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -1163,9 +1163,29 @@
- # @actual: the logical size of the VM in bytes Formula used:
+@@ -1125,9 +1125,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 3fa6209..a131d2b 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 1bc21b84a4..93fb4bc24a 100644
+index 6aca1a626e..934cdb886d 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
-@@ -91,6 +91,12 @@ MachineInfoList *qmp_query_machines(bool has_compat_props, bool compat_props,
+@@ -94,6 +94,12 @@ MachineInfoList *qmp_query_machines(bool has_compat_props, bool compat_props,
info->numa_mem_supported = mc->numa_mem_supported;
info->deprecated = !!mc->deprecation_reason;
info->acpi = !!object_class_property_find(OBJECT_CLASS(mc), "acpi");
@@ -30,10 +30,10 @@ index 1bc21b84a4..93fb4bc24a 100644
info->default_cpu_type = g_strdup(default_cpu_type);
}
diff --git a/qapi/machine.json b/qapi/machine.json
-index 9f7ed0eaa0..16366b774a 100644
+index 5f172ece18..47ac68a3b5 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -167,6 +167,8 @@
+@@ -170,6 +170,8 @@
#
# @is-default: whether the machine is default
#
@@ -42,7 +42,7 @@ index 9f7ed0eaa0..16366b774a 100644
# @cpu-max: maximum number of CPUs supported by the machine type
# (since 1.5)
#
-@@ -199,7 +201,7 @@
+@@ -202,7 +204,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 cf85582..9ebf74c 100644
--- a/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
+++ b/debian/patches/pve/0015-PVE-qapi-modify-spice-query.patch
@@ -14,12 +14,12 @@ 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 c536d4e524..c2df48959b 100644
+index 1b2f4a4769..c9982e1bcc 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
-@@ -312,11 +312,14 @@
+@@ -315,11 +315,14 @@
#
- # @channels: a list of @SpiceChannel for each active spice channel
+ # @channels: a list of `SpiceChannel` for each active spice channel
#
+# @ticket: The last ticket set with set_password
+#
@@ -33,10 +33,10 @@ index c536d4e524..c2df48959b 100644
'if': 'CONFIG_SPICE' }
diff --git a/ui/spice-core.c b/ui/spice-core.c
-index d523d00200..c76c224706 100644
+index cd1ec9c082..4064053778 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
-@@ -548,6 +548,10 @@ static SpiceInfo *qmp_query_spice_real(Error **errp)
+@@ -556,6 +556,10 @@ static SpiceInfo *qmp_query_spice_real(Error **errp)
micro = SPICE_SERVER_VERSION & 0xff;
info->compiled_version = g_strdup_printf("%d.%d.%d", major, minor, micro);
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 0e69c98..4e84027 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
@@ -25,7 +25,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
diff --git a/migration/channel-savevm-async.c b/migration/channel-savevm-async.c
new file mode 100644
-index 0000000000..e57ab2ae40
+index 0000000000..d851e74567
--- /dev/null
+++ b/migration/channel-savevm-async.c
@@ -0,0 +1,184 @@
@@ -187,7 +187,7 @@ index 0000000000..e57ab2ae40
+
+static void
+qio_channel_savevm_async_class_init(ObjectClass *klass,
-+ void *class_data G_GNUC_UNUSED)
++ const void *class_data G_GNUC_UNUSED)
+{
+ QIOChannelClass *ioc_klass = QIO_CHANNEL_CLASS(klass);
+
@@ -271,7 +271,7 @@ index 0000000000..17ae2cb261
+
+#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */
diff --git a/migration/meson.build b/migration/meson.build
-index 9aa48b290e..cf66c78681 100644
+index 276da3be5a..1d32185fff 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -14,6 +14,7 @@ system_ss.add(files(
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 622191d..9401690 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
@@ -33,7 +33,8 @@ Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
force raw format when loading state as suggested by Friedrich Weber
improve setting state in savevm-end handler
improve runstate preservation
- use dedicated iothread for state file to avoid deadlock, bug #6262]
+ use dedicated iothread for state file to avoid deadlock, bug #6262
+ rebase for 10.1.0]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
hmp-commands-info.hx | 13 +
@@ -51,10 +52,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
create mode 100644 migration/savevm-async.c
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
-index c59cd6637b..d1a7b99add 100644
+index 6142f60e7b..3e15458335 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
-@@ -512,6 +512,19 @@ SRST
+@@ -510,6 +510,19 @@ SRST
Show current migration parameters.
ERST
@@ -75,10 +76,10 @@ index c59cd6637b..d1a7b99add 100644
.name = "balloon",
.args_type = "",
diff --git a/hmp-commands.hx b/hmp-commands.hx
-index 06746f0afc..0c7c6f2c16 100644
+index d0e4f35a30..0d9241db9e 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
-@@ -1859,3 +1859,20 @@ SRST
+@@ -1862,3 +1862,20 @@ SRST
List event channels in the guest
ERST
#endif
@@ -132,7 +133,7 @@ index ae116d9804..2596cc2426 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 cf66c78681..46e92249a1 100644
+index 1d32185fff..409b748980 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -33,6 +33,7 @@ system_ss.add(files(
@@ -731,7 +732,7 @@ index 0000000000..56e0fa6c69
+ return ret;
+}
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
-index 7ded3378cf..bade2a4b92 100644
+index 74a0f56566..1e66bff724 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -24,6 +24,7 @@
@@ -784,10 +785,10 @@ index 7ded3378cf..bade2a4b92 100644
+ }
+}
diff --git a/qapi/migration.json b/qapi/migration.json
-index 8b9c53595c..ff3479da65 100644
+index 2387c21e9c..c1d962b4ed 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
-@@ -279,6 +279,40 @@
+@@ -319,6 +319,40 @@
'*dirty-limit-throttle-time-per-round': 'uint64',
'*dirty-limit-ring-full-time': 'uint64'} }
@@ -829,10 +830,10 @@ index 8b9c53595c..ff3479da65 100644
# @query-migrate:
#
diff --git a/qapi/misc.json b/qapi/misc.json
-index 559b66f201..7959e89c1e 100644
+index 28c641fe2f..51d907b2b8 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
-@@ -454,6 +454,24 @@
+@@ -449,6 +449,24 @@
##
{ 'command': 'query-fdsets', 'returns': ['FdsetInfo'] }
@@ -858,10 +859,10 @@ index 559b66f201..7959e89c1e 100644
# @CommandLineParameterType:
#
diff --git a/qemu-options.hx b/qemu-options.hx
-index dc694a99a3..defee0c06a 100644
+index ab23f14d21..3ec9e52d31 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
-@@ -4862,6 +4862,18 @@ SRST
+@@ -5048,6 +5048,18 @@ SRST
Start right away with a saved state (``loadvm`` in monitor)
ERST
@@ -877,14 +878,14 @@ index dc694a99a3..defee0c06a 100644
+ for "Device URL Syntax" for more information.
+ERST
+
- #ifndef _WIN32
+ #if !defined(_WIN32) && !defined(EMSCRIPTEN)
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
"-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
diff --git a/system/vl.c b/system/vl.c
-index ec93988a03..9b36ace6b4 100644
+index 3b7057e6c6..28a7d74f5b 100644
--- a/system/vl.c
+++ b/system/vl.c
-@@ -171,6 +171,7 @@ static const char *accelerators;
+@@ -173,6 +173,7 @@ static const char *accelerators;
static bool have_custom_ram_size;
static const char *ram_memdev_id;
static QDict *machine_opts_dict;
@@ -892,7 +893,7 @@ index ec93988a03..9b36ace6b4 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;
-@@ -2814,6 +2815,12 @@ void qmp_x_exit_preconfig(Error **errp)
+@@ -2811,6 +2812,12 @@ void qmp_x_exit_preconfig(Error **errp)
RunState state = autostart ? RUN_STATE_RUNNING : runstate_get();
load_snapshot(loadvm, NULL, false, NULL, &error_fatal);
load_snapshot_resume(state);
@@ -905,7 +906,7 @@ index ec93988a03..9b36ace6b4 100644
}
if (replay_mode != REPLAY_MODE_NONE) {
replay_vmstate_init();
-@@ -3360,6 +3367,9 @@ void qemu_init(int argc, char **argv)
+@@ -3357,6 +3364,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 f5a0d96..9a60ee8 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,7 +19,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
3 files changed, 38 insertions(+), 17 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
-index 1303a5bf58..6e2d58d5c0 100644
+index b6ac190034..46d899edb0 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -34,8 +34,8 @@
@@ -131,7 +131,7 @@ index 1303a5bf58..6e2d58d5c0 100644
if (l > size) {
l = size;
}
-@@ -662,8 +680,8 @@ size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t si
+@@ -660,8 +678,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));
@@ -142,7 +142,7 @@ index 1303a5bf58..6e2d58d5c0 100644
/* The 1st byte to read from */
index = f->buf_index + offset;
-@@ -713,7 +731,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
+@@ -711,7 +729,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
size_t res;
uint8_t *src;
@@ -151,7 +151,7 @@ index 1303a5bf58..6e2d58d5c0 100644
if (res == 0) {
return done;
}
-@@ -747,7 +765,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
+@@ -745,7 +763,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(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)
{
@@ -160,7 +160,7 @@ index 1303a5bf58..6e2d58d5c0 100644
size_t res;
uint8_t *src = NULL;
-@@ -772,7 +790,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset)
+@@ -770,7 +788,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset)
int index = f->buf_index + offset;
assert(!qemu_file_is_writable(f));
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 0534dc1..79bd6b1 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
@@ -247,10 +247,10 @@ index 0000000000..036edb17f5
+
+block_init(bdrv_zeroinit_init);
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 0e5f148d30..0711253f06 100644
+index 7d281ab7ae..aa1dba4284 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -3241,7 +3241,7 @@
+@@ -3305,7 +3305,7 @@
{ 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' },
{ 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' },
{ 'name': 'virtio-blk-vhost-vdpa', 'if': 'CONFIG_BLKIO' },
@@ -259,7 +259,7 @@ index 0e5f148d30..0711253f06 100644
##
# @BlockdevOptionsFile:
-@@ -4799,7 +4799,8 @@
+@@ -4863,7 +4863,8 @@
'if': 'CONFIG_BLKIO' },
'vmdk': 'BlockdevOptionsGenericCOWFormat',
'vpc': 'BlockdevOptionsGenericFormat',
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 1f7383c..a469996 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 defee0c06a..fb980a05cf 100644
+index 3ec9e52d31..bb41239111 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
-@@ -1280,6 +1280,9 @@ legacy PC, they are not recommended for modern configurations.
+@@ -1285,6 +1285,9 @@ legacy PC, they are not recommended for modern configurations.
ERST
@@ -28,10 +28,10 @@ index defee0c06a..fb980a05cf 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/system/vl.c b/system/vl.c
-index 9b36ace6b4..452742ab58 100644
+index 28a7d74f5b..56f8900451 100644
--- a/system/vl.c
+++ b/system/vl.c
-@@ -2854,6 +2854,7 @@ void qemu_init(int argc, char **argv)
+@@ -2851,6 +2851,7 @@ void qemu_init(int argc, char **argv)
MachineClass *machine_class;
bool userconfig = true;
FILE *vmstate_dump_file = NULL;
@@ -39,7 +39,7 @@ index 9b36ace6b4..452742ab58 100644
qemu_add_opts(&qemu_drive_opts);
qemu_add_drive_opts(&qemu_legacy_drive_opts);
-@@ -3472,6 +3473,13 @@ void qemu_init(int argc, char **argv)
+@@ -3469,6 +3470,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/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch b/debian/patches/pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch
index 67c542b..4316412 100644
--- a/debian/patches/pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch
+++ b/debian/patches/pve/0021-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch
@@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 9 insertions(+)
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
-index 2a3e878c4d..efbed1aea3 100644
+index 37a7a7019d..444136c665 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -263,6 +263,15 @@ static void apic_reset_common(DeviceState *dev)
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 e01dfc4..270829f 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, 46 insertions(+), 20 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
-index cfa0b832ba..d5c28cccc9 100644
+index 6a9433c836..37b6d495db 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
-@@ -2897,6 +2897,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -2977,6 +2977,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
int fd;
uint64_t perm, shared;
int result = 0;
@@ -24,7 +24,7 @@ index cfa0b832ba..d5c28cccc9 100644
/* Validate options and set default values */
assert(options->driver == BLOCKDEV_DRIVER_FILE);
-@@ -2937,19 +2938,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -3017,19 +3018,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 cfa0b832ba..d5c28cccc9 100644
}
/* Clear the file by truncating it to 0 */
-@@ -3003,13 +3007,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
+@@ -3083,13 +3087,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
}
out_unlock:
@@ -82,7 +82,7 @@ index cfa0b832ba..d5c28cccc9 100644
}
out_close:
-@@ -3033,6 +3039,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3113,6 +3119,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
PreallocMode prealloc;
char *buf = NULL;
Error *local_err = NULL;
@@ -90,7 +90,7 @@ index cfa0b832ba..d5c28cccc9 100644
/* Skip file: protocol prefix */
strstart(filename, "file:", &filename);
-@@ -3055,6 +3062,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3135,6 +3142,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
return -EINVAL;
}
@@ -109,7 +109,7 @@ index cfa0b832ba..d5c28cccc9 100644
options = (BlockdevCreateOptions) {
.driver = BLOCKDEV_DRIVER_FILE,
.u.file = {
-@@ -3066,6 +3085,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
+@@ -3146,6 +3165,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 cfa0b832ba..d5c28cccc9 100644
};
return raw_co_create(&options, errp);
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 0711253f06..7f92c80179 100644
+index aa1dba4284..e17ef6abdf 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -5017,6 +5017,10 @@
+@@ -5081,6 +5081,10 @@
# @extent-size-hint: Extent size hint to add to the image file; 0 for
# not adding an extent size hint (default: 1 MB, since 5.1)
#
@@ -133,7 +133,7 @@ index 0711253f06..7f92c80179 100644
# Since: 2.12
##
{ 'struct': 'BlockdevCreateOptionsFile',
-@@ -5024,7 +5028,8 @@
+@@ -5088,7 +5092,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 569fe89..4830740 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 f093e256e9..78f1c8e3c8 100644
+index 170fef4531..448403b45b 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
-@@ -534,8 +534,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)
+@@ -535,8 +535,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 d180117..d59e085 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 63c6ef93d2..9a34017e5a 100644
+index bd47527479..e59b12d9f0 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
-@@ -193,7 +193,8 @@ GlobalProperty hw_compat_4_0[] = {
+@@ -201,7 +201,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 14de9e8..74421a1 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, 34 insertions(+)
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
-index 93fb4bc24a..b9999423b4 100644
+index 934cdb886d..124000b771 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
-@@ -95,6 +95,11 @@ MachineInfoList *qmp_query_machines(bool has_compat_props, bool compat_props,
+@@ -98,6 +98,11 @@ MachineInfoList *qmp_query_machines(bool has_compat_props, bool compat_props,
if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) {
info->has_is_current = true;
info->is_current = true;
@@ -37,7 +37,7 @@ index 93fb4bc24a..b9999423b4 100644
if (default_cpu_type) {
diff --git a/include/hw/boards.h b/include/hw/boards.h
-index f22b2e7fc7..8ada4d5832 100644
+index f94713e6e2..7a389f6998 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -271,6 +271,8 @@ struct MachineClass {
@@ -50,19 +50,19 @@ index f22b2e7fc7..8ada4d5832 100644
void (*reset)(MachineState *state, ResetType type);
void (*wakeup)(MachineState *state);
diff --git a/qapi/machine.json b/qapi/machine.json
-index 16366b774a..12cfd3f260 100644
+index 47ac68a3b5..957ff0f4dd 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
-@@ -189,6 +189,8 @@
+@@ -192,6 +192,8 @@
#
# @acpi: machine type supports ACPI (since 8.0)
#
+# @pve-version: custom PVE version suffix specified as 'machine+pveN'
+#
# @compat-props: The machine type's compatibility properties. Only
- # present when query-machines argument @compat-props is true.
+ # present when `query-machines` argument @compat-props is true.
# (since 9.1)
-@@ -205,6 +207,7 @@
+@@ -208,6 +210,7 @@
'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool',
'deprecated': 'bool', '*default-cpu-type': 'str',
'*default-ram-id': 'str', 'acpi': 'bool',
@@ -71,10 +71,10 @@ index 16366b774a..12cfd3f260 100644
'features': ['unstable'] } } }
diff --git a/system/vl.c b/system/vl.c
-index 452742ab58..c3707b2412 100644
+index 56f8900451..4d583d60b1 100644
--- a/system/vl.c
+++ b/system/vl.c
-@@ -1674,6 +1674,7 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
+@@ -1673,6 +1673,7 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
{
ERRP_GUARD();
const char *machine_type = qdict_get_try_str(qdict, "type");
@@ -82,7 +82,7 @@ index 452742ab58..c3707b2412 100644
g_autoptr(GSList) machines = object_class_get_list(TYPE_MACHINE, false);
MachineClass *machine_class = NULL;
-@@ -1693,7 +1694,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
+@@ -1692,7 +1693,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
if (!machine_class) {
error_append_hint(errp,
"Use -machine help to list supported machines\n");
@@ -94,7 +94,7 @@ index 452742ab58..c3707b2412 100644
return machine_class;
}
-@@ -3414,12 +3419,31 @@ void qemu_init(int argc, char **argv)
+@@ -3411,12 +3416,31 @@ void qemu_init(int argc, char **argv)
case QEMU_OPTION_machine:
{
bool help;
diff --git a/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch b/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch
index 23adf3b..1757902 100644
--- a/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch
+++ b/debian/patches/pve/0026-block-backup-move-bcs-bitmap-initialization-to-job-c.patch
@@ -25,7 +25,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/block/backup.c b/block/backup.c
-index 79652bf57b..cc747e9163 100644
+index d4713fa1cd..9189f64ebc 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -237,8 +237,8 @@ static void backup_init_bcs_bitmap(BackupBlockJob *job)
@@ -48,7 +48,7 @@ index 79652bf57b..cc747e9163 100644
if (s->sync_mode == MIRROR_SYNC_MODE_TOP) {
int64_t offset = 0;
int64_t count;
-@@ -502,6 +500,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
+@@ -503,6 +501,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
&error_abort);
bdrv_graph_wrunlock();
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 8b88b69..44f1b38 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
@@ -40,10 +40,10 @@ index a21d9a5411..1373612c10 100644
system_ss.add(files('block-ram-registrar.c'))
diff --git a/meson.build b/meson.build
-index 8ec796d835..680ab48b9b 100644
+index 50c774a195..25eee758fc 100644
--- a/meson.build
+++ b/meson.build
-@@ -2161,6 +2161,8 @@ endif
+@@ -2198,6 +2198,8 @@ endif
has_gettid = cc.has_function('gettid')
@@ -52,7 +52,7 @@ index 8ec796d835..680ab48b9b 100644
# libselinux
selinux = dependency('libselinux',
required: get_option('selinux'),
-@@ -4367,6 +4369,9 @@ if have_tools
+@@ -4531,6 +4533,9 @@ if have_tools
dependencies: [blockdev, qemuutil, selinux],
install: true)
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 0142439..740e076 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
@@ -199,7 +199,7 @@ index 0000000000..354593bc10
+ return bs;
+}
diff --git a/block/backup.c b/block/backup.c
-index cc747e9163..6f7c45f922 100644
+index 9189f64ebc..f6a2d19793 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -29,28 +29,6 @@
@@ -231,7 +231,7 @@ index cc747e9163..6f7c45f922 100644
static const BlockJobDriver backup_job_driver;
static void backup_cleanup_sync_bitmap(BackupBlockJob *job, int ret)
-@@ -462,6 +440,14 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
+@@ -463,6 +441,14 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
}
cluster_size = block_copy_cluster_size(bcs);
@@ -259,7 +259,7 @@ index 1373612c10..6278c4af0f 100644
'blklogwrites.c',
'blkverify.c',
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
-index ebb4e56a50..e717a74e5f 100644
+index 034c0634c8..5688ced531 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/0029-PVE-Add-sequential-job-transaction-support.patch b/debian/patches/pve/0029-PVE-Add-sequential-job-transaction-support.patch
index 93ce858..0599393 100644
--- a/debian/patches/pve/0029-PVE-Add-sequential-job-transaction-support.patch
+++ b/debian/patches/pve/0029-PVE-Add-sequential-job-transaction-support.patch
@@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 files changed, 46 insertions(+)
diff --git a/include/qemu/job.h b/include/qemu/job.h
-index a5a04155ea..562cc7eaec 100644
+index ead31578d3..2ed533de6f 100644
--- a/include/qemu/job.h
+++ b/include/qemu/job.h
@@ -362,6 +362,18 @@ void job_unlock(void);
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 abea096..7d375ef 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
@@ -81,7 +81,8 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
improve canceling
allow passing max-workers setting
use malloc_trim after backup
- create jobs in a drained section]
+ create jobs in a drained section
+ adapt to new arguments for backup_job_create]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
block/meson.build | 5 +
@@ -120,10 +121,10 @@ index 6278c4af0f..d1b16e40e9 100644
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 6919a49bf5..4f30f99644 100644
+index 282d1c386e..bbb08ecabd 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
-@@ -1010,3 +1010,42 @@ void hmp_change_medium(Monitor *mon, const char *device, const char *target,
+@@ -1015,3 +1015,42 @@ void hmp_change_medium(Monitor *mon, const char *device, const char *target,
qmp_blockdev_change_medium(device, NULL, target, arg, true, force,
!!read_only, read_only_mode, errp);
}
@@ -167,7 +168,7 @@ index 6919a49bf5..4f30f99644 100644
+ hmp_handle_error(mon, error);
+}
diff --git a/blockdev.c b/blockdev.c
-index 158ac9314b..17de5d2ae4 100644
+index 782cc5dd75..2505f9040a 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -37,6 +37,7 @@
@@ -179,10 +180,10 @@ index 158ac9314b..17de5d2ae4 100644
#include "monitor/monitor.h"
#include "qemu/error-report.h"
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
-index d1a7b99add..af588145ff 100644
+index 3e15458335..7dffd5f68c 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
-@@ -458,6 +458,20 @@ SRST
+@@ -456,6 +456,20 @@ SRST
Show the current VM UUID.
ERST
@@ -204,7 +205,7 @@ index d1a7b99add..af588145ff 100644
{
.name = "usernet",
diff --git a/hmp-commands.hx b/hmp-commands.hx
-index 0c7c6f2c16..bf8315f226 100644
+index 0d9241db9e..5f88b8dfaa 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -101,6 +101,35 @@ ERST
@@ -265,10 +266,10 @@ index 2596cc2426..9dda91d65a 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 680ab48b9b..1f74de1d93 100644
+index 25eee758fc..347197d2d7 100644
--- a/meson.build
+++ b/meson.build
-@@ -2162,6 +2162,7 @@ endif
+@@ -2199,6 +2199,7 @@ endif
has_gettid = cc.has_function('gettid')
libuuid = cc.find_library('uuid', required: true)
@@ -277,7 +278,7 @@ index 680ab48b9b..1f74de1d93 100644
# libselinux
selinux = dependency('libselinux',
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
-index bade2a4b92..77a2fa409a 100644
+index 1e66bff724..d2fc956c18 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -22,6 +22,7 @@
@@ -586,7 +587,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..e931cb9203
+index 0000000000..177fb851b4
--- /dev/null
+++ b/pve-backup.c
@@ -0,0 +1,1096 @@
@@ -1117,9 +1118,9 @@ index 0000000000..e931cb9203
+
+ BlockJob *job = backup_job_create(
+ NULL, di->bs, di->target, backup_state.speed, sync_mode, di->bitmap,
-+ bitmap_mode, false, NULL, &backup_state.perf, BLOCKDEV_ON_ERROR_REPORT,
-+ BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn,
-+ &local_err);
++ bitmap_mode, false, false, NULL, &backup_state.perf, BLOCKDEV_ON_ERROR_REPORT,
++ BLOCKDEV_ON_ERROR_REPORT, ON_CBW_ERROR_BREAK_GUEST_WRITE, JOB_DEFAULT,
++ pvebackup_complete_cb, di, backup_state.txn, &local_err);
+
+ bdrv_drained_end(di->bs);
+
@@ -1687,10 +1688,10 @@ index 0000000000..e931cb9203
+ return ret;
+}
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 7f92c80179..5379fde30f 100644
+index e17ef6abdf..a54390d9ad 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -855,6 +855,239 @@
+@@ -879,6 +879,239 @@
{ 'command': 'query-block', 'returns': ['BlockInfo'],
'allow-preconfig': true }
@@ -1931,10 +1932,10 @@ index 7f92c80179..5379fde30f 100644
# @BlockDeviceTimedStats:
#
diff --git a/qapi/common.json b/qapi/common.json
-index 0e3a0bbbfb..554680c716 100644
+index af7e3d618a..dc9ab77310 100644
--- a/qapi/common.json
+++ b/qapi/common.json
-@@ -226,3 +226,17 @@
+@@ -228,3 +228,17 @@
##
{ 'enum': 'EndianMode',
'data': [ 'unspecified', 'little', 'big' ] }
@@ -1953,7 +1954,7 @@ index 0e3a0bbbfb..554680c716 100644
+##
+{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
diff --git a/qapi/machine.json b/qapi/machine.json
-index 12cfd3f260..a8abdb42a3 100644
+index 957ff0f4dd..5628cf4be4 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -4,6 +4,8 @@
@@ -1963,11 +1964,11 @@ index 12cfd3f260..a8abdb42a3 100644
+{ 'include': 'common.json' }
+
##
- # = Machines
+ # ********
+ # Machines
+@@ -299,20 +301,6 @@
##
-@@ -302,20 +304,6 @@
- ##
- { 'command': 'query-target', 'returns': 'TargetInfo' }
+ { 'command': 'query-target', 'returns': 'QemuTargetInfo' }
-##
-# @UuidInfo:
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 618dedd..ef8a531 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 1f74de1d93..8508aab9c9 100644
+index 347197d2d7..c1d9e46dd8 100644
--- a/meson.build
+++ b/meson.build
-@@ -4373,6 +4373,10 @@ if have_tools
+@@ -4537,6 +4537,10 @@ if have_tools
vma = executable('vma', files('vma.c', 'vma-reader.c') + genh,
dependencies: [authz, block, crypto, io, qemuutil, 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 0c0f3f6..e218b53 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
@@ -348,10 +348,10 @@ index 0000000000..3e41421716
+
+block_init(bdrv_pbs_init);
diff --git a/meson.build b/meson.build
-index 8508aab9c9..9c39f54f86 100644
+index c1d9e46dd8..bb1bff44b8 100644
--- a/meson.build
+++ b/meson.build
-@@ -4838,7 +4838,7 @@ summary_info += {'Query Processing Library support': qpl}
+@@ -5010,7 +5010,7 @@ summary_info += {'Query Processing Library support': qpl}
summary_info += {'UADK Library support': uadk}
summary_info += {'qatzip support': qatzip}
summary_info += {'NUMA host support': numa}
@@ -361,10 +361,10 @@ index 8508aab9c9..9c39f54f86 100644
summary_info += {'libdaxctl support': libdaxctl}
summary_info += {'libcbor support': libcbor}
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 5379fde30f..01fb2d899d 100644
+index a54390d9ad..e6b8ba49b2 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -3470,6 +3470,7 @@
+@@ -3534,6 +3534,7 @@
'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum',
'raw', 'rbd',
{ 'name': 'replication', 'if': 'CONFIG_REPLICATION' },
@@ -372,7 +372,7 @@ index 5379fde30f..01fb2d899d 100644
'ssh', 'throttle', 'vdi', 'vhdx',
{ 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' },
{ 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' },
-@@ -3556,6 +3557,33 @@
+@@ -3620,6 +3621,33 @@
{ 'struct': 'BlockdevOptionsNull',
'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } }
@@ -406,7 +406,7 @@ index 5379fde30f..01fb2d899d 100644
##
# @BlockdevOptionsNVMe:
#
-@@ -5003,6 +5031,7 @@
+@@ -5067,6 +5095,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 760ce46..927215e 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(+), 3 deletions(-)
diff --git a/meson.build b/meson.build
-index 9c39f54f86..60af7fa723 100644
+index bb1bff44b8..6b85f32abe 100644
--- a/meson.build
+++ b/meson.build
-@@ -2162,6 +2162,7 @@ endif
+@@ -2199,6 +2199,7 @@ endif
has_gettid = cc.has_function('gettid')
libuuid = cc.find_library('uuid', required: true)
@@ -25,9 +25,9 @@ index 9c39f54f86..60af7fa723 100644
libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true)
# libselinux
-@@ -3766,7 +3767,7 @@ if have_block
- if host_os == 'windows'
- system_ss.add(files('os-win32.c'))
+@@ -3874,7 +3875,7 @@ if have_block
+ elif host_os == 'emscripten'
+ blockdev_ss.add(files('os-wasm.c'))
else
- blockdev_ss.add(files('os-posix.c'))
+ blockdev_ss.add(files('os-posix.c'), libsystemd)
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 bf06ca7..6a08ce2 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 8fd36eba1d..e963e93e71 100644
+index a261f99d89..e8c6a87305 100644
--- a/include/migration/misc.h
+++ b/include/migration/misc.h
@@ -140,4 +140,7 @@ bool multifd_device_state_save_thread_should_exit(void);
@@ -38,7 +38,7 @@ index 8fd36eba1d..e963e93e71 100644
+
#endif
diff --git a/migration/meson.build b/migration/meson.build
-index 46e92249a1..fb3fd7d7d0 100644
+index 409b748980..ca94e7e17b 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -8,6 +8,7 @@ migration_files = files(
@@ -58,10 +58,10 @@ index 46e92249a1..fb3fd7d7d0 100644
'savevm.c',
'savevm-async.c',
diff --git a/migration/migration.c b/migration/migration.c
-index d46e776e24..2f3430f440 100644
+index 10c216d25d..b58cbdc2c0 100644
--- a/migration/migration.c
+++ b/migration/migration.c
-@@ -319,6 +319,7 @@ void migration_object_init(void)
+@@ -340,6 +340,7 @@ void migration_object_init(void)
/* Initialize cpu throttle timers */
cpu_throttle_init();
@@ -180,7 +180,7 @@ index 0000000000..a97187e4d7
+ NULL);
+}
diff --git a/pve-backup.c b/pve-backup.c
-index e931cb9203..366b015589 100644
+index 177fb851b4..7575abab7c 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -1089,6 +1089,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
@@ -192,10 +192,10 @@ index e931cb9203..366b015589 100644
ret->pbs_masterkey = true;
ret->backup_max_workers = true;
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 01fb2d899d..7b32b59717 100644
+index e6b8ba49b2..be6bf25219 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -1008,6 +1008,11 @@
+@@ -1032,6 +1032,11 @@
# @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can
# safely be set for savevm-async.
#
@@ -207,7 +207,7 @@ index 01fb2d899d..7b32b59717 100644
# @pbs-masterkey: True if the QMP backup call supports the 'master_keyfile'
# parameter.
#
-@@ -1021,6 +1026,7 @@
+@@ -1045,6 +1050,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 a8f20ad..34f34c3 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,7 +19,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
-index f2c352d4a7..931a8481e9 100644
+index a061aad817..d5fca0b96a 100644
--- a/migration/block-dirty-bitmap.c
+++ b/migration/block-dirty-bitmap.c
@@ -539,7 +539,11 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
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 773ee14..a187b0d 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,7 +21,7 @@ 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 2f0f4dac09..b523137cff 100644
+index 15b96ee880..5aa4b602b1 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1392,12 +1392,42 @@ static char *get_initiator_name(QemuOpts *opts)
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 9edb3ec..db4a6c2 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 999d9e56d4..e187cd1262 100644
+index c0616b69e2..d023753091 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -27,7 +27,7 @@ enum {
diff --git a/debian/patches/pve/0038-block-add-alloc-track-driver.patch b/debian/patches/pve/0038-block-add-alloc-track-driver.patch
index b582205..3ff3f6c 100644
--- a/debian/patches/pve/0038-block-add-alloc-track-driver.patch
+++ b/debian/patches/pve/0038-block-add-alloc-track-driver.patch
@@ -44,7 +44,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
diff --git a/block/alloc-track.c b/block/alloc-track.c
new file mode 100644
-index 0000000000..718aaabf2a
+index 0000000000..02ff45b624
--- /dev/null
+++ b/block/alloc-track.c
@@ -0,0 +1,343 @@
@@ -295,7 +295,7 @@ index 0000000000..718aaabf2a
+}
+
+static int coroutine_fn GRAPH_RDLOCK
-+track_co_block_status(BlockDriverState *bs, bool want_zero,
++track_co_block_status(BlockDriverState *bs, unsigned int mode,
+ int64_t offset,
+ int64_t bytes,
+ int64_t *pnum,
@@ -404,10 +404,10 @@ index d243372c41..9b45b5256d 100644
'backup.c',
'backup-dump.c',
diff --git a/block/stream.c b/block/stream.c
-index e187cd1262..0b61029399 100644
+index d023753091..a777c8079c 100644
--- a/block/stream.c
+++ b/block/stream.c
-@@ -120,6 +120,40 @@ static int stream_prepare(Job *job)
+@@ -118,6 +118,40 @@ static int GRAPH_UNLOCKED stream_prepare(Job *job)
ret = -EPERM;
goto out;
}
@@ -449,10 +449,10 @@ index e187cd1262..0b61029399 100644
out:
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 7b32b59717..8d912dc96b 100644
+index be6bf25219..cbefc6d0d3 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -3462,7 +3462,8 @@
+@@ -3526,7 +3526,8 @@
# Since: 2.9
##
{ 'enum': 'BlockdevDriver',
@@ -462,7 +462,7 @@ index 7b32b59717..8d912dc96b 100644
'cloop', 'compress', 'copy-before-write', 'copy-on-read', 'dmg',
'file', 'snapshot-access', 'ftp', 'ftps',
{'name': 'gluster', 'features': [ 'deprecated' ] },
-@@ -3563,6 +3564,21 @@
+@@ -3627,6 +3628,21 @@
{ 'struct': 'BlockdevOptionsNull',
'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } }
@@ -484,7 +484,7 @@ index 7b32b59717..8d912dc96b 100644
##
# @BlockdevOptionsPbs:
#
-@@ -5009,6 +5025,7 @@
+@@ -5073,6 +5089,7 @@
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
'discriminator': 'driver',
'data': {
diff --git a/debian/patches/pve/0042-PVE-backup-add-fleecing-option.patch b/debian/patches/pve/0039-PVE-backup-add-fleecing-option.patch
similarity index 95%
rename from debian/patches/pve/0042-PVE-backup-add-fleecing-option.patch
rename to debian/patches/pve/0039-PVE-backup-add-fleecing-option.patch
index 12c60c7..3edb41d 100644
--- a/debian/patches/pve/0042-PVE-backup-add-fleecing-option.patch
+++ b/debian/patches/pve/0039-PVE-backup-add-fleecing-option.patch
@@ -72,7 +72,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
5 files changed, 195 insertions(+), 10 deletions(-)
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
-index fd470f5f92..5c23b578ef 100644
+index 36d5d3ed9b..6813d1a929 100644
--- a/block/copy-before-write.c
+++ b/block/copy-before-write.c
@@ -27,6 +27,7 @@
@@ -122,7 +122,7 @@ index fd470f5f92..5c23b578ef 100644
g_free(req);
return NULL;
}
-@@ -595,6 +595,12 @@ void bdrv_cbw_drop(BlockDriverState *bs)
+@@ -597,6 +597,12 @@ void bdrv_cbw_drop(BlockDriverState *bs)
bdrv_unref(bs);
}
@@ -136,21 +136,21 @@ index fd470f5f92..5c23b578ef 100644
{
bdrv_register(&bdrv_cbw_filter);
diff --git a/block/copy-before-write.h b/block/copy-before-write.h
-index 2a5d4ba693..969da3620f 100644
+index eb93364e85..6a6dbf90f5 100644
--- a/block/copy-before-write.h
+++ b/block/copy-before-write.h
-@@ -44,5 +44,6 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
- BlockCopyState **bcs,
+@@ -45,5 +45,6 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
+ OnCbwError on_cbw_error,
Error **errp);
void bdrv_cbw_drop(BlockDriverState *bs);
+int bdrv_cbw_snapshot_error(BlockDriverState *bs);
#endif /* COPY_BEFORE_WRITE_H */
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
-index 4f30f99644..66d16d342f 100644
+index bbb08ecabd..d8771ce8fc 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
-@@ -1045,6 +1045,7 @@ void coroutine_fn hmp_backup(Monitor *mon, const QDict *qdict)
+@@ -1050,6 +1050,7 @@ void coroutine_fn hmp_backup(Monitor *mon, const QDict *qdict)
NULL, NULL,
devlist, qdict_haskey(qdict, "speed"), speed,
false, 0, // BackupPerf max-workers
@@ -159,7 +159,7 @@ index 4f30f99644..66d16d342f 100644
hmp_handle_error(mon, error);
diff --git a/pve-backup.c b/pve-backup.c
-index 366b015589..9b66788ab5 100644
+index 7575abab7c..8b83465ebd 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -7,6 +7,7 @@
@@ -336,11 +336,11 @@ index 366b015589..9b66788ab5 100644
+
BlockJob *job = backup_job_create(
- NULL, di->bs, di->target, backup_state.speed, sync_mode, di->bitmap,
-- bitmap_mode, false, NULL, &backup_state.perf, BLOCKDEV_ON_ERROR_REPORT,
+- bitmap_mode, false, false, NULL, &backup_state.perf, BLOCKDEV_ON_ERROR_REPORT,
+ di->device_name, source_bs, di->target, backup_state.speed, sync_mode, di->bitmap,
+ bitmap_mode, false, discard_source, NULL, &perf, BLOCKDEV_ON_ERROR_REPORT,
- BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn,
- &local_err);
+ BLOCKDEV_ON_ERROR_REPORT, ON_CBW_ERROR_BREAK_GUEST_WRITE, JOB_DEFAULT,
+ pvebackup_complete_cb, di, backup_state.txn, &local_err);
@@ -539,6 +672,7 @@ static void create_backup_jobs_bh(void *opaque) {
}
@@ -429,10 +429,10 @@ index 366b015589..9b66788ab5 100644
return ret;
}
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 8d912dc96b..ba2a13e668 100644
+index cbefc6d0d3..7cafc96616 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -952,6 +952,10 @@
+@@ -976,6 +976,10 @@
#
# @max-workers: see @BackupPerf for details. Default 16.
#
@@ -443,7 +443,7 @@ index 8d912dc96b..ba2a13e668 100644
# Returns: the uuid of the backup job
#
##
-@@ -972,7 +976,8 @@
+@@ -996,7 +1000,8 @@
'*firewall-file': 'str',
'*devlist': 'str',
'*speed': 'int',
@@ -453,7 +453,7 @@ index 8d912dc96b..ba2a13e668 100644
'returns': 'UuidInfo', 'coroutine': true }
##
-@@ -1018,6 +1023,8 @@
+@@ -1042,6 +1047,8 @@
#
# @pbs-library-version: Running version of libproxmox-backup-qemu0 library.
#
@@ -462,7 +462,7 @@ index 8d912dc96b..ba2a13e668 100644
# @backup-max-workers: Whether the 'max-workers' @BackupPerf setting is
# supported or not.
#
-@@ -1029,6 +1036,7 @@
+@@ -1053,6 +1060,7 @@
'pbs-dirty-bitmap-migration': 'bool',
'pbs-masterkey': 'bool',
'pbs-library-version': 'str',
diff --git a/debian/patches/pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch b/debian/patches/pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
deleted file mode 100644
index a47e99d..0000000
--- a/debian/patches/pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fabian Ebner <f.ebner@proxmox.com>
-Date: Thu, 23 Jun 2022 14:00:05 +0200
-Subject: [PATCH] Revert "block/rbd: workaround for ceph issue #53784"
-
-This reverts commit fc176116cdea816ceb8dd969080b2b95f58edbc0 in
-preparation to revert 0347a8fd4c3faaedf119be04c197804be40a384b.
-
-Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- block/rbd.c | 42 ++----------------------------------------
- 1 file changed, 2 insertions(+), 40 deletions(-)
-
-diff --git a/block/rbd.c b/block/rbd.c
-index bf143fac00..70d92966f7 100644
---- a/block/rbd.c
-+++ b/block/rbd.c
-@@ -1515,7 +1515,6 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
- int status, r;
- RBDDiffIterateReq req = { .offs = offset };
- uint64_t features, flags;
-- uint64_t head = 0;
-
- assert(offset + bytes <= s->image_size);
-
-@@ -1543,43 +1542,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
- return status;
- }
-
--#if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 17, 0)
-- /*
-- * librbd had a bug until early 2022 that affected all versions of ceph that
-- * supported fast-diff. This bug results in reporting of incorrect offsets
-- * if the offset parameter to rbd_diff_iterate2 is not object aligned.
-- * Work around this bug by rounding down the offset to object boundaries.
-- * This is OK because we call rbd_diff_iterate2 with whole_object = true.
-- * However, this workaround only works for non cloned images with default
-- * striping.
-- *
-- * See: https://tracker.ceph.com/issues/53784
-- */
--
-- /* check if RBD image has non-default striping enabled */
-- if (features & RBD_FEATURE_STRIPINGV2) {
-- return status;
-- }
--
--#pragma GCC diagnostic push
--#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-- /*
-- * check if RBD image is a clone (= has a parent).
-- *
-- * rbd_get_parent_info is deprecated from Nautilus onwards, but the
-- * replacement rbd_get_parent is not present in Luminous and Mimic.
-- */
-- if (rbd_get_parent_info(s->image, NULL, 0, NULL, 0, NULL, 0) != -ENOENT) {
-- return status;
-- }
--#pragma GCC diagnostic pop
--
-- head = req.offs & (s->object_size - 1);
-- req.offs -= head;
-- bytes += head;
--#endif
--
-- r = rbd_diff_iterate2(s->image, NULL, req.offs, bytes, true, true,
-+ r = rbd_diff_iterate2(s->image, NULL, offset, bytes, true, true,
- qemu_rbd_diff_iterate_cb, &req);
- if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) {
- return status;
-@@ -1598,8 +1561,7 @@ static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
- status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID;
- }
-
-- assert(req.bytes > head);
-- *pnum = req.bytes - head;
-+ *pnum = req.bytes;
- return status;
- }
-
diff --git a/debian/patches/pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch b/debian/patches/pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
deleted file mode 100644
index 6659112..0000000
--- a/debian/patches/pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fabian Ebner <f.ebner@proxmox.com>
-Date: Thu, 23 Jun 2022 14:00:07 +0200
-Subject: [PATCH] Revert "block/rbd: fix handling of holes in
- .bdrv_co_block_status"
-
-This reverts commit 9e302f64bb407a9bb097b626da97228c2654cfee in
-preparation to revert 0347a8fd4c3faaedf119be04c197804be40a384b.
-
-Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- block/rbd.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/block/rbd.c b/block/rbd.c
-index 70d92966f7..931b513828 100644
---- a/block/rbd.c
-+++ b/block/rbd.c
-@@ -1474,11 +1474,11 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
- RBDDiffIterateReq *req = opaque;
-
- assert(req->offs + req->bytes <= offs);
--
-- /* treat a hole like an unallocated area and bail out */
-- if (!exists) {
-- return 0;
-- }
-+ /*
-+ * we do not diff against a snapshot so we should never receive a callback
-+ * for a hole.
-+ */
-+ assert(exists);
-
- if (!req->exists && offs > req->offs) {
- /*
diff --git a/debian/patches/pve/0043-adapt-machine-version-deprecation-for-Proxmox-VE.patch b/debian/patches/pve/0040-adapt-machine-version-deprecation-for-Proxmox-VE.patch
similarity index 70%
rename from debian/patches/pve/0043-adapt-machine-version-deprecation-for-Proxmox-VE.patch
rename to debian/patches/pve/0040-adapt-machine-version-deprecation-for-Proxmox-VE.patch
index 272133f..5701668 100644
--- a/debian/patches/pve/0043-adapt-machine-version-deprecation-for-Proxmox-VE.patch
+++ b/debian/patches/pve/0040-adapt-machine-version-deprecation-for-Proxmox-VE.patch
@@ -18,24 +18,27 @@ single major PVE release.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
- include/hw/boards.h | 78 +++++++++++++++++++++++++++++----------------
- 1 file changed, 51 insertions(+), 27 deletions(-)
+ include/hw/boards.h | 99 ++++++++++++++++++++++++++-------------------
+ 1 file changed, 58 insertions(+), 41 deletions(-)
diff --git a/include/hw/boards.h b/include/hw/boards.h
-index 8ada4d5832..6bfc2a7961 100644
+index 7a389f6998..0595a569d2 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
-@@ -636,42 +636,66 @@ struct MachineState {
+@@ -636,40 +636,57 @@ struct MachineState {
/*
- * How many years/major releases for each phase
- * of the life cycle. Assumes use of versioning
-- * scheme where major is bumped each year
+- * scheme where major is bumped each year.
+ * Baseline of machine versions that are still considered supported throughout
+ * current major Proxmox VE release. Machine versions older than this are
+ * considered to be deprecated in Proxmox VE.
-+ *
+ *
+- * These values must match the ver_machine_deprecation_version
+- * and ver_machine_deletion_version logic in docs/conf.py and
+- * the text in docs/about/deprecated.rst
+ * Machine versions older than 6 years are removed just like in upstream QEMU.
+ * (policy takes effect with QEMU 10.1). Assumes yearly major QEMU release.
+ *
@@ -55,16 +58,13 @@ index 8ada4d5832..6bfc2a7961 100644
+/*
+ * Proxmox VE needs to support the baseline throughout a major PVE release. So
+ * a QEMU release where the baseline is already deleted cannot be used.
-+ * Removal policy after 6 years takes effect with QEMU 10.1.
*/
-#define MACHINE_VER_DELETION_MAJOR 6
-#define MACHINE_VER_DEPRECATION_MAJOR 3
-+#if ((QEMU_VERSION_MAJOR > 10) || ((QEMU_VERSION_MAJOR == 10) && (QEMU_VERSION_MINOR >= 1)))
+#if ((MACHINE_VER_BASELINE_PVE_MAJOR < MACHINE_VER_DELETION_MAJOR) || \
+ ((MACHINE_VER_BASELINE_PVE_MAJOR == MACHINE_VER_DELETION_MAJOR) && \
+ (MACHINE_VER_BASELINE_PVE_MINOR < MACHINE_VER_DELETION_MINOR)))
+#error "Baseline machine version needed by Proxmox VE not supported anymore by this QEMU release"
-+#endif
+#endif
/*
@@ -75,11 +75,51 @@ index 8ada4d5832..6bfc2a7961 100644
- "machines more than " stringify(MACHINE_VER_DEPRECATION_MAJOR) \
- " years old are subject to deletion after " \
- stringify(MACHINE_VER_DELETION_MAJOR) " years"
--
--#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \
++ "old machine version is subject to deletion during current major Proxmox VE release"
+
+-#define _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor) \
- (((QEMU_VERSION_MAJOR - major) > cutoff) || \
- (((QEMU_VERSION_MAJOR - major) == cutoff) && \
- (QEMU_VERSION_MINOR - minor) >= 0))
++#define _MACHINE_VER_IS_CURRENT_EXPIRED(baseline_major, baseline_minor, major, minor) \
++ ((major < baseline_major) || \
++ ((major == baseline_major) && \
++ (minor < baseline_minor)))
+
+-#define _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(cutoff, major, minor) \
+- (((QEMU_VERSION_MAJOR - major) > cutoff) || \
+- (((QEMU_VERSION_MAJOR - major) == cutoff) && \
+- ((QEMU_VERSION_MINOR + 1) - minor) >= 0))
++#define _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(baseline_major, baseline_minor, major, minor) \
++ ((major < baseline_major) || \
++ ((major == baseline_major) && \
++ ((minor + 1) < baseline_minor)))
+
+-#define _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(cutoff, major, minor) \
+- ((((QEMU_VERSION_MAJOR + 1) - major) > cutoff) || \
+- ((((QEMU_VERSION_MAJOR + 1) - major) == cutoff) && \
+- (0 - minor) >= 0))
++#define _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(baseline_major, baseline_minor, major, minor) \
++ (((major + 1) < baseline_major) || \
++ (((major + 1) == baseline_major) && \
++ (minor < baseline_minor)))
+
+ /*
+ * - The first check applies to formal releases
+@@ -684,29 +701,29 @@ struct MachineState {
+ * and dev snapshots / release candidates are numbered with micro >= 50
+ * If this ever changes the logic below will need modifying....
+ */
+-#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \
++#define _MACHINE_VER_IS_EXPIRED_IMPL(baseline_major, baseline_minor, major, minor) \
+ ((QEMU_VERSION_MICRO < 50 && \
+- _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor)) || \
++ _MACHINE_VER_IS_CURRENT_EXPIRED(baseline_major, baseline_minor, major, minor)) || \
+ (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR < 2 && \
+- _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(cutoff, major, minor)) || \
++ _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(baseline_major, baseline_minor, major, minor)) || \
+ (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR == 2 && \
+- _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(cutoff, major, minor)))
-
-#define _MACHINE_VER_IS_EXPIRED2(cutoff, major, minor) \
- _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
@@ -91,12 +131,7 @@ index 8ada4d5832..6bfc2a7961 100644
- _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
-
-#define _MACHINE_IS_EXPIRED(cutoff, ...) \
-+ "old machine version is subject to deletion during current major Proxmox VE release"
-+
-+#define _MACHINE_VER_IS_EXPIRED_IMPL(baseline_major, baseline_minor, major, minor) \
-+ ((major < baseline_major) || \
-+ ((major == baseline_major) && \
-+ (minor < baseline_minor)))
++ _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(baseline_major, baseline_minor, major, minor)))
+
+#define _MACHINE_VER_IS_EXPIRED2(baseline_major, baseline_minor, major, minor) \
+ _MACHINE_VER_IS_EXPIRED_IMPL(baseline_major, baseline_minor, major, minor)
@@ -117,7 +152,7 @@ index 8ada4d5832..6bfc2a7961 100644
/*
* Evaluates true when a machine type with (major, minor)
-@@ -680,7 +704,7 @@ struct MachineState {
+@@ -715,7 +732,7 @@ struct MachineState {
* lifecycle rules
*/
#define MACHINE_VER_IS_DEPRECATED(...) \
@@ -126,7 +161,7 @@ index 8ada4d5832..6bfc2a7961 100644
/*
* Evaluates true when a machine type with (major, minor)
-@@ -689,7 +713,7 @@ struct MachineState {
+@@ -724,7 +741,7 @@ struct MachineState {
* lifecycle rules
*/
#define MACHINE_VER_SHOULD_DELETE(...) \
diff --git a/debian/patches/pve/0051-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch b/debian/patches/pve/0041-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
similarity index 98%
rename from debian/patches/pve/0051-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
rename to debian/patches/pve/0041-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
index 83aa736..6460abf 100644
--- a/debian/patches/pve/0051-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
+++ b/debian/patches/pve/0041-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
@@ -12,7 +12,7 @@ Reviewed-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/pve-backup.c b/pve-backup.c
-index 9b66788ab5..588ee98ffc 100644
+index 8b83465ebd..3e0d1ffc5c 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -811,6 +811,23 @@ err:
diff --git a/debian/patches/pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch b/debian/patches/pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch
deleted file mode 100644
index 9ed49f1..0000000
--- a/debian/patches/pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fabian Ebner <f.ebner@proxmox.com>
-Date: Tue, 17 May 2022 09:46:02 +0200
-Subject: [PATCH] Revert "block/rbd: implement bdrv_co_block_status"
-
-During backup, bdrv_co_block_status is called for each block copy
-chunk. When RBD is used, the current implementation with
-rbd_diff_iterate2() using whole_object=true takes about linearly more
-time, depending on the image size. Since there are linearly more
-chunks, the slowdown is quadratic, becoming unacceptable for large
-images (starting somewhere between 500-1000 GiB in my testing).
-
-This reverts commit 0347a8fd4c3faaedf119be04c197804be40a384b as a
-stop-gap measure, until it's clear how to make the implemenation
-more efficient.
-
-Upstream bug report:
-https://gitlab.com/qemu-project/qemu/-/issues/1026
-
-Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
----
- block/rbd.c | 112 ----------------------------------------------------
- 1 file changed, 112 deletions(-)
-
-diff --git a/block/rbd.c b/block/rbd.c
-index 931b513828..4ab9bb5e02 100644
---- a/block/rbd.c
-+++ b/block/rbd.c
-@@ -108,12 +108,6 @@ typedef struct RBDTask {
- int64_t ret;
- } RBDTask;
-
--typedef struct RBDDiffIterateReq {
-- uint64_t offs;
-- uint64_t bytes;
-- bool exists;
--} RBDDiffIterateReq;
--
- static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
- BlockdevOptionsRbd *opts, bool cache,
- const char *keypairs, const char *secretid,
-@@ -1460,111 +1454,6 @@ static ImageInfoSpecific *qemu_rbd_get_specific_info(BlockDriverState *bs,
- return spec_info;
- }
-
--/*
-- * rbd_diff_iterate2 allows to interrupt the exection by returning a negative
-- * value in the callback routine. Choose a value that does not conflict with
-- * an existing exitcode and return it if we want to prematurely stop the
-- * execution because we detected a change in the allocation status.
-- */
--#define QEMU_RBD_EXIT_DIFF_ITERATE2 -9000
--
--static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
-- int exists, void *opaque)
--{
-- RBDDiffIterateReq *req = opaque;
--
-- assert(req->offs + req->bytes <= offs);
-- /*
-- * we do not diff against a snapshot so we should never receive a callback
-- * for a hole.
-- */
-- assert(exists);
--
-- if (!req->exists && offs > req->offs) {
-- /*
-- * we started in an unallocated area and hit the first allocated
-- * block. req->bytes must be set to the length of the unallocated area
-- * before the allocated area. stop further processing.
-- */
-- req->bytes = offs - req->offs;
-- return QEMU_RBD_EXIT_DIFF_ITERATE2;
-- }
--
-- if (req->exists && offs > req->offs + req->bytes) {
-- /*
-- * we started in an allocated area and jumped over an unallocated area,
-- * req->bytes contains the length of the allocated area before the
-- * unallocated area. stop further processing.
-- */
-- return QEMU_RBD_EXIT_DIFF_ITERATE2;
-- }
--
-- req->bytes += len;
-- req->exists = true;
--
-- return 0;
--}
--
--static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
-- bool want_zero, int64_t offset,
-- int64_t bytes, int64_t *pnum,
-- int64_t *map,
-- BlockDriverState **file)
--{
-- BDRVRBDState *s = bs->opaque;
-- int status, r;
-- RBDDiffIterateReq req = { .offs = offset };
-- uint64_t features, flags;
--
-- assert(offset + bytes <= s->image_size);
--
-- /* default to all sectors allocated */
-- status = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID;
-- *map = offset;
-- *file = bs;
-- *pnum = bytes;
--
-- /* check if RBD image supports fast-diff */
-- r = rbd_get_features(s->image, &features);
-- if (r < 0) {
-- return status;
-- }
-- if (!(features & RBD_FEATURE_FAST_DIFF)) {
-- return status;
-- }
--
-- /* check if RBD fast-diff result is valid */
-- r = rbd_get_flags(s->image, &flags);
-- if (r < 0) {
-- return status;
-- }
-- if (flags & RBD_FLAG_FAST_DIFF_INVALID) {
-- return status;
-- }
--
-- r = rbd_diff_iterate2(s->image, NULL, offset, bytes, true, true,
-- qemu_rbd_diff_iterate_cb, &req);
-- if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) {
-- return status;
-- }
-- assert(req.bytes <= bytes);
-- if (!req.exists) {
-- if (r == 0) {
-- /*
-- * rbd_diff_iterate2 does not invoke callbacks for unallocated
-- * areas. This here catches the case where no callback was
-- * invoked at all (req.bytes == 0).
-- */
-- assert(req.bytes == 0);
-- req.bytes = bytes;
-- }
-- status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID;
-- }
--
-- *pnum = req.bytes;
-- return status;
--}
--
- static int64_t coroutine_fn qemu_rbd_co_getlength(BlockDriverState *bs)
- {
- BDRVRBDState *s = bs->opaque;
-@@ -1801,7 +1690,6 @@ static BlockDriver bdrv_rbd = {
- #ifdef LIBRBD_SUPPORTS_WRITE_ZEROES
- .bdrv_co_pwrite_zeroes = qemu_rbd_co_pwrite_zeroes,
- #endif
-- .bdrv_co_block_status = qemu_rbd_co_block_status,
-
- .bdrv_snapshot_create = qemu_rbd_snap_create,
- .bdrv_snapshot_delete = qemu_rbd_snap_remove,
diff --git a/debian/patches/pve/0052-PVE-backup-factor-out-helper-to-initialize-backup-st.patch b/debian/patches/pve/0042-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
similarity index 98%
rename from debian/patches/pve/0052-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
rename to debian/patches/pve/0042-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
index 8cebc9f..7963782 100644
--- a/debian/patches/pve/0052-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
+++ b/debian/patches/pve/0042-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
@@ -12,7 +12,7 @@ Reviewed-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
1 file changed, 38 insertions(+), 24 deletions(-)
diff --git a/pve-backup.c b/pve-backup.c
-index 588ee98ffc..3be9930ad3 100644
+index 3e0d1ffc5c..cc71279518 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -828,6 +828,43 @@ static void clear_backup_state_bitmap_list(void) {
diff --git a/debian/patches/pve/0053-PVE-backup-add-target-ID-in-backup-state.patch b/debian/patches/pve/0043-PVE-backup-add-target-ID-in-backup-state.patch
similarity index 98%
rename from debian/patches/pve/0053-PVE-backup-add-target-ID-in-backup-state.patch
rename to debian/patches/pve/0043-PVE-backup-add-target-ID-in-backup-state.patch
index b7d3a2c..1eef4b2 100644
--- a/debian/patches/pve/0053-PVE-backup-add-target-ID-in-backup-state.patch
+++ b/debian/patches/pve/0043-PVE-backup-add-target-ID-in-backup-state.patch
@@ -15,7 +15,7 @@ Reviewed-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/pve-backup.c b/pve-backup.c
-index 3be9930ad3..87778f7e76 100644
+index cc71279518..5f0ad5042f 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -70,6 +70,7 @@ static struct PVEBackupState {
diff --git a/debian/patches/pve/0054-PVE-backup-get-device-info-allow-caller-to-specify-f.patch b/debian/patches/pve/0044-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
similarity index 98%
rename from debian/patches/pve/0054-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
rename to debian/patches/pve/0044-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
index 6011524..6179f3e 100644
--- a/debian/patches/pve/0054-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
+++ b/debian/patches/pve/0044-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
@@ -15,7 +15,7 @@ Reviewed-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/pve-backup.c b/pve-backup.c
-index 87778f7e76..bd81621d51 100644
+index 5f0ad5042f..7718065c63 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -719,7 +719,7 @@ static void create_backup_jobs_bh(void *opaque) {
diff --git a/debian/patches/pve/0044-Revert-hpet-avoid-timer-storms-on-periodic-timers.patch b/debian/patches/pve/0044-Revert-hpet-avoid-timer-storms-on-periodic-timers.patch
deleted file mode 100644
index e4bbb4b..0000000
--- a/debian/patches/pve/0044-Revert-hpet-avoid-timer-storms-on-periodic-timers.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:05 +0100
-Subject: [PATCH] Revert "hpet: avoid timer storms on periodic timers"
-
-This reverts commit 7c912ffb59e8137091894d767433e65c3df8b0bf.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 13 ++-----------
- 1 file changed, 2 insertions(+), 11 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index ccb97b6806..0f45af8bbe 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -61,7 +61,6 @@ typedef struct HPETTimer { /* timers */
- uint8_t wrap_flag; /* timer pop will indicate wrap for one-shot 32-bit
- * mode. Next pop will be actual timer expiration.
- */
-- uint64_t last; /* last value armed, to avoid timer storms */
- } HPETTimer;
-
- struct HPETState {
-@@ -262,7 +261,6 @@ static int hpet_post_load(void *opaque, int version_id)
- for (i = 0; i < s->num_timers; i++) {
- HPETTimer *t = &s->timer[i];
- t->cmp64 = hpet_calculate_cmp64(t, s->hpet_counter, t->cmp);
-- t->last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - NANOSECONDS_PER_SECOND;
- }
- /* Recalculate the offset between the main counter and guest time */
- if (!s->hpet_offset_saved) {
-@@ -350,15 +348,8 @@ static const VMStateDescription vmstate_hpet = {
-
- static void hpet_arm(HPETTimer *t, uint64_t tick)
- {
-- uint64_t ns = hpet_get_ns(t->state, tick);
--
-- /* Clamp period to reasonable min value (1 us) */
-- if (timer_is_periodic(t) && ns - t->last < 1000) {
-- ns = t->last + 1000;
-- }
--
-- t->last = ns;
-- timer_mod(t->qemu_timer, ns);
-+ /* FIXME: Clamp period to reasonable min value? */
-+ timer_mod(t->qemu_timer, hpet_get_ns(t->state, tick));
- }
-
- /*
diff --git a/debian/patches/pve/0055-PVE-backup-implement-backup-access-setup-and-teardow.patch b/debian/patches/pve/0045-PVE-backup-implement-backup-access-setup-and-teardow.patch
similarity index 99%
rename from debian/patches/pve/0055-PVE-backup-implement-backup-access-setup-and-teardow.patch
rename to debian/patches/pve/0045-PVE-backup-implement-backup-access-setup-and-teardow.patch
index 901442c..b8f3632 100644
--- a/debian/patches/pve/0055-PVE-backup-implement-backup-access-setup-and-teardow.patch
+++ b/debian/patches/pve/0045-PVE-backup-implement-backup-access-setup-and-teardow.patch
@@ -90,7 +90,7 @@ Reviewed-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
create mode 100644 pve-backup.h
diff --git a/pve-backup.c b/pve-backup.c
-index bd81621d51..0450303017 100644
+index 7718065c63..da4995d368 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -1,4 +1,5 @@
@@ -740,10 +740,10 @@ index 0000000000..9ebeef7c8f
+
+#endif /* PVE_BACKUP_H */
diff --git a/qapi/block-core.json b/qapi/block-core.json
-index ba2a13e668..07c5773717 100644
+index 7cafc96616..adb94bebb4 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
-@@ -1023,6 +1023,9 @@
+@@ -1047,6 +1047,9 @@
#
# @pbs-library-version: Running version of libproxmox-backup-qemu0 library.
#
@@ -753,7 +753,7 @@ index ba2a13e668..07c5773717 100644
# @backup-fleecing: Whether backup fleecing is supported or not.
#
# @backup-max-workers: Whether the 'max-workers' @BackupPerf setting is
-@@ -1036,6 +1039,7 @@
+@@ -1060,6 +1063,7 @@
'pbs-dirty-bitmap-migration': 'bool',
'pbs-masterkey': 'bool',
'pbs-library-version': 'str',
@@ -761,7 +761,7 @@ index ba2a13e668..07c5773717 100644
'backup-fleecing': 'bool',
'backup-max-workers': 'bool' } }
-@@ -1067,9 +1071,16 @@
+@@ -1091,9 +1095,16 @@
# base snapshot did not match the base given for the current job or
# the crypt mode has changed.
#
@@ -779,7 +779,7 @@ index ba2a13e668..07c5773717 100644
##
# @PBSBitmapInfo:
-@@ -1102,6 +1113,92 @@
+@@ -1126,6 +1137,92 @@
##
{ 'command': 'query-pbs-bitmap-info', 'returns': ['PBSBitmapInfo'] }
@@ -873,7 +873,7 @@ index ba2a13e668..07c5773717 100644
# @BlockDeviceTimedStats:
#
diff --git a/system/runstate.c b/system/runstate.c
-index 272801d307..cf775213bd 100644
+index 6178b0091a..5f370ddb60 100644
--- a/system/runstate.c
+++ b/system/runstate.c
@@ -60,6 +60,7 @@
@@ -884,7 +884,7 @@ index 272801d307..cf775213bd 100644
static NotifierList exit_notifiers =
NOTIFIER_LIST_INITIALIZER(exit_notifiers);
-@@ -921,6 +922,11 @@ void qemu_cleanup(int status)
+@@ -991,6 +992,11 @@ void qemu_cleanup(int status)
* requests happening from here on anyway.
*/
bdrv_drain_all_begin();
diff --git a/debian/patches/pve/0045-Revert-hpet-store-full-64-bit-target-value-of-the-co.patch b/debian/patches/pve/0045-Revert-hpet-store-full-64-bit-target-value-of-the-co.patch
deleted file mode 100644
index c366356..0000000
--- a/debian/patches/pve/0045-Revert-hpet-store-full-64-bit-target-value-of-the-co.patch
+++ /dev/null
@@ -1,202 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:08 +0100
-Subject: [PATCH] Revert "hpet: store full 64-bit target value of the counter"
-
-This reverts commit 242d665396407f83a6acbffc804882eeb21cfdad.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 109 +++++++++++++++++++++++++++---------------------
- 1 file changed, 61 insertions(+), 48 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index 0f45af8bbe..635a060d38 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -56,7 +56,6 @@ typedef struct HPETTimer { /* timers */
- uint64_t cmp; /* comparator */
- uint64_t fsb; /* FSB route */
- /* Hidden register state */
-- uint64_t cmp64; /* comparator (extended to counter width) */
- uint64_t period; /* Last value written to comparator */
- uint8_t wrap_flag; /* timer pop will indicate wrap for one-shot 32-bit
- * mode. Next pop will be actual timer expiration.
-@@ -119,6 +118,11 @@ static uint32_t timer_enabled(HPETTimer *t)
- }
-
- static uint32_t hpet_time_after(uint64_t a, uint64_t b)
-+{
-+ return ((int32_t)(b - a) < 0);
-+}
-+
-+static uint32_t hpet_time_after64(uint64_t a, uint64_t b)
- {
- return ((int64_t)(b - a) < 0);
- }
-@@ -155,32 +159,27 @@ static uint64_t hpet_get_ticks(HPETState *s)
- return ns_to_ticks(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->hpet_offset);
- }
-
--static uint64_t hpet_get_ns(HPETState *s, uint64_t tick)
--{
-- return ticks_to_ns(tick) - s->hpet_offset;
--}
--
- /*
-- * calculate next value of the general counter that matches the
-- * target (either entirely, or the low 32-bit only depending on
-- * the timer mode).
-+ * calculate diff between comparator value and current ticks
- */
--static uint64_t hpet_calculate_cmp64(HPETTimer *t, uint64_t cur_tick, uint64_t target)
-+static inline uint64_t hpet_calculate_diff(HPETTimer *t, uint64_t current)
- {
-+
- if (t->config & HPET_TN_32BIT) {
-- uint64_t result = deposit64(cur_tick, 0, 32, target);
-- if (result < cur_tick) {
-- result += 0x100000000ULL;
-- }
-- return result;
-+ uint32_t diff, cmp;
-+
-+ cmp = (uint32_t)t->cmp;
-+ diff = cmp - (uint32_t)current;
-+ diff = (int32_t)diff > 0 ? diff : (uint32_t)1;
-+ return (uint64_t)diff;
- } else {
-- return target;
-- }
--}
-+ uint64_t diff, cmp;
-
--static uint64_t hpet_next_wrap(uint64_t cur_tick)
--{
-- return (cur_tick | 0xffffffffU) + 1;
-+ cmp = t->cmp;
-+ diff = cmp - current;
-+ diff = (int64_t)diff > 0 ? diff : (uint64_t)1;
-+ return diff;
-+ }
- }
-
- static void update_irq(struct HPETTimer *timer, int set)
-@@ -256,12 +255,7 @@ static bool hpet_validate_num_timers(void *opaque, int version_id)
- static int hpet_post_load(void *opaque, int version_id)
- {
- HPETState *s = opaque;
-- int i;
-
-- for (i = 0; i < s->num_timers; i++) {
-- HPETTimer *t = &s->timer[i];
-- t->cmp64 = hpet_calculate_cmp64(t, s->hpet_counter, t->cmp);
-- }
- /* Recalculate the offset between the main counter and guest time */
- if (!s->hpet_offset_saved) {
- s->hpet_offset = ticks_to_ns(s->hpet_counter)
-@@ -346,10 +340,14 @@ static const VMStateDescription vmstate_hpet = {
- }
- };
-
--static void hpet_arm(HPETTimer *t, uint64_t tick)
-+static void hpet_arm(HPETTimer *t, uint64_t ticks)
- {
-- /* FIXME: Clamp period to reasonable min value? */
-- timer_mod(t->qemu_timer, hpet_get_ns(t->state, tick));
-+ if (ticks < ns_to_ticks(INT64_MAX / 2)) {
-+ timer_mod(t->qemu_timer,
-+ qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ticks_to_ns(ticks));
-+ } else {
-+ timer_del(t->qemu_timer);
-+ }
- }
-
- /*
-@@ -358,44 +356,54 @@ static void hpet_arm(HPETTimer *t, uint64_t tick)
- static void hpet_timer(void *opaque)
- {
- HPETTimer *t = opaque;
-+ uint64_t diff;
-+
- uint64_t period = t->period;
- uint64_t cur_tick = hpet_get_ticks(t->state);
-
- if (timer_is_periodic(t) && period != 0) {
-- while (hpet_time_after(cur_tick, t->cmp64)) {
-- t->cmp64 += period;
-- }
- if (t->config & HPET_TN_32BIT) {
-- t->cmp = (uint32_t)t->cmp64;
-+ while (hpet_time_after(cur_tick, t->cmp)) {
-+ t->cmp = (uint32_t)(t->cmp + t->period);
-+ }
- } else {
-- t->cmp = t->cmp64;
-+ while (hpet_time_after64(cur_tick, t->cmp)) {
-+ t->cmp += period;
-+ }
-+ }
-+ diff = hpet_calculate_diff(t, cur_tick);
-+ hpet_arm(t, diff);
-+ } else if (t->config & HPET_TN_32BIT && !timer_is_periodic(t)) {
-+ if (t->wrap_flag) {
-+ diff = hpet_calculate_diff(t, cur_tick);
-+ hpet_arm(t, diff);
-+ t->wrap_flag = 0;
- }
-- hpet_arm(t, t->cmp64);
-- } else if (t->wrap_flag) {
-- t->wrap_flag = 0;
-- hpet_arm(t, t->cmp64);
- }
- update_irq(t, 1);
- }
-
- static void hpet_set_timer(HPETTimer *t)
- {
-+ uint64_t diff;
-+ uint32_t wrap_diff; /* how many ticks until we wrap? */
- uint64_t cur_tick = hpet_get_ticks(t->state);
-
-+ /* whenever new timer is being set up, make sure wrap_flag is 0 */
- t->wrap_flag = 0;
-- t->cmp64 = hpet_calculate_cmp64(t, cur_tick, t->cmp);
-- if (t->config & HPET_TN_32BIT) {
-+ diff = hpet_calculate_diff(t, cur_tick);
-
-- /* hpet spec says in one-shot 32-bit mode, generate an interrupt when
-- * counter wraps in addition to an interrupt with comparator match.
-- */
-- if (!timer_is_periodic(t) && t->cmp64 > hpet_next_wrap(cur_tick)) {
-+ /* hpet spec says in one-shot 32-bit mode, generate an interrupt when
-+ * counter wraps in addition to an interrupt with comparator match.
-+ */
-+ if (t->config & HPET_TN_32BIT && !timer_is_periodic(t)) {
-+ wrap_diff = 0xffffffff - (uint32_t)cur_tick;
-+ if (wrap_diff < (uint32_t)diff) {
-+ diff = wrap_diff;
- t->wrap_flag = 1;
-- hpet_arm(t, hpet_next_wrap(cur_tick));
-- return;
- }
- }
-- hpet_arm(t, t->cmp64);
-+ hpet_arm(t, diff);
- }
-
- static void hpet_del_timer(HPETTimer *t)
-@@ -526,7 +534,12 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- timer->cmp = deposit64(timer->cmp, shift, len, value);
- }
- if (timer_is_periodic(timer)) {
-- timer->period = deposit64(timer->period, shift, len, value);
-+ /*
-+ * FIXME: Clamp period to reasonable min value?
-+ * Clamp period to reasonable max value
-+ */
-+ new_val = deposit64(timer->period, shift, len, value);
-+ timer->period = MIN(new_val, (timer->config & HPET_TN_32BIT ? ~0u : ~0ull) >> 1);
- }
- timer->config &= ~HPET_TN_SETVAL;
- if (hpet_enabled(s)) {
diff --git a/debian/patches/pve/0056-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch b/debian/patches/pve/0046-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
similarity index 99%
rename from debian/patches/pve/0056-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
rename to debian/patches/pve/0046-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
index 6d4bfe1..f5315b7 100644
--- a/debian/patches/pve/0056-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
+++ b/debian/patches/pve/0046-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
@@ -21,7 +21,7 @@ Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
1 file changed, 39 insertions(+), 12 deletions(-)
diff --git a/pve-backup.c b/pve-backup.c
-index 0450303017..457fcb7e5c 100644
+index da4995d368..ad0f8668fd 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -847,29 +847,56 @@ static PVEBackupDevInfo coroutine_fn GRAPH_RDLOCK *get_single_device_info(
diff --git a/debian/patches/pve/0046-Revert-hpet-accept-64-bit-reads-and-writes.patch b/debian/patches/pve/0046-Revert-hpet-accept-64-bit-reads-and-writes.patch
deleted file mode 100644
index 37d8d3a..0000000
--- a/debian/patches/pve/0046-Revert-hpet-accept-64-bit-reads-and-writes.patch
+++ /dev/null
@@ -1,281 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:09 +0100
-Subject: [PATCH] Revert "hpet: accept 64-bit reads and writes"
-
-This reverts commit c2366567378dd8fb89329816003801f54e30e6f3.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 137 +++++++++++++++++++++++++++++-------------
- hw/timer/trace-events | 3 +-
- 2 files changed, 96 insertions(+), 44 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index 635a060d38..5f4bb5667d 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -421,7 +421,6 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
- unsigned size)
- {
- HPETState *s = opaque;
-- int shift = (addr & 4) * 8;
- uint64_t cur_tick;
-
- trace_hpet_ram_read(addr);
-@@ -436,33 +435,52 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
- return 0;
- }
-
-- switch (addr & 0x18) {
-- case HPET_TN_CFG: // including interrupt capabilities
-- return timer->config >> shift;
-+ switch ((addr - 0x100) % 0x20) {
-+ case HPET_TN_CFG:
-+ return timer->config;
-+ case HPET_TN_CFG + 4: // Interrupt capabilities
-+ return timer->config >> 32;
- case HPET_TN_CMP: // comparator register
-- return timer->cmp >> shift;
-+ return timer->cmp;
-+ case HPET_TN_CMP + 4:
-+ return timer->cmp >> 32;
- case HPET_TN_ROUTE:
-- return timer->fsb >> shift;
-+ return timer->fsb;
-+ case HPET_TN_ROUTE + 4:
-+ return timer->fsb >> 32;
- default:
- trace_hpet_ram_read_invalid();
- break;
- }
- } else {
-- switch (addr & ~4) {
-- case HPET_ID: // including HPET_PERIOD
-- return s->capability >> shift;
-+ switch (addr) {
-+ case HPET_ID:
-+ return s->capability;
-+ case HPET_PERIOD:
-+ return s->capability >> 32;
- case HPET_CFG:
-- return s->config >> shift;
-+ return s->config;
-+ case HPET_CFG + 4:
-+ trace_hpet_invalid_hpet_cfg(4);
-+ return 0;
- case HPET_COUNTER:
- if (hpet_enabled(s)) {
- cur_tick = hpet_get_ticks(s);
- } else {
- cur_tick = s->hpet_counter;
- }
-- trace_hpet_ram_read_reading_counter(addr & 4, cur_tick);
-- return cur_tick >> shift;
-+ trace_hpet_ram_read_reading_counter(0, cur_tick);
-+ return cur_tick;
-+ case HPET_COUNTER + 4:
-+ if (hpet_enabled(s)) {
-+ cur_tick = hpet_get_ticks(s);
-+ } else {
-+ cur_tick = s->hpet_counter;
-+ }
-+ trace_hpet_ram_read_reading_counter(4, cur_tick);
-+ return cur_tick >> 32;
- case HPET_STATUS:
-- return s->isr >> shift;
-+ return s->isr;
- default:
- trace_hpet_ram_read_invalid();
- break;
-@@ -476,11 +494,11 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- {
- int i;
- HPETState *s = opaque;
-- int shift = (addr & 4) * 8;
-- int len = MIN(size * 8, 64 - shift);
- uint64_t old_val, new_val, cleared;
-
- trace_hpet_ram_write(addr, value);
-+ old_val = hpet_ram_read(opaque, addr, 4);
-+ new_val = value;
-
- /*address range of all TN regs*/
- if (addr >= 0x100 && addr <= 0x3ff) {
-@@ -492,12 +510,9 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- trace_hpet_timer_id_out_of_range(timer_id);
- return;
- }
-- switch (addr & 0x18) {
-+ switch ((addr - 0x100) % 0x20) {
- case HPET_TN_CFG:
-- trace_hpet_ram_write_tn_cfg(addr & 4);
-- old_val = timer->config;
-- new_val = deposit64(old_val, shift, len, value);
-- new_val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK);
-+ trace_hpet_ram_write_tn_cfg();
- if (deactivating_bit(old_val, new_val, HPET_TN_TYPE_LEVEL)) {
- /*
- * Do this before changing timer->config; otherwise, if
-@@ -505,7 +520,8 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- */
- update_irq(timer, 0);
- }
-- timer->config = new_val;
-+ new_val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK);
-+ timer->config = (timer->config & 0xffffffff00000000ULL) | new_val;
- if (activating_bit(old_val, new_val, HPET_TN_ENABLE)
- && (s->isr & (1 << timer_id))) {
- update_irq(timer, 1);
-@@ -518,28 +534,56 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- hpet_set_timer(timer);
- }
- break;
-+ case HPET_TN_CFG + 4: // Interrupt capabilities
-+ trace_hpet_ram_write_invalid_tn_cfg(4);
-+ break;
- case HPET_TN_CMP: // comparator register
-+ trace_hpet_ram_write_tn_cmp(0);
- if (timer->config & HPET_TN_32BIT) {
-- /* High 32-bits are zero, leave them untouched. */
-- if (shift) {
-- trace_hpet_ram_write_invalid_tn_cmp();
-- break;
-+ new_val = (uint32_t)new_val;
-+ }
-+ if (!timer_is_periodic(timer)
-+ || (timer->config & HPET_TN_SETVAL)) {
-+ timer->cmp = (timer->cmp & 0xffffffff00000000ULL) | new_val;
-+ }
-+ if (timer_is_periodic(timer)) {
-+ /*
-+ * FIXME: Clamp period to reasonable min value?
-+ * Clamp period to reasonable max value
-+ */
-+ if (timer->config & HPET_TN_32BIT) {
-+ new_val = MIN(new_val, ~0u >> 1);
- }
-- len = 64;
-- value = (uint32_t) value;
-+ timer->period =
-+ (timer->period & 0xffffffff00000000ULL) | new_val;
-+ }
-+ /*
-+ * FIXME: on a 64-bit write, HPET_TN_SETVAL should apply to the
-+ * high bits part as well.
-+ */
-+ timer->config &= ~HPET_TN_SETVAL;
-+ if (hpet_enabled(s)) {
-+ hpet_set_timer(timer);
- }
-- trace_hpet_ram_write_tn_cmp(addr & 4);
-+ break;
-+ case HPET_TN_CMP + 4: // comparator register high order
-+ if (timer->config & HPET_TN_32BIT) {
-+ trace_hpet_ram_write_invalid_tn_cmp();
-+ break;
-+ }
-+ trace_hpet_ram_write_tn_cmp(4);
- if (!timer_is_periodic(timer)
- || (timer->config & HPET_TN_SETVAL)) {
-- timer->cmp = deposit64(timer->cmp, shift, len, value);
-+ timer->cmp = (timer->cmp & 0xffffffffULL) | new_val << 32;
- }
- if (timer_is_periodic(timer)) {
- /*
- * FIXME: Clamp period to reasonable min value?
- * Clamp period to reasonable max value
- */
-- new_val = deposit64(timer->period, shift, len, value);
-- timer->period = MIN(new_val, (timer->config & HPET_TN_32BIT ? ~0u : ~0ull) >> 1);
-+ new_val = MIN(new_val, ~0u >> 1);
-+ timer->period =
-+ (timer->period & 0xffffffffULL) | new_val << 32;
- }
- timer->config &= ~HPET_TN_SETVAL;
- if (hpet_enabled(s)) {
-@@ -547,7 +591,10 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- }
- break;
- case HPET_TN_ROUTE:
-- timer->fsb = deposit64(timer->fsb, shift, len, value);
-+ timer->fsb = (timer->fsb & 0xffffffff00000000ULL) | new_val;
-+ break;
-+ case HPET_TN_ROUTE + 4:
-+ timer->fsb = (new_val << 32) | (timer->fsb & 0xffffffff);
- break;
- default:
- trace_hpet_ram_write_invalid();
-@@ -555,14 +602,12 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- }
- return;
- } else {
-- switch (addr & ~4) {
-+ switch (addr) {
- case HPET_ID:
- return;
- case HPET_CFG:
-- old_val = s->config;
-- new_val = deposit64(old_val, shift, len, value);
- new_val = hpet_fixup_reg(new_val, old_val, HPET_CFG_WRITE_MASK);
-- s->config = new_val;
-+ s->config = (s->config & 0xffffffff00000000ULL) | new_val;
- if (activating_bit(old_val, new_val, HPET_CFG_ENABLE)) {
- /* Enable main counter and interrupt generation. */
- s->hpet_offset =
-@@ -592,8 +637,10 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- qemu_set_irq(s->irqs[RTC_ISA_IRQ], s->rtc_irq_level);
- }
- break;
-+ case HPET_CFG + 4:
-+ trace_hpet_invalid_hpet_cfg(4);
-+ break;
- case HPET_STATUS:
-- new_val = value << shift;
- cleared = new_val & s->isr;
- for (i = 0; i < s->num_timers; i++) {
- if (cleared & (1 << i)) {
-@@ -605,7 +652,15 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- if (hpet_enabled(s)) {
- trace_hpet_ram_write_counter_write_while_enabled();
- }
-- s->hpet_counter = deposit64(s->hpet_counter, shift, len, value);
-+ s->hpet_counter =
-+ (s->hpet_counter & 0xffffffff00000000ULL) | value;
-+ trace_hpet_ram_write_counter_written(0, value, s->hpet_counter);
-+ break;
-+ case HPET_COUNTER + 4:
-+ trace_hpet_ram_write_counter_write_while_enabled();
-+ s->hpet_counter =
-+ (s->hpet_counter & 0xffffffffULL) | (((uint64_t)value) << 32);
-+ trace_hpet_ram_write_counter_written(4, value, s->hpet_counter);
- break;
- default:
- trace_hpet_ram_write_invalid();
-@@ -619,11 +674,7 @@ static const MemoryRegionOps hpet_ram_ops = {
- .write = hpet_ram_write,
- .valid = {
- .min_access_size = 4,
-- .max_access_size = 8,
-- },
-- .impl = {
-- .min_access_size = 4,
-- .max_access_size = 8,
-+ .max_access_size = 4,
- },
- .endianness = DEVICE_NATIVE_ENDIAN,
- };
-diff --git a/hw/timer/trace-events b/hw/timer/trace-events
-index c5b6db49f5..dd8a53c690 100644
---- a/hw/timer/trace-events
-+++ b/hw/timer/trace-events
-@@ -114,7 +114,8 @@ hpet_ram_read_reading_counter(uint8_t reg_off, uint64_t cur_tick) "reading count
- hpet_ram_read_invalid(void) "invalid hpet_ram_readl"
- hpet_ram_write(uint64_t addr, uint64_t value) "enter hpet_ram_writel at 0x%" PRIx64 " = 0x%" PRIx64
- hpet_ram_write_timer_id(uint64_t timer_id) "hpet_ram_writel timer_id = 0x%" PRIx64
--hpet_ram_write_tn_cfg(uint8_t reg_off) "hpet_ram_writel HPET_TN_CFG + %" PRIu8
-+hpet_ram_write_tn_cfg(void) "hpet_ram_writel HPET_TN_CFG"
-+hpet_ram_write_invalid_tn_cfg(uint8_t reg_off) "invalid HPET_TN_CFG + %" PRIu8 " write"
- hpet_ram_write_tn_cmp(uint8_t reg_off) "hpet_ram_writel HPET_TN_CMP + %" PRIu8
- hpet_ram_write_invalid_tn_cmp(void) "invalid HPET_TN_CMP + 4 write"
- hpet_ram_write_invalid(void) "invalid hpet_ram_writel"
diff --git a/debian/patches/pve/0047-Revert-hpet-place-read-only-bits-directly-in-new_val.patch b/debian/patches/pve/0047-Revert-hpet-place-read-only-bits-directly-in-new_val.patch
deleted file mode 100644
index 8742f85..0000000
--- a/debian/patches/pve/0047-Revert-hpet-place-read-only-bits-directly-in-new_val.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:10 +0100
-Subject: [PATCH] Revert "hpet: place read-only bits directly in "new_val""
-
-This reverts commit ba88935b0fac2588b0a739f810b58dfabf7f92c8.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 15 ++++++++-------
- 1 file changed, 8 insertions(+), 7 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index 5f4bb5667d..5e3bf1f153 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -494,7 +494,7 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- {
- int i;
- HPETState *s = opaque;
-- uint64_t old_val, new_val, cleared;
-+ uint64_t old_val, new_val, val;
-
- trace_hpet_ram_write(addr, value);
- old_val = hpet_ram_read(opaque, addr, 4);
-@@ -520,12 +520,13 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- */
- update_irq(timer, 0);
- }
-- new_val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK);
-- timer->config = (timer->config & 0xffffffff00000000ULL) | new_val;
-+ val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK);
-+ timer->config = (timer->config & 0xffffffff00000000ULL) | val;
- if (activating_bit(old_val, new_val, HPET_TN_ENABLE)
- && (s->isr & (1 << timer_id))) {
- update_irq(timer, 1);
- }
-+
- if (new_val & HPET_TN_32BIT) {
- timer->cmp = (uint32_t)timer->cmp;
- timer->period = (uint32_t)timer->period;
-@@ -606,8 +607,8 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- case HPET_ID:
- return;
- case HPET_CFG:
-- new_val = hpet_fixup_reg(new_val, old_val, HPET_CFG_WRITE_MASK);
-- s->config = (s->config & 0xffffffff00000000ULL) | new_val;
-+ val = hpet_fixup_reg(new_val, old_val, HPET_CFG_WRITE_MASK);
-+ s->config = (s->config & 0xffffffff00000000ULL) | val;
- if (activating_bit(old_val, new_val, HPET_CFG_ENABLE)) {
- /* Enable main counter and interrupt generation. */
- s->hpet_offset =
-@@ -641,9 +642,9 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- trace_hpet_invalid_hpet_cfg(4);
- break;
- case HPET_STATUS:
-- cleared = new_val & s->isr;
-+ val = new_val & s->isr;
- for (i = 0; i < s->num_timers; i++) {
-- if (cleared & (1 << i)) {
-+ if (val & (1 << i)) {
- update_irq(&s->timer[i], 0);
- }
- }
diff --git a/debian/patches/pve/0058-savevm-async-reuse-migration-blocker-check-for-snaps.patch b/debian/patches/pve/0047-savevm-async-reuse-migration-blocker-check-for-snaps.patch
similarity index 96%
rename from debian/patches/pve/0058-savevm-async-reuse-migration-blocker-check-for-snaps.patch
rename to debian/patches/pve/0047-savevm-async-reuse-migration-blocker-check-for-snaps.patch
index efb6b8a..eb21d75 100644
--- a/debian/patches/pve/0058-savevm-async-reuse-migration-blocker-check-for-snaps.patch
+++ b/debian/patches/pve/0047-savevm-async-reuse-migration-blocker-check-for-snaps.patch
@@ -61,10 +61,10 @@ Message-ID: <20250618102531.57444-1-f.ebner@proxmox.com>
5 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/block/vmdk.c b/block/vmdk.c
-index 2adec49912..80696a8d27 100644
+index 7b98debc2b..2af32f3d5d 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
-@@ -1402,9 +1402,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
+@@ -1404,9 +1404,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
qemu_co_mutex_init(&s->lock);
/* Disable migration when VMDK images are used */
@@ -89,10 +89,10 @@ index a687ac0efe..f36bfb2df1 100644
* @migrate_add_blocker - prevent all modes of migration from proceeding
*
diff --git a/migration/migration.c b/migration/migration.c
-index 2f3430f440..ecad1aca32 100644
+index b58cbdc2c0..594e253a8a 100644
--- a/migration/migration.c
+++ b/migration/migration.c
-@@ -2030,6 +2030,30 @@ bool migration_is_blocked(Error **errp)
+@@ -2055,6 +2055,30 @@ bool migration_is_blocked(Error **errp)
return false;
}
@@ -124,7 +124,7 @@ index 2f3430f440..ecad1aca32 100644
static bool migrate_prepare(MigrationState *s, bool resume, Error **errp)
{
diff --git a/migration/migration.h b/migration/migration.h
-index d53f7cad84..b772073572 100644
+index 01329bf824..a805e98a30 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -531,6 +531,7 @@ int migration_call_notifiers(MigrationState *s, MigrationEventType type,
diff --git a/debian/patches/pve/0048-Revert-hpet-remove-unnecessary-variable-index.patch b/debian/patches/pve/0048-Revert-hpet-remove-unnecessary-variable-index.patch
deleted file mode 100644
index d962aeb..0000000
--- a/debian/patches/pve/0048-Revert-hpet-remove-unnecessary-variable-index.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:11 +0100
-Subject: [PATCH] Revert "hpet: remove unnecessary variable "index""
-
-This reverts commit 5895879aca252f4ebb2d1078eaf836c61ec54e9b.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 15 ++++++++-------
- 1 file changed, 8 insertions(+), 7 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index 5e3bf1f153..daef12c8cf 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -421,12 +421,12 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
- unsigned size)
- {
- HPETState *s = opaque;
-- uint64_t cur_tick;
-+ uint64_t cur_tick, index;
-
- trace_hpet_ram_read(addr);
--
-+ index = addr;
- /*address range of all TN regs*/
-- if (addr >= 0x100 && addr <= 0x3ff) {
-+ if (index >= 0x100 && index <= 0x3ff) {
- uint8_t timer_id = (addr - 0x100) / 0x20;
- HPETTimer *timer = &s->timer[timer_id];
-
-@@ -453,7 +453,7 @@ static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
- break;
- }
- } else {
-- switch (addr) {
-+ switch (index) {
- case HPET_ID:
- return s->capability;
- case HPET_PERIOD:
-@@ -494,14 +494,15 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- {
- int i;
- HPETState *s = opaque;
-- uint64_t old_val, new_val, val;
-+ uint64_t old_val, new_val, val, index;
-
- trace_hpet_ram_write(addr, value);
-+ index = addr;
- old_val = hpet_ram_read(opaque, addr, 4);
- new_val = value;
-
- /*address range of all TN regs*/
-- if (addr >= 0x100 && addr <= 0x3ff) {
-+ if (index >= 0x100 && index <= 0x3ff) {
- uint8_t timer_id = (addr - 0x100) / 0x20;
- HPETTimer *timer = &s->timer[timer_id];
-
-@@ -603,7 +604,7 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- }
- return;
- } else {
-- switch (addr) {
-+ switch (index) {
- case HPET_ID:
- return;
- case HPET_CFG:
diff --git a/debian/patches/pve/0049-Revert-hpet-ignore-high-bits-of-comparator-in-32-bit.patch b/debian/patches/pve/0049-Revert-hpet-ignore-high-bits-of-comparator-in-32-bit.patch
deleted file mode 100644
index e09c8ba..0000000
--- a/debian/patches/pve/0049-Revert-hpet-ignore-high-bits-of-comparator-in-32-bit.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:12 +0100
-Subject: [PATCH] Revert "hpet: ignore high bits of comparator in 32-bit mode"
-
-This reverts commit 9eb7fad3546a89ee7cf0e90f5b1daccf89725cea.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 4 ----
- hw/timer/trace-events | 1 -
- 2 files changed, 5 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index daef12c8cf..927263e2ff 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -569,10 +569,6 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- }
- break;
- case HPET_TN_CMP + 4: // comparator register high order
-- if (timer->config & HPET_TN_32BIT) {
-- trace_hpet_ram_write_invalid_tn_cmp();
-- break;
-- }
- trace_hpet_ram_write_tn_cmp(4);
- if (!timer_is_periodic(timer)
- || (timer->config & HPET_TN_SETVAL)) {
-diff --git a/hw/timer/trace-events b/hw/timer/trace-events
-index dd8a53c690..2b81ee0812 100644
---- a/hw/timer/trace-events
-+++ b/hw/timer/trace-events
-@@ -117,7 +117,6 @@ hpet_ram_write_timer_id(uint64_t timer_id) "hpet_ram_writel timer_id = 0x%" PRIx
- hpet_ram_write_tn_cfg(void) "hpet_ram_writel HPET_TN_CFG"
- hpet_ram_write_invalid_tn_cfg(uint8_t reg_off) "invalid HPET_TN_CFG + %" PRIu8 " write"
- hpet_ram_write_tn_cmp(uint8_t reg_off) "hpet_ram_writel HPET_TN_CMP + %" PRIu8
--hpet_ram_write_invalid_tn_cmp(void) "invalid HPET_TN_CMP + 4 write"
- hpet_ram_write_invalid(void) "invalid hpet_ram_writel"
- hpet_ram_write_counter_write_while_enabled(void) "Writing counter while HPET enabled!"
- hpet_ram_write_counter_written(uint8_t reg_off, uint64_t value, uint64_t counter) "HPET counter + %" PRIu8 "written. crt = 0x%" PRIx64 " -> 0x%" PRIx64
diff --git a/debian/patches/pve/0050-Revert-hpet-fix-and-cleanup-persistence-of-interrupt.patch b/debian/patches/pve/0050-Revert-hpet-fix-and-cleanup-persistence-of-interrupt.patch
deleted file mode 100644
index 312df20..0000000
--- a/debian/patches/pve/0050-Revert-hpet-fix-and-cleanup-persistence-of-interrupt.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 19 Mar 2025 17:31:13 +0100
-Subject: [PATCH] Revert "hpet: fix and cleanup persistence of interrupt
- status"
-
-This reverts commit f0ccf770789e48b7a73497b465fdc892d28c1339.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
----
- hw/timer/hpet.c | 60 ++++++++++++++++---------------------------------
- 1 file changed, 19 insertions(+), 41 deletions(-)
-
-diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
-index 927263e2ff..5aae09f166 100644
---- a/hw/timer/hpet.c
-+++ b/hw/timer/hpet.c
-@@ -199,31 +199,21 @@ static void update_irq(struct HPETTimer *timer, int set)
- }
- s = timer->state;
- mask = 1 << timer->tn;
--
-- if (set && (timer->config & HPET_TN_TYPE_LEVEL)) {
-- /*
-- * If HPET_TN_ENABLE bit is 0, "the timer will still operate and
-- * generate appropriate status bits, but will not cause an interrupt"
-- */
-- s->isr |= mask;
-- } else {
-+ if (!set || !timer_enabled(timer) || !hpet_enabled(timer->state)) {
- s->isr &= ~mask;
-- }
--
-- if (set && timer_enabled(timer) && hpet_enabled(s)) {
-- if (timer_fsb_route(timer)) {
-- address_space_stl_le(&address_space_memory, timer->fsb >> 32,
-- timer->fsb & 0xffffffff, MEMTXATTRS_UNSPECIFIED,
-- NULL);
-- } else if (timer->config & HPET_TN_TYPE_LEVEL) {
-- qemu_irq_raise(s->irqs[route]);
-- } else {
-- qemu_irq_pulse(s->irqs[route]);
-- }
-- } else {
- if (!timer_fsb_route(timer)) {
- qemu_irq_lower(s->irqs[route]);
- }
-+ } else if (timer_fsb_route(timer)) {
-+ address_space_stl_le(&address_space_memory, timer->fsb >> 32,
-+ timer->fsb & 0xffffffff, MEMTXATTRS_UNSPECIFIED,
-+ NULL);
-+ } else if (timer->config & HPET_TN_TYPE_LEVEL) {
-+ s->isr |= mask;
-+ qemu_irq_raise(s->irqs[route]);
-+ } else {
-+ s->isr &= ~mask;
-+ qemu_irq_pulse(s->irqs[route]);
- }
- }
-
-@@ -408,13 +398,8 @@ static void hpet_set_timer(HPETTimer *t)
-
- static void hpet_del_timer(HPETTimer *t)
- {
-- HPETState *s = t->state;
- timer_del(t->qemu_timer);
--
-- if (s->isr & (1 << t->tn)) {
-- /* For level-triggered interrupt, this leaves ISR set but lowers irq. */
-- update_irq(t, 1);
-- }
-+ update_irq(t, 0);
- }
-
- static uint64_t hpet_ram_read(void *opaque, hwaddr addr,
-@@ -514,26 +499,20 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- switch ((addr - 0x100) % 0x20) {
- case HPET_TN_CFG:
- trace_hpet_ram_write_tn_cfg();
-- if (deactivating_bit(old_val, new_val, HPET_TN_TYPE_LEVEL)) {
-- /*
-- * Do this before changing timer->config; otherwise, if
-- * HPET_TN_FSB is set, update_irq will not lower the qemu_irq.
-- */
-+ if (activating_bit(old_val, new_val, HPET_TN_FSB_ENABLE)) {
- update_irq(timer, 0);
- }
- val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK);
- timer->config = (timer->config & 0xffffffff00000000ULL) | val;
-- if (activating_bit(old_val, new_val, HPET_TN_ENABLE)
-- && (s->isr & (1 << timer_id))) {
-- update_irq(timer, 1);
-- }
--
- if (new_val & HPET_TN_32BIT) {
- timer->cmp = (uint32_t)timer->cmp;
- timer->period = (uint32_t)timer->period;
- }
-- if (hpet_enabled(s)) {
-+ if (activating_bit(old_val, new_val, HPET_TN_ENABLE) &&
-+ hpet_enabled(s)) {
- hpet_set_timer(timer);
-+ } else if (deactivating_bit(old_val, new_val, HPET_TN_ENABLE)) {
-+ hpet_del_timer(timer);
- }
- break;
- case HPET_TN_CFG + 4: // Interrupt capabilities
-@@ -611,10 +590,9 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
- s->hpet_offset =
- ticks_to_ns(s->hpet_counter) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
- for (i = 0; i < s->num_timers; i++) {
-- if (timer_enabled(&s->timer[i]) && (s->isr & (1 << i))) {
-- update_irq(&s->timer[i], 1);
-+ if ((&s->timer[i])->cmp != ~0ULL) {
-+ hpet_set_timer(&s->timer[i]);
- }
-- hpet_set_timer(&s->timer[i]);
- }
- } else if (deactivating_bit(old_val, new_val, HPET_CFG_ENABLE)) {
- /* Halt main counter and disable interrupt generation. */
diff --git a/debian/patches/pve/0057-block-qapi-include-child-references-in-block-device-.patch b/debian/patches/pve/0057-block-qapi-include-child-references-in-block-device-.patch
deleted file mode 100644
index dc33d5f..0000000
--- a/debian/patches/pve/0057-block-qapi-include-child-references-in-block-device-.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fiona Ebner <f.ebner@proxmox.com>
-Date: Wed, 2 Jul 2025 18:27:37 +0200
-Subject: [PATCH] block/qapi: include child references in block device info
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-In combination with using a throttle filter to enforce IO limits for
-a guest device, knowing the 'file' child of a block device can be
-useful. If the throttle filter is only intended for guest IO, block
-jobs should not also be limited by the throttle filter, so the
-block operations need to be done with the 'file' child of the top
-throttle node as the target. In combination with mirroring, the name
-of that child is not fixed.
-
-Another scenario is when unplugging a guest device after mirroring
-below a top throttle node, where the mirror target is added explicitly
-via blockdev-add. After mirroring, the target becomes the new 'file'
-child of the throttle node. For unplugging, both the top throttle node
-and the mirror target need to be deleted, because only implicitly
-added child nodes are deleted automatically, and the current 'file'
-child of the throttle node was explicitly added (as the mirror
-target).
-
-In other scenarios, it could be useful to follow the backing chain.
-
-Note that iotests 191 and 273 use _filter_img_info, so the 'children'
-information is filtered out there.
-
-Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
-Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
----
- block/qapi.c | 10 ++++++++++
- qapi/block-core.json | 16 ++++++++++++++++
- tests/qemu-iotests/184.out | 8 ++++++++
- 3 files changed, 34 insertions(+)
-
-diff --git a/block/qapi.c b/block/qapi.c
-index 2c50a6bf3b..e08a1e970f 100644
---- a/block/qapi.c
-+++ b/block/qapi.c
-@@ -51,6 +51,8 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
- ImageInfo *backing_info;
- BlockDriverState *backing;
- BlockDeviceInfo *info;
-+ BlockdevChildList **children_list_tail;
-+ BdrvChild *child;
-
- if (!bs->drv) {
- error_setg(errp, "Block device %s is ejected", bs->node_name);
-@@ -77,6 +79,14 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
- info->node_name = g_strdup(bs->node_name);
- }
-
-+ children_list_tail = &info->children;
-+ QLIST_FOREACH(child, &bs->children, next) {
-+ BlockdevChild *child_ref = g_new0(BlockdevChild, 1);
-+ child_ref->child = g_strdup(child->name);
-+ child_ref->node_name = g_strdup(child->bs->node_name);
-+ QAPI_LIST_APPEND(children_list_tail, child_ref);
-+ }
-+
- backing = bdrv_cow_bs(bs);
- if (backing) {
- info->backing_file = g_strdup(backing->filename);
-diff --git a/qapi/block-core.json b/qapi/block-core.json
-index 07c5773717..4db27f5819 100644
---- a/qapi/block-core.json
-+++ b/qapi/block-core.json
-@@ -461,6 +461,19 @@
- 'direct': 'bool',
- 'no-flush': 'bool' } }
-
-+##
-+# @BlockdevChild:
-+#
-+# @child: The name of the child, for example 'file' or 'backing'.
-+#
-+# @node-name: The name of the child's block driver node.
-+#
-+# Since: 10.1
-+##
-+{ 'struct': 'BlockdevChild',
-+ 'data': { 'child': 'str',
-+ 'node-name': 'str' } }
-+
- ##
- # @BlockDeviceInfo:
- #
-@@ -486,6 +499,8 @@
- # @backing_file_depth: number of files in the backing file chain
- # (since: 1.2)
- #
-+# @children: Information about child block nodes. (since: 10.1)
-+#
- # @active: true if the backend is active; typical cases for inactive backends
- # are on the migration source instance after migration completes and on the
- # destination before it completes. (since: 10.0)
-@@ -560,6 +575,7 @@
- { 'struct': 'BlockDeviceInfo',
- 'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str',
- '*backing_file': 'str', 'backing_file_depth': 'int',
-+ 'children': ['BlockdevChild'],
- 'active': 'bool', 'encrypted': 'bool',
- 'detect_zeroes': 'BlockdevDetectZeroesOptions',
- 'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
-diff --git a/tests/qemu-iotests/184.out b/tests/qemu-iotests/184.out
-index 52692b6b3b..ef99bb2e9a 100644
---- a/tests/qemu-iotests/184.out
-+++ b/tests/qemu-iotests/184.out
-@@ -41,6 +41,12 @@ Testing:
- },
- "iops_wr": 0,
- "ro": false,
-+ "children": [
-+ {
-+ "node-name": "disk0",
-+ "child": "file"
-+ }
-+ ],
- "node-name": "throttle0",
- "backing_file_depth": 1,
- "drv": "throttle",
-@@ -69,6 +75,8 @@ Testing:
- },
- "iops_wr": 0,
- "ro": false,
-+ "children": [
-+ ],
- "node-name": "disk0",
- "backing_file_depth": 0,
- "drv": "null-co",
diff --git a/debian/patches/series b/debian/patches/series
index d7cbd42..f2bf359 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -44,23 +44,12 @@ pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
pve/0037-PVE-block-stream-increase-chunk-size.patch
pve/0038-block-add-alloc-track-driver.patch
-pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
-pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
-pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch
-pve/0042-PVE-backup-add-fleecing-option.patch
-pve/0043-adapt-machine-version-deprecation-for-Proxmox-VE.patch
-pve/0044-Revert-hpet-avoid-timer-storms-on-periodic-timers.patch
-pve/0045-Revert-hpet-store-full-64-bit-target-value-of-the-co.patch
-pve/0046-Revert-hpet-accept-64-bit-reads-and-writes.patch
-pve/0047-Revert-hpet-place-read-only-bits-directly-in-new_val.patch
-pve/0048-Revert-hpet-remove-unnecessary-variable-index.patch
-pve/0049-Revert-hpet-ignore-high-bits-of-comparator-in-32-bit.patch
-pve/0050-Revert-hpet-fix-and-cleanup-persistence-of-interrupt.patch
-pve/0051-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
-pve/0052-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
-pve/0053-PVE-backup-add-target-ID-in-backup-state.patch
-pve/0054-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
-pve/0055-PVE-backup-implement-backup-access-setup-and-teardow.patch
-pve/0056-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
-pve/0057-block-qapi-include-child-references-in-block-device-.patch
-pve/0058-savevm-async-reuse-migration-blocker-check-for-snaps.patch
+pve/0039-PVE-backup-add-fleecing-option.patch
+pve/0040-adapt-machine-version-deprecation-for-Proxmox-VE.patch
+pve/0041-PVE-backup-factor-out-helper-to-clear-backup-state-s.patch
+pve/0042-PVE-backup-factor-out-helper-to-initialize-backup-st.patch
+pve/0043-PVE-backup-add-target-ID-in-backup-state.patch
+pve/0044-PVE-backup-get-device-info-allow-caller-to-specify-f.patch
+pve/0045-PVE-backup-implement-backup-access-setup-and-teardow.patch
+pve/0046-PVE-backup-prepare-for-the-switch-to-using-blockdev-.patch
+pve/0047-savevm-async-reuse-migration-blocker-check-for-snaps.patch
diff --git a/qemu b/qemu
index ff3419c..f8b2f64 160000
--- a/qemu
+++ b/qemu
@@ -1 +1 @@
-Subproject commit ff3419cbacdc9ad0715c716afeed65bb21a2bbbc
+Subproject commit f8b2f64e2336a28bf0d50b6ef8a7d8c013e9bcf3
--
2.47.3
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 6+ messages in thread