--- /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-03-26 06:50:24.000000000 +0100
++++ new/blockdev.c 2014-03-26 08:44:29.000000000 +0100
+@@ -1772,6 +1772,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,
+@@ -1782,7 +1787,6 @@
+ }
+
+ int64_t cluster_num = sector_num >> 7;
+- int size = n_sectors * BDRV_SECTOR_SIZE;
+
+ int ret = -1;
+
+@@ -1790,17 +1794,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)
+@@ -1872,7 +1886,7 @@
+ BlockJob *job = di->bs->job;
+ if (job) {
+ if (!di->completed) {
+- block_job_cancel_sync(job);
++ block_job_cancel_sync(job);
+ }
+ }
+ }