]>
Commit | Line | Data |
---|---|---|
7d0363fc DM |
1 | The backup dump_cb should always return success. Else the original write |
2 | does not succeed and the VM gets notified. | |
3 | ||
4 | We simply report success and cancel the backup job instead. | |
5 | ||
6 | ||
7 | Index: new/blockdev.c | |
8 | =================================================================== | |
b6a0426e DM |
9 | --- new.orig/blockdev.c 2014-05-05 09:36:50.000000000 +0200 |
10 | +++ new/blockdev.c 2014-05-05 09:40:22.000000000 +0200 | |
11 | @@ -1862,6 +1862,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, | |
b6a0426e | 23 | @@ -1872,7 +1877,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 | ||
b6a0426e | 31 | @@ -1880,17 +1884,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) | |
b6a0426e | 63 | @@ -1962,7 +1976,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 | } |