]> git.proxmox.com Git - pve-qemu-kvm.git/blame - debian/patches/pve/0017-backup-do-not-return-errors-in-dump-callback.patch
fix backup jobs for multiple disks
[pve-qemu-kvm.git] / debian / patches / pve / 0017-backup-do-not-return-errors-in-dump-callback.patch
CommitLineData
87ba737b 1From f859377de12e2faa46046b266ce4418c138e61ab Mon Sep 17 00:00:00 2001
ca0fe5f5
WB
2From: Wolfgang Bumiller <w.bumiller@proxmox.com>
3Date: Wed, 9 Dec 2015 15:22:19 +0100
9c3bec39 4Subject: [PATCH 17/47] backup: do not return errors in dump callback
ca0fe5f5
WB
5
6---
7 blockdev.c | 26 ++++++++++++++++++++------
8 1 file changed, 20 insertions(+), 6 deletions(-)
9
10diff --git a/blockdev.c b/blockdev.c
87ba737b 11index af1b9d4..4b073d4 100644
ca0fe5f5
WB
12--- a/blockdev.c
13+++ b/blockdev.c
1a91ab45 14@@ -3019,6 +3019,11 @@ static int pvebackup_dump_cb(void *opaque, BlockBackend *target,
ca0fe5f5
WB
15 {
16 PVEBackupDevInfo *di = opaque;
17
18+ int size = n_sectors * BDRV_SECTOR_SIZE;
19+ if (backup_state.cancel) {
20+ return size; // return success
21+ }
22+
23 if (sector_num & 0x7f) {
24 if (!backup_state.error) {
25 error_setg(&backup_state.error,
1a91ab45 26@@ -3029,7 +3034,6 @@ static int pvebackup_dump_cb(void *opaque, BlockBackend *target,
ca0fe5f5
WB
27 }
28
29 int64_t cluster_num = sector_num >> 7;
30- int size = n_sectors * BDRV_SECTOR_SIZE;
31
32 int ret = -1;
33
1a91ab45 34@@ -3037,17 +3041,27 @@ static int pvebackup_dump_cb(void *opaque, BlockBackend *target,
ca0fe5f5
WB
35 size_t zero_bytes = 0;
36 ret = vma_writer_write(backup_state.vmaw, di->dev_id, cluster_num,
37 buf, &zero_bytes);
38- backup_state.zero_bytes += zero_bytes;
39+ if (ret < 0) {
40+ if (!backup_state.error) {
41+ error_setg(&backup_state.error, "vma_writer_write error %d", ret);
42+ }
43+ if (di->bs && di->bs->job) {
44+ block_job_cancel(di->bs->job);
45+ }
46+ } else {
47+ backup_state.zero_bytes += zero_bytes;
48+ backup_state.transferred += size;
49+ }
50 } else {
51- ret = size;
52 if (!buf) {
53 backup_state.zero_bytes += size;
54 }
55+ backup_state.transferred += size;
56 }
57
58- backup_state.transferred += size;
59+ // Note: always return success, because we want that writes succeed anyways.
60
61- return ret;
62+ return size;
63 }
64
65 static void pvebackup_cleanup(void)
1a91ab45 66@@ -3119,7 +3133,7 @@ static void pvebackup_cancel(void *opaque)
ca0fe5f5
WB
67 BlockJob *job = di->bs->job;
68 if (job) {
69 if (!di->completed) {
70- block_job_cancel_sync(job);
71+ block_job_cancel_sync(job);
72 }
73 }
74 }
75--
762.1.4
77