The drained section needs to be terminated before breaking out of the loop in the error scenarios. Otherwise, guest IO on the drive would become stuck.
Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- .../0050-PVE-backup-add-fleecing-option.patch | 22 ++++++++++--------- ...ve-error-when-copy-before-write-fail.patch | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/debian/patches/pve/0050-PVE-backup-add-fleecing-option.patch b/debian/patches/pve/0050-PVE-backup-add-fleecing-option.patch index dbb2883..d8ad45f 100644 --- a/debian/patches/pve/0050-PVE-backup-add-fleecing-option.patch +++ b/debian/patches/pve/0050-PVE-backup-add-fleecing-option.patch @@ -63,9 +63,9 @@ Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> --- block/monitor/block-hmp-cmds.c | 1 + - pve-backup.c | 135 ++++++++++++++++++++++++++++++++- + pve-backup.c | 137 ++++++++++++++++++++++++++++++++- qapi/block-core.json | 10 ++- - 3 files changed, 142 insertions(+), 4 deletions(-) + 3 files changed, 144 insertions(+), 4 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 5000c084c5..70b3de4c7e 100644 @@ -80,7 +80,7 @@ index 5000c084c5..70b3de4c7e 100644 hmp_handle_error(mon, error); diff --git a/pve-backup.c b/pve-backup.c -index 5ebb6a3947..a747d12d3d 100644 +index 5ebb6a3947..5ea9e1f82f 100644 --- a/pve-backup.c +++ b/pve-backup.c @@ -7,9 +7,11 @@ @@ -134,7 +134,7 @@ index 5ebb6a3947..a747d12d3d 100644 /* * Needs to happen outside of coroutine, because it takes the graph write lock. */ -@@ -519,9 +544,77 @@ static void create_backup_jobs_bh(void *opaque) { +@@ -519,9 +544,79 @@ static void create_backup_jobs_bh(void *opaque) { } bdrv_drained_begin(di->bs); @@ -172,6 +172,7 @@ index 5ebb6a3947..a747d12d3d 100644 + if (!di->fleecing.cbw) { + error_setg(errp, "appending cbw node for fleecing failed: %s", + local_err ? error_get_pretty(local_err) : "unknown error"); ++ bdrv_drained_end(di->bs); + break; + } + @@ -184,6 +185,7 @@ index 5ebb6a3947..a747d12d3d 100644 + if (!di->fleecing.snapshot_access) { + error_setg(errp, "setting up snapshot access for fleecing failed: %s", + local_err ? error_get_pretty(local_err) : "unknown error"); ++ bdrv_drained_end(di->bs); + break; + } + source_bs = di->fleecing.snapshot_access; @@ -214,7 +216,7 @@ index 5ebb6a3947..a747d12d3d 100644 BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn, &local_err); -@@ -577,6 +670,14 @@ static void create_backup_jobs_bh(void *opaque) { +@@ -577,6 +672,14 @@ static void create_backup_jobs_bh(void *opaque) { aio_co_enter(data->ctx, data->co); } @@ -229,7 +231,7 @@ index 5ebb6a3947..a747d12d3d 100644 /* * Returns a list of device infos, which needs to be freed by the caller. In * case of an error, errp will be set, but the returned value might still be a -@@ -584,6 +685,7 @@ static void create_backup_jobs_bh(void *opaque) { +@@ -584,6 +687,7 @@ static void create_backup_jobs_bh(void *opaque) { */ static GList coroutine_fn GRAPH_RDLOCK *get_device_info( const char *devlist, @@ -237,7 +239,7 @@ index 5ebb6a3947..a747d12d3d 100644 Error **errp) { gchar **devs = NULL; -@@ -607,6 +709,31 @@ static GList coroutine_fn GRAPH_RDLOCK *get_device_info( +@@ -607,6 +711,31 @@ static GList coroutine_fn GRAPH_RDLOCK *get_device_info( } PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1); di->bs = bs; @@ -269,7 +271,7 @@ index 5ebb6a3947..a747d12d3d 100644 di_list = g_list_append(di_list, di); d++; } -@@ -656,6 +783,7 @@ UuidInfo coroutine_fn *qmp_backup( +@@ -656,6 +785,7 @@ UuidInfo coroutine_fn *qmp_backup( const char *devlist, bool has_speed, int64_t speed, bool has_max_workers, int64_t max_workers, @@ -277,7 +279,7 @@ index 5ebb6a3947..a747d12d3d 100644 Error **errp) { assert(qemu_in_coroutine()); -@@ -684,7 +812,7 @@ UuidInfo coroutine_fn *qmp_backup( +@@ -684,7 +814,7 @@ UuidInfo coroutine_fn *qmp_backup( format = has_format ? format : BACKUP_FORMAT_VMA; bdrv_graph_co_rdlock(); @@ -286,7 +288,7 @@ index 5ebb6a3947..a747d12d3d 100644 bdrv_graph_co_rdunlock(); if (local_err) { error_propagate(errp, local_err); -@@ -1089,5 +1217,6 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp) +@@ -1089,5 +1219,6 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp) ret->query_bitmap_info = true; ret->pbs_masterkey = true; ret->backup_max_workers = true; diff --git a/debian/patches/pve/0051-PVE-backup-improve-error-when-copy-before-write-fail.patch b/debian/patches/pve/0051-PVE-backup-improve-error-when-copy-before-write-fail.patch index 4522d37..7fc2b3c 100644 --- a/debian/patches/pve/0051-PVE-backup-improve-error-when-copy-before-write-fail.patch +++ b/debian/patches/pve/0051-PVE-backup-improve-error-when-copy-before-write-fail.patch @@ -96,7 +96,7 @@ index dc6cafe7fa..a27d2d7d9f 100644 #endif /* COPY_BEFORE_WRITE_H */ diff --git a/pve-backup.c b/pve-backup.c -index a747d12d3d..4e730aa3da 100644 +index 5ea9e1f82f..aa6ddf4c52 100644 --- a/pve-backup.c +++ b/pve-backup.c @@ -374,6 +374,15 @@ static void pvebackup_complete_cb(void *opaque, int ret) -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel