mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-16 23:25:08 +00:00

Many stable fixes came in since the last bump, a few of which were actually already present. Notable ones not yet present include a few guest-triggerable assert fixes, some AHCI/IDE fixes (including the fix for bug #2784), TGC fixes for i386 and ARM, VirtIO fixes, fix to avoid VNC clipboard denial-of-service. The reentrancy patches that landed upstream/stable were a newer version than the ones backported initially here, so it was necessary to explicitly drop them before rebase (which then picked up the upstream version). There were no other conflicts. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
61 lines
2.0 KiB
Diff
61 lines
2.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Fabian Ebner <f.ebner@proxmox.com>
|
|
Date: Wed, 25 May 2022 13:59:37 +0200
|
|
Subject: [PATCH] PVE-Backup: create jobs: correctly cancel in error scenario
|
|
|
|
The first call to job_cancel_sync() will cancel and free all jobs in
|
|
the transaction, so ensure that it's called only once and get rid of
|
|
the job_unref() that would operate on freed memory.
|
|
|
|
It's also necessary to NULL backup_state.pbs in the error scenario,
|
|
because a subsequent backup_cancel QMP call (as happens in PVE when
|
|
the backup QMP command fails) would try to call proxmox_backup_abort()
|
|
and run into a segfault.
|
|
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|
[FE: adapt for new job lock mechanism replacing AioContext locks]
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
pve-backup.c | 10 ++++++++--
|
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/pve-backup.c b/pve-backup.c
|
|
index 1c25ae98bd..1b466eee3a 100644
|
|
--- a/pve-backup.c
|
|
+++ b/pve-backup.c
|
|
@@ -503,6 +503,11 @@ static void create_backup_jobs_bh(void *opaque) {
|
|
}
|
|
|
|
if (*errp) {
|
|
+ /*
|
|
+ * It's enough to cancel one job in the transaction, the rest will
|
|
+ * follow automatically.
|
|
+ */
|
|
+ bool canceled = false;
|
|
l = backup_state.di_list;
|
|
while (l) {
|
|
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
|
@@ -513,11 +518,11 @@ static void create_backup_jobs_bh(void *opaque) {
|
|
di->target = NULL;
|
|
}
|
|
|
|
- if (di->job) {
|
|
+ if (!canceled && di->job) {
|
|
WITH_JOB_LOCK_GUARD() {
|
|
job_cancel_sync_locked(&di->job->job, true);
|
|
- job_unref_locked(&di->job->job);
|
|
}
|
|
+ canceled = true;
|
|
}
|
|
}
|
|
}
|
|
@@ -943,6 +948,7 @@ err:
|
|
|
|
if (pbs) {
|
|
proxmox_backup_disconnect(pbs);
|
|
+ backup_state.pbs = NULL;
|
|
}
|
|
|
|
if (backup_dir) {
|