]> git.proxmox.com Git - pve-qemu-kvm.git/blobdiff - debian/patches/backup-add-pve-monitor-commands.patch
update to qemu 2.2.0-rc2
[pve-qemu-kvm.git] / debian / patches / backup-add-pve-monitor-commands.patch
index da3612e0695d2f8d78716fc8e10f00a2c302a02c..6a2cd61be326cc87f9f9df4151bffe93f68a519d 100644 (file)
@@ -1,17 +1,17 @@
 Index: new/blockdev.c
 ===================================================================
---- new.orig/blockdev.c        2013-12-03 07:34:22.000000000 +0100
-+++ new/blockdev.c     2013-12-03 08:50:24.000000000 +0100
-@@ -45,6 +45,7 @@
+--- new.orig/blockdev.c        2014-11-20 07:36:12.000000000 +0100
++++ new/blockdev.c     2014-11-20 07:47:31.000000000 +0100
+@@ -46,6 +46,7 @@
  #include "qmp-commands.h"
  #include "trace.h"
  #include "sysemu/arch_init.h"
 +#include "vma.h"
  
- static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
-@@ -1438,6 +1439,419 @@
-     }
+ static const char *const if_name[IF_COUNT] = {
+     [IF_NONE] = "none",
+@@ -1954,6 +1955,437 @@
+     bdrv_put_ref_bh_schedule(bs);
  }
  
 +/* PVE backup related function */
