]> git.proxmox.com Git - pve-qemu-kvm.git/blame - debian/patches/backup-do-not-return-errors-in-dump-callback.patch
Two more fixes
[pve-qemu-kvm.git] / debian / patches / backup-do-not-return-errors-in-dump-callback.patch
CommitLineData
7d0363fc
DM
1The backup dump_cb should always return success. Else the original write
2does not succeed and the VM gets notified.
3
4We simply report success and cancel the backup job instead.
5
6
7Index: new/blockdev.c
8===================================================================
24bb7da3
DM
9--- new.orig/blockdev.c 2014-11-20 07:49:05.000000000 +0100
10+++ new/blockdev.c 2014-11-20 07:49:14.000000000 +0100
11@@ -1991,6 +1991,11 @@
7d0363fc
DM
12 {
13 PVEBackupDevInfo *di = opaque;
14
15+ int size = n_sectors * BDRV_SECTOR_SIZE;
16+ if (backup_state.cancel) {
17+ return size; // return success
18+ }
19+
20 if (sector_num & 0x7f) {
21 if (!backup_state.error) {
22 error_setg(&backup_state.error,
24bb7da3 23@@ -2001,7 +2006,6 @@
7d0363fc
DM
24 }
25
26 int64_t cluster_num = sector_num >> 7;
27- int size = n_sectors * BDRV_SECTOR_SIZE;
28
29 int ret = -1;
30
24bb7da3 31@@ -2009,17 +2013,27 @@
7d0363fc
DM
32 size_t zero_bytes = 0;
33 ret = vma_writer_write(backup_state.vmaw, di->dev_id, cluster_num,
34 buf, &zero_bytes);
35- backup_state.zero_bytes += zero_bytes;
36+ if (ret < 0) {
37+ if (!backup_state.error) {
38+ error_setg(&backup_state.error, "vma_writer_write error %d", ret);
39+ }
40+ if (di->bs && di->bs->job) {
41+ block_job_cancel(di->bs->job);
42+ }
43+ } else {
44+ backup_state.zero_bytes += zero_bytes;
45+ backup_state.transferred += size;
46+ }
47 } else {
48- ret = size;
49 if (!buf) {
50 backup_state.zero_bytes += size;
51 }
52+ backup_state.transferred += size;
53 }
54
55- backup_state.transferred += size;
56+ // Note: always return success, because we want that writes succeed anyways.
57
58- return ret;
59+ return size;
60 }
61
62 static void pvebackup_cleanup(void)
24bb7da3 63@@ -2091,7 +2105,7 @@
7d0363fc
DM
64 BlockJob *job = di->bs->job;
65 if (job) {
66 if (!di->completed) {
67- block_job_cancel_sync(job);
68+ block_job_cancel_sync(job);
69 }
70 }
71 }