+++ /dev/null
-The backup dump_cb should always return success. Else the original write
-does not succeed and the VM gets notified.
-
-We simply report success and cancel the backup job instead.
-
-
-Index: new/blockdev.c
-===================================================================
---- new.orig/blockdev.c 2014-11-20 07:49:05.000000000 +0100
-+++ new/blockdev.c 2014-11-20 07:49:14.000000000 +0100
-@@ -1991,6 +1991,11 @@
- {
- PVEBackupDevInfo *di = opaque;
-
-+ int size = n_sectors * BDRV_SECTOR_SIZE;
-+ if (backup_state.cancel) {
-+ return size; // return success
-+ }
-+
- if (sector_num & 0x7f) {
- if (!backup_state.error) {
- error_setg(&backup_state.error,
-@@ -2001,7 +2006,6 @@
- }
-
- int64_t cluster_num = sector_num >> 7;
-- int size = n_sectors * BDRV_SECTOR_SIZE;
-
- int ret = -1;
-
-@@ -2009,17 +2013,27 @@
- size_t zero_bytes = 0;
- ret = vma_writer_write(backup_state.vmaw, di->dev_id, cluster_num,
- buf, &zero_bytes);
-- backup_state.zero_bytes += zero_bytes;
-+ if (ret < 0) {
-+ if (!backup_state.error) {
-+ error_setg(&backup_state.error, "vma_writer_write error %d", ret);
-+ }
-+ if (di->bs && di->bs->job) {
-+ block_job_cancel(di->bs->job);
-+ }
-+ } else {
-+ backup_state.zero_bytes += zero_bytes;
-+ backup_state.transferred += size;
-+ }
- } else {
-- ret = size;
- if (!buf) {
- backup_state.zero_bytes += size;
- }
-+ backup_state.transferred += size;
- }
-
-- backup_state.transferred += size;
-+ // Note: always return success, because we want that writes succeed anyways.
-
-- return ret;
-+ return size;
- }
-
- static void pvebackup_cleanup(void)
-@@ -2091,7 +2105,7 @@
- BlockJob *job = di->bs->job;
- if (job) {
- if (!di->completed) {
-- block_job_cancel_sync(job);
-+ block_job_cancel_sync(job);
- }
- }
- }