]>
Commit | Line | Data |
---|---|---|
7f4326d1 WB |
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 | ||
d03e1b3c | 15 | Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> |
7f4326d1 | 16 | Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> |
d03e1b3c FE |
17 | [FE: adapt for new job lock mechanism replacing AioContext locks] |
18 | Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> | |
7f4326d1 WB |
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 | |
d03e1b3c | 24 | index 262e7d3894..fde3554133 100644 |
7f4326d1 WB |
25 | --- a/pve-backup.c |
26 | +++ b/pve-backup.c | |
d03e1b3c | 27 | @@ -503,6 +503,11 @@ static void create_backup_jobs_bh(void *opaque) { |
7f4326d1 WB |
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; | |
d03e1b3c | 39 | @@ -513,11 +518,11 @@ static void create_backup_jobs_bh(void *opaque) { |
7f4326d1 WB |
40 | di->target = NULL; |
41 | } | |
42 | ||
43 | - if (di->job) { | |
44 | + if (!canceled && di->job) { | |
d03e1b3c FE |
45 | WITH_JOB_LOCK_GUARD() { |
46 | job_cancel_sync_locked(&di->job->job, true); | |
47 | - job_unref_locked(&di->job->job); | |
48 | } | |
7f4326d1 WB |
49 | + canceled = true; |
50 | } | |
51 | } | |
52 | } | |
d03e1b3c | 53 | @@ -943,6 +948,7 @@ err: |
7f4326d1 WB |
54 | |
55 | if (pbs) { | |
56 | proxmox_backup_disconnect(pbs); | |
57 | + backup_state.pbs = NULL; | |
58 | } | |
59 | ||
60 | if (backup_dir) { |