]> git.proxmox.com Git - pve-qemu.git/blob - debian/patches/pve/0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch
d/control: drop outdated jemalloc dependencies
[pve-qemu.git] / debian / patches / pve / 0057-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Fabian Ebner <f.ebner@proxmox.com>
3 Date: Wed, 25 May 2022 13:59:37 +0200
4 Subject: [PATCH] PVE-Backup: create jobs: correctly cancel in error scenario
5
6 The first call to job_cancel_sync() will cancel and free all jobs in
7 the transaction, so ensure that it's called only once and get rid of
8 the job_unref() that would operate on freed memory.
9
10 It's also necessary to NULL backup_state.pbs in the error scenario,
11 because a subsequent backup_cancel QMP call (as happens in PVE when
12 the backup QMP command fails) would try to call proxmox_backup_abort()
13 and run into a segfault.
14
15 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
16 Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
17 [FE: adapt for new job lock mechanism replacing AioContext locks]
18 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
19 ---
20 pve-backup.c | 10 ++++++++--
21 1 file changed, 8 insertions(+), 2 deletions(-)
22
23 diff --git a/pve-backup.c b/pve-backup.c
24 index 262e7d3894..fde3554133 100644
25 --- a/pve-backup.c
26 +++ b/pve-backup.c
27 @@ -503,6 +503,11 @@ static void create_backup_jobs_bh(void *opaque) {
28 }
29
30 if (*errp) {
31 + /*
32 + * It's enough to cancel one job in the transaction, the rest will
33 + * follow automatically.
34 + */
35 + bool canceled = false;
36 l = backup_state.di_list;
37 while (l) {
38 PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
39 @@ -513,11 +518,11 @@ static void create_backup_jobs_bh(void *opaque) {
40 di->target = NULL;
41 }
42
43 - if (di->job) {
44 + if (!canceled && di->job) {
45 WITH_JOB_LOCK_GUARD() {
46 job_cancel_sync_locked(&di->job->job, true);
47 - job_unref_locked(&di->job->job);
48 }
49 + canceled = true;
50 }
51 }
52 }
53 @@ -943,6 +948,7 @@ err:
54
55 if (pbs) {
56 proxmox_backup_disconnect(pbs);
57 + backup_state.pbs = NULL;
58 }
59
60 if (backup_dir) {