Index: new/blockdev.c
===================================================================
---- new.orig/blockdev.c 2013-12-02 11:40:36.000000000 +0100
-+++ new/blockdev.c 2013-12-02 12:07:54.000000000 +0100
+--- new.orig/blockdev.c 2013-12-02 12:54:24.000000000 +0100
++++ new/blockdev.c 2013-12-02 14:10:24.000000000 +0100
@@ -45,6 +45,7 @@
#include "qmp-commands.h"
#include "trace.h"
static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
-@@ -1438,6 +1439,417 @@
+@@ -1438,6 +1439,418 @@
}
}
+ while (l) {
+ PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
+ l = g_list_next(l);
-+
-+ if (di->bs && di->bs->job && !di->completed) {
-+ if (block_job_is_paused(di->bs->job)) {
++ BlockJob *job = di->bs->job;
++ if (di->bs && job && !di->completed) {
++ if (block_job_is_paused(job)) {
+ bool cancel = backup_state.error || backup_state.cancel;
+ if (cancel) {
-+ block_job_cancel(di->bs->job);
++ block_job_cancel(job);
+ } else {
-+ block_job_resume(di->bs->job);
++ block_job_resume(job);
+ }
+ }
+ return;
+
+ backup_start(di->bs, NULL, speed, MIRROR_SYNC_MODE_FULL,
+ BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
-+ pvebackup_dump_cb, pvebackup_complete_cb, di, &local_err);
++ pvebackup_dump_cb, pvebackup_complete_cb, di,
++ true, &local_err);
+ if (local_err != NULL) {
+ error_setg(&backup_state.error, "backup_job_create failed");
+ pvebackup_cancel(NULL);
{
Index: new/hmp-commands.hx
===================================================================
---- new.orig/hmp-commands.hx 2013-11-27 10:51:33.000000000 +0100
-+++ new/hmp-commands.hx 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/hmp-commands.hx 2013-12-02 12:49:36.000000000 +0100
++++ new/hmp-commands.hx 2013-12-02 12:58:31.000000000 +0100
@@ -83,6 +83,35 @@
Copy data from a backing file into a block device.
ETEXI
@item info migrate_capabilities
Index: new/hmp.c
===================================================================
---- new.orig/hmp.c 2013-12-02 11:40:35.000000000 +0100
-+++ new/hmp.c 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/hmp.c 2013-12-02 12:49:36.000000000 +0100
++++ new/hmp.c 2013-12-02 12:58:31.000000000 +0100
@@ -133,6 +133,38 @@
qapi_free_MouseInfoList(mice_list);
}
Error *error = NULL;
Index: new/hmp.h
===================================================================
---- new.orig/hmp.h 2013-11-27 10:51:33.000000000 +0100
-+++ new/hmp.h 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/hmp.h 2013-12-02 12:49:36.000000000 +0100
++++ new/hmp.h 2013-12-02 12:58:31.000000000 +0100
@@ -28,6 +28,7 @@
void hmp_info_migrate(Monitor *mon, const QDict *qdict);
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
Index: new/monitor.c
===================================================================
---- new.orig/monitor.c 2013-11-27 10:51:33.000000000 +0100
-+++ new/monitor.c 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/monitor.c 2013-12-02 12:49:36.000000000 +0100
++++ new/monitor.c 2013-12-02 12:58:31.000000000 +0100
@@ -2880,6 +2880,13 @@
},
#endif
.params = "",
Index: new/qapi-schema.json
===================================================================
---- new.orig/qapi-schema.json 2013-12-02 11:40:35.000000000 +0100
-+++ new/qapi-schema.json 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/qapi-schema.json 2013-12-02 12:49:36.000000000 +0100
++++ new/qapi-schema.json 2013-12-02 12:58:31.000000000 +0100
@@ -547,6 +547,95 @@
##
{ 'command': 'query-events', 'returns': ['EventInfo'] }
#
Index: new/qmp-commands.hx
===================================================================
---- new.orig/qmp-commands.hx 2013-12-02 11:40:35.000000000 +0100
-+++ new/qmp-commands.hx 2013-12-02 11:40:36.000000000 +0100
+--- new.orig/qmp-commands.hx 2013-12-02 12:49:36.000000000 +0100
++++ new/qmp-commands.hx 2013-12-02 12:58:31.000000000 +0100
@@ -966,6 +966,24 @@
EQMP
Index: new/block/backup.c
===================================================================
---- new.orig/block/backup.c 2013-11-27 10:51:32.000000000 +0100
-+++ new/block/backup.c 2013-12-02 07:41:30.000000000 +0100
+--- new.orig/block/backup.c 2013-12-02 12:30:23.000000000 +0100
++++ new/block/backup.c 2013-12-02 12:56:03.000000000 +0100
@@ -39,6 +39,7 @@
BlockDriverState *target;
MirrorSyncMode sync_mode;
block_job_completed(&job->common, ret);
}
-@@ -347,13 +364,14 @@
+@@ -347,13 +364,15 @@
int64_t speed, MirrorSyncMode sync_mode,
BlockdevOnError on_source_error,
BlockdevOnError on_target_error,
+ BackupDumpFunc *dump_cb,
BlockDriverCompletionFunc *cb, void *opaque,
++ bool paused,
Error **errp)
{
int64_t len;
assert(cb);
if ((on_source_error == BLOCKDEV_ON_ERROR_STOP ||
-@@ -376,6 +394,7 @@
+@@ -376,10 +395,12 @@
return;
}
job->on_source_error = on_source_error;
job->on_target_error = on_target_error;
job->target = target;
+ job->sync_mode = sync_mode;
++ job->common.paused = paused;
+ job->common.len = len;
+ job->common.co = qemu_coroutine_create(backup_run);
+ qemu_coroutine_enter(job->common.co, job);
Index: new/blockdev.c
===================================================================
---- new.orig/blockdev.c 2013-12-02 06:12:24.000000000 +0100
-+++ new/blockdev.c 2013-12-02 08:43:25.000000000 +0100
+--- new.orig/blockdev.c 2013-12-02 12:30:23.000000000 +0100
++++ new/blockdev.c 2013-12-02 12:54:24.000000000 +0100
@@ -1932,7 +1932,7 @@
}
backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error,
- block_job_cb, bs, &local_err);
-+ NULL, block_job_cb, bs, &local_err);
++ NULL, block_job_cb, bs, false, &local_err);
if (local_err != NULL) {
bdrv_unref(target_bs);
error_propagate(errp, local_err);
Index: new/include/block/block_int.h
===================================================================
---- new.orig/include/block/block_int.h 2013-11-27 10:51:33.000000000 +0100
-+++ new/include/block/block_int.h 2013-12-02 07:40:35.000000000 +0100
+--- new.orig/include/block/block_int.h 2013-12-02 12:30:23.000000000 +0100
++++ new/include/block/block_int.h 2013-12-02 12:52:21.000000000 +0100
@@ -54,6 +54,9 @@
#define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts"
#define BLOCK_OPT_ADAPTER_TYPE "adapter_type"
typedef struct BdrvTrackedRequest {
BlockDriverState *bs;
int64_t sector_num;
-@@ -427,6 +430,7 @@
+@@ -427,7 +430,9 @@
int64_t speed, MirrorSyncMode sync_mode,
BlockdevOnError on_source_error,
BlockdevOnError on_target_error,
+ BackupDumpFunc *dump_cb,
BlockDriverCompletionFunc *cb, void *opaque,
++ bool paused,
Error **errp);
+ #endif /* BLOCK_INT_H */