@@ -34,6 +34,7 @@ Index: new/blockdev.c
 +
 +typedef struct PVEBackupDevInfo {
 +    BlockDriverState *bs;
++    size_t size;
 +    uint8_t dev_id;
 +    //bool started;
 +    bool completed;
@@ -41,50 +42,49 @@ Index: new/blockdev.c
 +
 +static void pvebackup_run_next_job(void);
 +
-+static int pvebackup_dump_cb(void *opaque, BlockDriverState *bs,
-+                             int64_t cluster_num, unsigned char *buf)
++static int pvebackup_dump_cb(void *opaque, BlockDriverState *target,
++                             int64_t sector_num, int n_sectors,
++                             unsigned char *buf)
 +{
 +    PVEBackupDevInfo *di = opaque;
 +
-+    assert(backup_state.vmaw);
-+
-+    size_t zero_bytes = 0;
-+    return vma_writer_write(backup_state.vmaw, di->dev_id, cluster_num,
-+                            buf, &zero_bytes);
-+}
-+
-+static void pvebackup_update_status(void)
-+{
-+    g_assert(backup_state.vmaw);
-+
-+    VmaStatus vmastat;
++    if (sector_num & 0x7f) {
++        if (!backup_state.error) {
++            error_setg(&backup_state.error,
++                       "got unaligned write inside backup dump "
++                       "callback (sector %ld)", sector_num);
++        }
++        return -1; // not aligned to cluster size
++    }
 +
-+    vma_writer_get_status(backup_state.vmaw, &vmastat);
++    int64_t cluster_num = sector_num >> 7;
++    int size = n_sectors * BDRV_SECTOR_SIZE;
 +
-+    uint64_t total = 0;
-+    uint64_t transferred = 0;
-+    uint64_t zero_bytes = 0;
++    int ret = -1;
 +
-+    int i;
-+    for (i = 0; i < 256; i++) {
-+        if (vmastat.stream_info[i].size) {
-+            total += vmastat.stream_info[i].size;
-+            transferred += vmastat.stream_info[i].transferred;
-+            zero_bytes += vmastat.stream_info[i].zero_bytes;
++    if (backup_state.vmaw) {
++        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;
++    } else {
++        ret = size;
++        if (!buf) {
++            backup_state.zero_bytes += size;
 +        }
 +    }
 +
-+    backup_state.total = total;
-+    backup_state.transferred = transferred;
-+    backup_state.zero_bytes = zero_bytes;
++    backup_state.transferred += size;
++
++    return ret;
 +}
 +
 +static void pvebackup_cleanup(void)
 +{
++    backup_state.end_time = time(NULL);
++
 +    if (backup_state.vmaw) {
-+        backup_state.end_time = time(NULL);
 +        Error *local_err = NULL;
-+        pvebackup_update_status();
 +        vma_writer_close(backup_state.vmaw, &local_err);
 +        error_propagate(&backup_state.error, local_err);
 +        backup_state.vmaw = NULL;
@@ -109,10 +109,20 @@ Index: new/blockdev.c
 +    assert(backup_state.vmaw);
 +
 +    di->completed = true;
++
++    if (ret < 0 && !backup_state.error) {
++        error_setg(&backup_state.error, "job failed with err %d - %s",
++                   ret, strerror(-ret));
++    }
++
++    BlockDriverState *bs = di->bs;
++
 +    di->bs = NULL;
 +
 +    vma_writer_close_stream(backup_state.vmaw, di->dev_id);
 +
++    block_job_cb(bs, ret);
++
 +    if (!backup_state.cancel) {
 +        pvebackup_run_next_job();
 +    }
@@ -133,7 +143,7 @@ Index: new/blockdev.c
 +    while (l) {
 +        PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
 +        l = g_list_next(l);
-+        if (!di->completed && di->bs) { 
++        if (!di->completed && di->bs) {
 +            BlockJob *job = di->bs->job;
 +            if (job) {
 +                if (!di->completed) {
@@ -152,7 +162,8 @@ Index: new/blockdev.c
 +    qemu_coroutine_enter(co, NULL);
 +
 +    while (backup_state.vmaw) {
-+        qemu_aio_wait();
++        /* vma writer use main aio context */
++        aio_poll(qemu_get_aio_context(), true);
 +    }
 +}
 +
@@ -252,21 +263,30 @@ Index: new/blockdev.c
 +        goto err;
 +    }
 +
++    size_t total = 0;
++
 +    l = di_list;
 +    while (l) {
 +        PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
 +        l = g_list_next(l);
-+        if (di->bs->job) {
-+            error_set(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(di->bs));
++        if (bdrv_op_is_blocked(di->bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
++            goto err;
++        }
++
++        ssize_t size = bdrv_getlength(di->bs);
++        if (size < 0) {
++            error_setg_errno(errp, -di->size, "bdrv_getlength failed");
 +            goto err;
 +        }
++        di->size = size;
++        total += size;
 +    }
 +
 +    uuid_generate(uuid);
 +
 +    vmaw = vma_writer_create(backup_file, uuid, &local_err);
 +    if (!vmaw) {
-+        if (error_is_set(&local_err)) {
++        if (local_err) {
 +            error_propagate(errp, local_err);
 +        }
 +        goto err;
@@ -278,9 +298,8 @@ Index: new/blockdev.c
 +        PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
 +        l = g_list_next(l);
 +
-+        int64_t size = bdrv_getlength(di->bs);
 +        const char *devname = bdrv_get_device_name(di->bs);
-+        di->dev_id = vma_writer_register_stream(vmaw, devname, size);
++        di->dev_id = vma_writer_register_stream(vmaw, devname, di->size);
 +        if (di->dev_id <= 0) {
 +            error_set(errp, ERROR_CLASS_GENERIC_ERROR,
 +                      "register_stream failed");
@@ -333,7 +352,9 @@ Index: new/blockdev.c
 +
 +    backup_state.di_list = di_list;
 +
-+    pvebackup_update_status();
++    backup_state.total = total;
++    backup_state.transferred = 0;
++    backup_state.zero_bytes = 0;
 +
 +    /* start all jobs (paused state) */
 +    l = di_list;
@@ -414,10 +435,6 @@ Index: new/blockdev.c
 +        info->status = g_strdup("active");
 +    }
 +
-+    if (backup_state.vmaw) {
-+        pvebackup_update_status();
-+    }
-+
 +    info->has_total = true;
 +    info->total = backup_state.total;
 +    info->has_zero_bytes = true;
@@ -427,14 +444,15 @@ Index: new/blockdev.c
 +
 +    return info;
 +}
- static void eject_device(BlockDriverState *bs, int force, Error **errp)
- {
++
+ void qmp_block_stream(const char *device,
+                       bool has_base, const char *base,
+                       bool has_backing_file, const char *backing_file,
 Index: new/hmp-commands.hx
 ===================================================================
---- new.orig/hmp-commands.hx   2013-12-03 06:36:18.000000000 +0100
-+++ new/hmp-commands.hx        2013-12-03 07:34:22.000000000 +0100
-@@ -83,6 +83,35 @@
+--- new.orig/hmp-commands.hx   2014-11-20 06:45:05.000000000 +0100
++++ new/hmp-commands.hx        2014-11-20 07:47:31.000000000 +0100
+@@ -88,6 +88,35 @@
  Copy data from a backing file into a block device.
  ETEXI
  
@@ -470,7 +488,7 @@ Index: new/hmp-commands.hx
      {
          .name       = "block_job_set_speed",
          .args_type  = "device:B,speed:o",
-@@ -1692,6 +1721,8 @@
+@@ -1760,6 +1789,8 @@
  show CPU statistics
  @item info usernet
  show user network stack connection states
@@ -481,9 +499,9 @@ Index: new/hmp-commands.hx
  @item info migrate_capabilities
 Index: new/hmp.c
 ===================================================================
---- new.orig/hmp.c     2013-12-03 07:34:22.000000000 +0100
-+++ new/hmp.c  2013-12-03 07:34:22.000000000 +0100
-@@ -133,6 +133,38 @@
+--- new.orig/hmp.c     2014-11-20 07:26:23.000000000 +0100
++++ new/hmp.c  2014-11-20 07:47:31.000000000 +0100
+@@ -137,6 +137,44 @@
      qapi_free_MouseInfoList(mice_list);
  }
  
@@ -500,7 +518,13 @@ Index: new/hmp.c
 +            monitor_printf(mon, "Backup status: %s\n", info->status);
 +        }
 +    }
++
 +    if (info->has_backup_file) {
++        monitor_printf(mon, "Start time: %s", ctime(&info->start_time));
++        if (info->end_time) {
++            monitor_printf(mon, "End time: %s", ctime(&info->end_time));
++        }
++
 +        int per = (info->has_total && info->total &&
 +            info->has_transferred && info->transferred) ?
 +            (info->transferred * 100)/info->total : 0;
@@ -522,49 +546,41 @@ Index: new/hmp.c
  void hmp_info_migrate(Monitor *mon, const QDict *qdict)
  {
      MigrationInfo *info;
-@@ -1194,6 +1226,37 @@
+@@ -1212,6 +1250,29 @@
      hmp_handle_error(mon, &error);
  }
++
 +void hmp_backup_cancel(Monitor *mon, const QDict *qdict)
 +{
-+    Error *errp = NULL;
++    Error *error = NULL;
 +
-+    qmp_backup_cancel(&errp);
++    qmp_backup_cancel(&error);
 +
-+    if (error_is_set(&errp)) {
-+        monitor_printf(mon, "%s\n", error_get_pretty(errp));
-+        error_free(errp);
-+        return;
-+    }
++    hmp_handle_error(mon, &error);
 +}
 +
 +void hmp_backup(Monitor *mon, const QDict *qdict)
 +{
-+    const char *backup_file = qdict_get_str(qdict, "backup-file");
++    Error *error = NULL;
++
++    const char *backup_file = qdict_get_str(qdict, "backupfile");
 +    const char *devlist = qdict_get_try_str(qdict, "devlist");
 +    int64_t speed = qdict_get_try_int(qdict, "speed", 0);
 +
-+    Error *errp = NULL;
-+
 +    qmp_backup(backup_file, true, BACKUP_FORMAT_VMA, false, NULL, !!devlist,
-+               devlist, qdict_haskey(qdict, "speed"), speed, &errp);
++               devlist, qdict_haskey(qdict, "speed"), speed, &error);
 +
-+    if (error_is_set(&errp)) {
-+        monitor_printf(mon, "%s\n", error_get_pretty(errp));
-+        error_free(errp);
-+        return;
-+    }
++    hmp_handle_error(mon, &error);
 +}
-+
  void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
  {
-     Error *error = NULL;
 Index: new/hmp.h
 ===================================================================
---- new.orig/hmp.h     2013-12-03 06:36:18.000000000 +0100
-+++ new/hmp.h  2013-12-03 07:34:22.000000000 +0100
-@@ -28,6 +28,7 @@
+--- new.orig/hmp.h     2014-11-20 06:45:05.000000000 +0100
++++ new/hmp.h  2014-11-20 07:47:31.000000000 +0100
+@@ -29,6 +29,7 @@
  void hmp_info_migrate(Monitor *mon, const QDict *qdict);
  void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
  void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
@@ -572,7 +588,7 @@ Index: new/hmp.h
  void hmp_info_cpus(Monitor *mon, const QDict *qdict);
  void hmp_info_block(Monitor *mon, const QDict *qdict);
  void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
-@@ -69,6 +70,8 @@
+@@ -70,6 +71,8 @@
  void hmp_change(Monitor *mon, const QDict *qdict);
  void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict);
  void hmp_block_stream(Monitor *mon, const QDict *qdict);
@@ -583,9 +599,9 @@ Index: new/hmp.h
  void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
 Index: new/monitor.c
 ===================================================================
---- new.orig/monitor.c 2013-12-03 06:36:18.000000000 +0100
-+++ new/monitor.c      2013-12-03 07:34:22.000000000 +0100
-@@ -2880,6 +2880,13 @@
+--- new.orig/monitor.c 2014-11-20 06:45:06.000000000 +0100
++++ new/monitor.c      2014-11-20 07:47:31.000000000 +0100
+@@ -2848,6 +2848,13 @@
      },
  #endif
      {
@@ -601,9 +617,9 @@ Index: new/monitor.c
          .params     = "",
 Index: new/qapi-schema.json
 ===================================================================
---- new.orig/qapi-schema.json  2013-12-03 07:34:22.000000000 +0100
-+++ new/qapi-schema.json       2013-12-03 07:34:22.000000000 +0100
-@@ -547,6 +547,95 @@
+--- new.orig/qapi-schema.json  2014-11-20 07:26:43.000000000 +0100
++++ new/qapi-schema.json       2014-11-20 07:47:31.000000000 +0100
+@@ -352,6 +352,95 @@
  ##
  { 'command': 'query-events', 'returns': ['EventInfo'] }
  
@@ -701,9 +717,9 @@ Index: new/qapi-schema.json
  #
 Index: new/qmp-commands.hx
 ===================================================================
---- new.orig/qmp-commands.hx   2013-12-03 07:34:22.000000000 +0100
-+++ new/qmp-commands.hx        2013-12-03 07:34:22.000000000 +0100
-@@ -966,6 +966,24 @@
+--- new.orig/qmp-commands.hx   2014-11-20 07:26:23.000000000 +0100
++++ new/qmp-commands.hx        2014-11-20 07:47:31.000000000 +0100
+@@ -1097,6 +1097,24 @@
  EQMP
  
      {