Update and rebase to QEMU 4.1
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
This commit is contained in:
parent
42d06563fb
commit
be901f6656
@ -1,11 +1,11 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Date: Wed, 2 Oct 2019 09:41:34 +0200
|
||||
Date: Wed, 2 Oct 2019 10:30:03 +0200
|
||||
Subject: [PATCH] monitor/qmp: resume monitor when clearing its queue
|
||||
|
||||
When a monitor's queue is filled up in handle_qmp_command()
|
||||
it gets suspended. It's the dispatcher bh's job currently to
|
||||
resume the monitor, which it does after processing an even
|
||||
resume the monitor, which it does after processing an event
|
||||
from the queue. However, it is possible for a
|
||||
CHR_EVENT_CLOSED event to be processed before before the bh
|
||||
is scheduled, which will clear the queue without resuming
|
||||
@ -16,30 +16,21 @@ was filled up.
|
||||
|
||||
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
---
|
||||
monitor.c | 21 ++++++++++++++++-----
|
||||
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||
monitor/qmp.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/monitor.c b/monitor.c
|
||||
index 4807bbe811..daadbcdede 100644
|
||||
--- a/monitor.c
|
||||
+++ b/monitor.c
|
||||
@@ -356,12 +356,28 @@ static void qmp_request_free(QMPRequest *req)
|
||||
g_free(req);
|
||||
}
|
||||
|
||||
+static bool qmp_oob_enabled(Monitor *mon)
|
||||
+{
|
||||
+ return mon->qmp.capab[QMP_CAPABILITY_OOB];
|
||||
+}
|
||||
+
|
||||
diff --git a/monitor/qmp.c b/monitor/qmp.c
|
||||
index e1b196217d..fb3e66c62a 100644
|
||||
--- a/monitor/qmp.c
|
||||
+++ b/monitor/qmp.c
|
||||
@@ -70,9 +70,19 @@ static void qmp_request_free(QMPRequest *req)
|
||||
/* Caller must hold mon->qmp.qmp_queue_lock */
|
||||
static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon)
|
||||
static void monitor_qmp_cleanup_req_queue_locked(MonitorQMP *mon)
|
||||
{
|
||||
+ bool need_resume =
|
||||
+ (!qmp_oob_enabled(mon) && mon->qmp.qmp_requests->length > 0)
|
||||
+ || mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX;
|
||||
while (!g_queue_is_empty(mon->qmp.qmp_requests)) {
|
||||
qmp_request_free(g_queue_pop_head(mon->qmp.qmp_requests));
|
||||
+ bool need_resume = (!qmp_oob_enabled(mon) && mon->qmp_requests->length > 0)
|
||||
+ || mon->qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX;
|
||||
while (!g_queue_is_empty(mon->qmp_requests)) {
|
||||
qmp_request_free(g_queue_pop_head(mon->qmp_requests));
|
||||
}
|
||||
+ if (need_resume) {
|
||||
+ /*
|
||||
@ -47,20 +38,8 @@ index 4807bbe811..daadbcdede 100644
|
||||
+ * queue gets cleared from a CH_EVENT_CLOSED event before the dispatch
|
||||
+ * bh got scheduled.
|
||||
+ */
|
||||
+ monitor_resume(mon);
|
||||
+ monitor_resume(&mon->common);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void monitor_qmp_cleanup_queues(Monitor *mon)
|
||||
@@ -1157,11 +1173,6 @@ static void monitor_init_qmp_commands(void)
|
||||
qmp_marshal_qmp_capabilities, QCO_ALLOW_PRECONFIG);
|
||||
}
|
||||
|
||||
-static bool qmp_oob_enabled(Monitor *mon)
|
||||
-{
|
||||
- return mon->qmp.capab[QMP_CAPABILITY_OOB];
|
||||
-}
|
||||
-
|
||||
static void monitor_qmp_caps_reset(Monitor *mon)
|
||||
{
|
||||
memset(mon->qmp.capab_offered, 0, sizeof(mon->qmp.capab_offered));
|
||||
static void monitor_qmp_cleanup_queues(MonitorQMP *mon)
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index c185f34a2e..0613f59c7b 100644
|
||||
index 4479cc7ab4..760648b78c 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -428,7 +428,7 @@ static QemuOptsList raw_runtime_opts = {
|
||||
@@ -430,7 +430,7 @@ static QemuOptsList raw_runtime_opts = {
|
||||
{
|
||||
.name = "locking",
|
||||
.type = QEMU_OPT_STRING,
|
||||
@ -26,7 +26,7 @@ index c185f34a2e..0613f59c7b 100644
|
||||
},
|
||||
{
|
||||
.name = "pr-manager",
|
||||
@@ -517,7 +517,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||
@@ -519,7 +519,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||
s->use_lock = false;
|
||||
break;
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
|
@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 83fb522554..154a443071 100644
|
||||
index 8b3dc5533e..1fea162e02 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -1720,9 +1720,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||
@@ -1725,9 +1725,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
||||
index 0632c74e9f..5593dfcb06 100644
|
||||
index 2ffc3335f0..c95bbd6c77 100644
|
||||
--- a/ui/spice-core.c
|
||||
+++ b/ui/spice-core.c
|
||||
@@ -667,32 +667,35 @@ void qemu_spice_init(void)
|
||||
@@ -668,32 +668,35 @@ void qemu_spice_init(void)
|
||||
|
||||
if (tls_port) {
|
||||
x509_dir = qemu_opt_get(opts, "x509-dir");
|
||||
|
@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index d98b737b8f..62ab2158f2 100644
|
||||
index 549c437050..66576b533e 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -2533,7 +2533,7 @@ bool pc_machine_is_smm_enabled(PCMachineState *pcms)
|
||||
@@ -2715,7 +2715,7 @@ bool pc_machine_is_smm_enabled(PCMachineState *pcms)
|
||||
if (tcg_enabled() || qtest_enabled()) {
|
||||
smm_available = true;
|
||||
} else if (kvm_enabled()) {
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index e664ca4462..70c59db107 100644
|
||||
index f64dc5b01e..061cab48c0 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -41,7 +41,7 @@
|
||||
@@ -42,7 +42,7 @@
|
||||
#define GLUSTER_DEBUG_DEFAULT 4
|
||||
#define GLUSTER_DEBUG_MAX 9
|
||||
#define GLUSTER_OPT_LOGFILE "logfile"
|
||||
@ -21,7 +21,7 @@ index e664ca4462..70c59db107 100644
|
||||
/*
|
||||
* Several versions of GlusterFS (3.12? -> 6.0.1) fail when the transfer size
|
||||
* is greater or equal to 1024 MiB, so we are limiting the transfer size to 512
|
||||
@@ -416,6 +416,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
|
||||
@@ -424,6 +424,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
|
||||
int old_errno;
|
||||
SocketAddressList *server;
|
||||
unsigned long long port;
|
||||
@ -29,7 +29,7 @@ index e664ca4462..70c59db107 100644
|
||||
|
||||
glfs = glfs_find_preopened(gconf->volume);
|
||||
if (glfs) {
|
||||
@@ -458,9 +459,15 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
|
||||
@@ -466,9 +467,15 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index 0c549c9935..7f7a5d4c35 100644
|
||||
index 59757b3120..d00c9d2d12 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -634,6 +634,8 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
|
||||
@@ -636,6 +636,8 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
|
||||
rados_conf_set(*cluster, "rbd_cache", "false");
|
||||
}
|
||||
|
||||
|
@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
3 files changed, 43 insertions(+)
|
||||
|
||||
diff --git a/net/net.c b/net/net.c
|
||||
index f3a3c5444c..1023cff921 100644
|
||||
index 7d4098254f..c6d5e66bfc 100644
|
||||
--- a/net/net.c
|
||||
+++ b/net/net.c
|
||||
@@ -1346,6 +1346,33 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
|
||||
@@ -1347,6 +1347,33 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ index f3a3c5444c..1023cff921 100644
|
||||
{
|
||||
NetClientState *nc;
|
||||
diff --git a/qapi/net.json b/qapi/net.json
|
||||
index 5f7bff1637..5991d1e5b8 100644
|
||||
index 728990f4fb..d53c66320b 100644
|
||||
--- a/qapi/net.json
|
||||
+++ b/qapi/net.json
|
||||
@@ -34,6 +34,21 @@
|
||||
@ -75,7 +75,7 @@ index 5f7bff1637..5991d1e5b8 100644
|
||||
# @netdev_add:
|
||||
#
|
||||
diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json
|
||||
index 4bd1223637..d8facba0a2 100644
|
||||
index 38af54d6b3..d6a4177935 100644
|
||||
--- a/qapi/qapi-schema.json
|
||||
+++ b/qapi/qapi-schema.json
|
||||
@@ -61,6 +61,7 @@
|
||||
|
@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index 70c59db107..e8e2739b53 100644
|
||||
index 061cab48c0..0ed1ec5856 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -56,6 +56,7 @@ typedef struct GlusterAIOCB {
|
||||
@@ -57,6 +57,7 @@ typedef struct GlusterAIOCB {
|
||||
int ret;
|
||||
Coroutine *coroutine;
|
||||
AioContext *aio_context;
|
||||
@ -27,7 +27,7 @@ index 70c59db107..e8e2739b53 100644
|
||||
} GlusterAIOCB;
|
||||
|
||||
typedef struct BDRVGlusterState {
|
||||
@@ -755,8 +756,10 @@ static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret,
|
||||
@@ -763,8 +764,10 @@ static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret,
|
||||
acb->ret = 0; /* Success */
|
||||
} else if (ret < 0) {
|
||||
acb->ret = -errno; /* Read/Write failed */
|
||||
@ -39,7 +39,7 @@ index 70c59db107..e8e2739b53 100644
|
||||
}
|
||||
|
||||
aio_co_schedule(acb->aio_context, acb->coroutine);
|
||||
@@ -1017,6 +1020,7 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
@@ -1035,6 +1038,7 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
acb.ret = 0;
|
||||
acb.coroutine = qemu_coroutine_self();
|
||||
acb.aio_context = bdrv_get_aio_context(bs);
|
||||
@ -47,7 +47,7 @@ index 70c59db107..e8e2739b53 100644
|
||||
|
||||
ret = glfs_zerofill_async(s->fd, offset, size, gluster_finish_aiocb, &acb);
|
||||
if (ret < 0) {
|
||||
@@ -1197,9 +1201,11 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
|
||||
@@ -1215,9 +1219,11 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
|
||||
acb.aio_context = bdrv_get_aio_context(bs);
|
||||
|
||||
if (write) {
|
||||
@ -59,7 +59,7 @@ index 70c59db107..e8e2739b53 100644
|
||||
ret = glfs_preadv_async(s->fd, qiov->iov, qiov->niov, offset, 0,
|
||||
gluster_finish_aiocb, &acb);
|
||||
}
|
||||
@@ -1261,6 +1267,7 @@ static coroutine_fn int qemu_gluster_co_flush_to_disk(BlockDriverState *bs)
|
||||
@@ -1279,6 +1285,7 @@ static coroutine_fn int qemu_gluster_co_flush_to_disk(BlockDriverState *bs)
|
||||
acb.ret = 0;
|
||||
acb.coroutine = qemu_coroutine_self();
|
||||
acb.aio_context = bdrv_get_aio_context(bs);
|
||||
@ -67,7 +67,7 @@ index 70c59db107..e8e2739b53 100644
|
||||
|
||||
ret = glfs_fsync_async(s->fd, gluster_finish_aiocb, &acb);
|
||||
if (ret < 0) {
|
||||
@@ -1307,6 +1314,7 @@ static coroutine_fn int qemu_gluster_co_pdiscard(BlockDriverState *bs,
|
||||
@@ -1325,6 +1332,7 @@ static coroutine_fn int qemu_gluster_co_pdiscard(BlockDriverState *bs,
|
||||
acb.ret = 0;
|
||||
acb.coroutine = qemu_coroutine_self();
|
||||
acb.aio_context = bdrv_get_aio_context(bs);
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index aa6f81f1ea..4546198471 100644
|
||||
index 79983772de..c64f260876 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -2717,7 +2717,8 @@ static int img_info(int argc, char **argv)
|
||||
@@ -2773,7 +2773,8 @@ static int img_info(int argc, char **argv)
|
||||
list = collect_image_info_list(image_opts, filename, fmt, chain,
|
||||
force_share);
|
||||
if (!list) {
|
||||
|
@ -37,7 +37,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
2 files changed, 122 insertions(+), 74 deletions(-)
|
||||
|
||||
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
||||
index 4b47f7495d..db1df8f60b 100644
|
||||
index 1c93e6d185..8094abb3ee 100644
|
||||
--- a/qemu-img-cmds.hx
|
||||
+++ b/qemu-img-cmds.hx
|
||||
@@ -56,9 +56,9 @@ STEXI
|
||||
@ -53,10 +53,10 @@ index 4b47f7495d..db1df8f60b 100644
|
||||
|
||||
DEF("info", img_info,
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index 4546198471..6e1a3b8933 100644
|
||||
index c64f260876..8129677d7a 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -4313,10 +4313,12 @@ out:
|
||||
@@ -4413,10 +4413,12 @@ out:
|
||||
#define C_IF 04
|
||||
#define C_OF 010
|
||||
#define C_SKIP 020
|
||||
@ -69,7 +69,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
};
|
||||
|
||||
struct DdIo {
|
||||
@@ -4395,6 +4397,20 @@ static int img_dd_skip(const char *arg,
|
||||
@@ -4495,6 +4497,20 @@ static int img_dd_skip(const char *arg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
static int img_dd(int argc, char **argv)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -4435,6 +4451,7 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4535,6 +4551,7 @@ static int img_dd(int argc, char **argv)
|
||||
{ "if", img_dd_if, C_IF },
|
||||
{ "of", img_dd_of, C_OF },
|
||||
{ "skip", img_dd_skip, C_SKIP },
|
||||
@ -98,7 +98,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
{ NULL, NULL, 0 }
|
||||
};
|
||||
const struct option long_options[] = {
|
||||
@@ -4513,8 +4530,13 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4613,8 +4630,13 @@ static int img_dd(int argc, char **argv)
|
||||
arg = NULL;
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
@@ -4526,85 +4548,101 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4626,85 +4648,101 @@ static int img_dd(int argc, char **argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
}
|
||||
|
||||
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
|
||||
@@ -4622,11 +4660,17 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4722,11 +4760,17 @@ static int img_dd(int argc, char **argv)
|
||||
|
||||
for (out_pos = 0; in_pos < size; block_count++) {
|
||||
int in_ret, out_ret;
|
||||
@ -302,7 +302,7 @@ index 4546198471..6e1a3b8933 100644
|
||||
}
|
||||
if (in_ret < 0) {
|
||||
error_report("error while reading from input image file: %s",
|
||||
@@ -4636,9 +4680,13 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4736,9 +4780,13 @@ static int img_dd(int argc, char **argv)
|
||||
}
|
||||
in_pos += in_ret;
|
||||
|
||||
|
@ -15,10 +15,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 26 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index 6e1a3b8933..6a76897c01 100644
|
||||
index 8129677d7a..1b7f211368 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -4314,11 +4314,13 @@ out:
|
||||
@@ -4414,11 +4414,13 @@ out:
|
||||
#define C_OF 010
|
||||
#define C_SKIP 020
|
||||
#define C_OSIZE 040
|
||||
@ -32,7 +32,7 @@ index 6e1a3b8933..6a76897c01 100644
|
||||
};
|
||||
|
||||
struct DdIo {
|
||||
@@ -4411,6 +4413,20 @@ static int img_dd_osize(const char *arg,
|
||||
@@ -4511,6 +4513,20 @@ static int img_dd_osize(const char *arg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -53,7 +53,7 @@ index 6e1a3b8933..6a76897c01 100644
|
||||
static int img_dd(int argc, char **argv)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -4425,12 +4441,14 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4525,12 +4541,14 @@ static int img_dd(int argc, char **argv)
|
||||
int c, i;
|
||||
const char *out_fmt = "raw";
|
||||
const char *fmt = NULL;
|
||||
@ -69,7 +69,7 @@ index 6e1a3b8933..6a76897c01 100644
|
||||
};
|
||||
struct DdIo in = {
|
||||
.bsz = 512, /* Block size is by default 512 bytes */
|
||||
@@ -4452,6 +4470,7 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4552,6 +4570,7 @@ static int img_dd(int argc, char **argv)
|
||||
{ "of", img_dd_of, C_OF },
|
||||
{ "skip", img_dd_skip, C_SKIP },
|
||||
{ "osize", img_dd_osize, C_OSIZE },
|
||||
@ -77,7 +77,7 @@ index 6e1a3b8933..6a76897c01 100644
|
||||
{ NULL, NULL, 0 }
|
||||
};
|
||||
const struct option long_options[] = {
|
||||
@@ -4658,14 +4677,18 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4758,14 +4777,18 @@ static int img_dd(int argc, char **argv)
|
||||
|
||||
in.buf = g_new(uint8_t, in.bsz);
|
||||
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 14 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index 6a76897c01..506ae959af 100644
|
||||
index 1b7f211368..e14d2370c4 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -4443,7 +4443,7 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4543,7 +4543,7 @@ static int img_dd(int argc, char **argv)
|
||||
const char *fmt = NULL;
|
||||
int64_t size = 0, readsize = 0;
|
||||
int64_t block_count = 0, out_pos, in_pos;
|
||||
@ -21,7 +21,7 @@ index 6a76897c01..506ae959af 100644
|
||||
struct DdInfo dd = {
|
||||
.flags = 0,
|
||||
.count = 0,
|
||||
@@ -4481,7 +4481,7 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4581,7 +4581,7 @@ static int img_dd(int argc, char **argv)
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
@ -30,7 +30,7 @@ index 6a76897c01..506ae959af 100644
|
||||
if (c == EOF) {
|
||||
break;
|
||||
}
|
||||
@@ -4501,6 +4501,9 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4601,6 +4601,9 @@ static int img_dd(int argc, char **argv)
|
||||
case 'h':
|
||||
help();
|
||||
break;
|
||||
@ -40,7 +40,7 @@ index 6a76897c01..506ae959af 100644
|
||||
case 'U':
|
||||
force_share = true;
|
||||
break;
|
||||
@@ -4641,13 +4644,15 @@ static int img_dd(int argc, char **argv)
|
||||
@@ -4741,13 +4744,15 @@ static int img_dd(int argc, char **argv)
|
||||
size - in.bsz * in.offset, &error_abort);
|
||||
}
|
||||
|
||||
|
@ -8,54 +8,13 @@ command.
|
||||
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
hmp.c | 30 +++++++++++++++++++++++++++++-
|
||||
hw/virtio/virtio-balloon.c | 33 +++++++++++++++++++++++++++++++--
|
||||
monitor/hmp-cmds.c | 30 +++++++++++++++++++++++++++++-
|
||||
qapi/misc.json | 22 +++++++++++++++++++++-
|
||||
3 files changed, 81 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hmp.c b/hmp.c
|
||||
index 8eec768088..25fe18cbcf 100644
|
||||
--- a/hmp.c
|
||||
+++ b/hmp.c
|
||||
@@ -863,7 +863,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
|
||||
return;
|
||||
}
|
||||
|
||||
- monitor_printf(mon, "balloon: actual=%" PRId64 "\n", info->actual >> 20);
|
||||
+ monitor_printf(mon, "balloon: actual=%" PRId64, info->actual >> 20);
|
||||
+ monitor_printf(mon, " max_mem=%" PRId64, info->max_mem >> 20);
|
||||
+ if (info->has_total_mem) {
|
||||
+ monitor_printf(mon, " total_mem=%" PRId64, info->total_mem >> 20);
|
||||
+ }
|
||||
+ if (info->has_free_mem) {
|
||||
+ monitor_printf(mon, " free_mem=%" PRId64, info->free_mem >> 20);
|
||||
+ }
|
||||
+
|
||||
+ if (info->has_mem_swapped_in) {
|
||||
+ monitor_printf(mon, " mem_swapped_in=%" PRId64, info->mem_swapped_in);
|
||||
+ }
|
||||
+ if (info->has_mem_swapped_out) {
|
||||
+ monitor_printf(mon, " mem_swapped_out=%" PRId64, info->mem_swapped_out);
|
||||
+ }
|
||||
+ if (info->has_major_page_faults) {
|
||||
+ monitor_printf(mon, " major_page_faults=%" PRId64,
|
||||
+ info->major_page_faults);
|
||||
+ }
|
||||
+ if (info->has_minor_page_faults) {
|
||||
+ monitor_printf(mon, " minor_page_faults=%" PRId64,
|
||||
+ info->minor_page_faults);
|
||||
+ }
|
||||
+ if (info->has_last_update) {
|
||||
+ monitor_printf(mon, " last_update=%" PRId64,
|
||||
+ info->last_update);
|
||||
+ }
|
||||
+
|
||||
+ monitor_printf(mon, "\n");
|
||||
|
||||
qapi_free_BalloonInfo(info);
|
||||
}
|
||||
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
|
||||
index adde97fe4b..e7f91a3cec 100644
|
||||
index 25de154307..7c09716035 100644
|
||||
--- a/hw/virtio/virtio-balloon.c
|
||||
+++ b/hw/virtio/virtio-balloon.c
|
||||
@@ -712,8 +712,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
|
||||
@ -98,11 +57,52 @@ index adde97fe4b..e7f91a3cec 100644
|
||||
}
|
||||
|
||||
static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index 5ca3ebe942..1b32c59329 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -870,7 +870,35 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict)
|
||||
return;
|
||||
}
|
||||
|
||||
- monitor_printf(mon, "balloon: actual=%" PRId64 "\n", info->actual >> 20);
|
||||
+ monitor_printf(mon, "balloon: actual=%" PRId64, info->actual >> 20);
|
||||
+ monitor_printf(mon, " max_mem=%" PRId64, info->max_mem >> 20);
|
||||
+ if (info->has_total_mem) {
|
||||
+ monitor_printf(mon, " total_mem=%" PRId64, info->total_mem >> 20);
|
||||
+ }
|
||||
+ if (info->has_free_mem) {
|
||||
+ monitor_printf(mon, " free_mem=%" PRId64, info->free_mem >> 20);
|
||||
+ }
|
||||
+
|
||||
+ if (info->has_mem_swapped_in) {
|
||||
+ monitor_printf(mon, " mem_swapped_in=%" PRId64, info->mem_swapped_in);
|
||||
+ }
|
||||
+ if (info->has_mem_swapped_out) {
|
||||
+ monitor_printf(mon, " mem_swapped_out=%" PRId64, info->mem_swapped_out);
|
||||
+ }
|
||||
+ if (info->has_major_page_faults) {
|
||||
+ monitor_printf(mon, " major_page_faults=%" PRId64,
|
||||
+ info->major_page_faults);
|
||||
+ }
|
||||
+ if (info->has_minor_page_faults) {
|
||||
+ monitor_printf(mon, " minor_page_faults=%" PRId64,
|
||||
+ info->minor_page_faults);
|
||||
+ }
|
||||
+ if (info->has_last_update) {
|
||||
+ monitor_printf(mon, " last_update=%" PRId64,
|
||||
+ info->last_update);
|
||||
+ }
|
||||
+
|
||||
+ monitor_printf(mon, "\n");
|
||||
|
||||
qapi_free_BalloonInfo(info);
|
||||
}
|
||||
diff --git a/qapi/misc.json b/qapi/misc.json
|
||||
index 8b3ca4fdd3..c98bb4b559 100644
|
||||
index a7fba7230c..2445c950cc 100644
|
||||
--- a/qapi/misc.json
|
||||
+++ b/qapi/misc.json
|
||||
@@ -682,10 +682,30 @@
|
||||
@@ -408,10 +408,30 @@
|
||||
#
|
||||
# @actual: the number of bytes the balloon currently contains
|
||||
#
|
||||
|
@ -7,39 +7,17 @@ provide '*is-current' in MachineInfo struct
|
||||
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
qapi/misc.json | 4 +++-
|
||||
vl.c | 5 +++++
|
||||
hw/core/machine-qmp-cmds.c | 5 +++++
|
||||
qapi/machine.json | 4 +++-
|
||||
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/misc.json b/qapi/misc.json
|
||||
index c98bb4b559..4a0e26720e 100644
|
||||
--- a/qapi/misc.json
|
||||
+++ b/qapi/misc.json
|
||||
@@ -2033,6 +2033,8 @@
|
||||
#
|
||||
# @is-default: whether the machine is default
|
||||
#
|
||||
+# @is-current: whether this machine is currently used
|
||||
+#
|
||||
# @cpu-max: maximum number of CPUs supported by the machine type
|
||||
# (since 1.5.0)
|
||||
#
|
||||
@@ -2042,7 +2044,7 @@
|
||||
##
|
||||
{ 'struct': 'MachineInfo',
|
||||
'data': { 'name': 'str', '*alias': 'str',
|
||||
- '*is-default': 'bool', 'cpu-max': 'int',
|
||||
+ '*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int',
|
||||
'hotpluggable-cpus': 'bool'} }
|
||||
|
||||
##
|
||||
diff --git a/vl.c b/vl.c
|
||||
index c3dee09c9b..98efed1a79 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -1531,6 +1531,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
||||
info->cpu_max = !mc->max_cpus ? 1 : mc->max_cpus;
|
||||
info->hotpluggable_cpus = mc->has_hotpluggable_cpus;
|
||||
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
|
||||
index 5bd95b8ab0..fd68f9baf8 100644
|
||||
--- a/hw/core/machine-qmp-cmds.c
|
||||
+++ b/hw/core/machine-qmp-cmds.c
|
||||
@@ -229,6 +229,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
||||
info->numa_mem_supported = mc->numa_mem_supported;
|
||||
info->deprecated = !!mc->deprecation_reason;
|
||||
|
||||
+ if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) {
|
||||
+ info->has_is_current = true;
|
||||
@ -49,3 +27,25 @@ index c3dee09c9b..98efed1a79 100644
|
||||
entry = g_malloc0(sizeof(*entry));
|
||||
entry->value = info;
|
||||
entry->next = mach_list;
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index 6db8a7e2ec..7b82c5f7f5 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -313,6 +313,8 @@
|
||||
#
|
||||
# @is-default: whether the machine is default
|
||||
#
|
||||
+# @is-current: whether this machine is currently used
|
||||
+#
|
||||
# @cpu-max: maximum number of CPUs supported by the machine type
|
||||
# (since 1.5.0)
|
||||
#
|
||||
@@ -329,7 +331,7 @@
|
||||
##
|
||||
{ 'struct': 'MachineInfo',
|
||||
'data': { 'name': 'str', '*alias': 'str',
|
||||
- '*is-default': 'bool', 'cpu-max': 'int',
|
||||
+ '*is-default': 'bool', '*is-current': 'bool', 'cpu-max': 'int',
|
||||
'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool',
|
||||
'deprecated': 'bool' } }
|
||||
|
||||
|
@ -31,10 +31,10 @@ index 59e412139a..bcd781a1b9 100644
|
||||
'if': 'defined(CONFIG_SPICE)' }
|
||||
|
||||
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
||||
index 5593dfcb06..bd80c18210 100644
|
||||
index c95bbd6c77..ccba92a6ed 100644
|
||||
--- a/ui/spice-core.c
|
||||
+++ b/ui/spice-core.c
|
||||
@@ -538,6 +538,11 @@ SpiceInfo *qmp_query_spice(Error **errp)
|
||||
@@ -539,6 +539,11 @@ SpiceInfo *qmp_query_spice(Error **errp)
|
||||
micro = SPICE_SERVER_VERSION & 0xff;
|
||||
info->compiled_version = g_strdup_printf("%d.%d.%d", major, minor, micro);
|
||||
|
||||
|
@ -8,9 +8,9 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
Makefile.objs | 1 +
|
||||
hmp-commands-info.hx | 13 +
|
||||
hmp-commands.hx | 32 +++
|
||||
hmp.c | 57 +++++
|
||||
hmp.h | 5 +
|
||||
include/migration/snapshot.h | 1 +
|
||||
include/monitor/hmp.h | 5 +
|
||||
monitor/hmp-cmds.c | 57 +++++
|
||||
qapi/migration.json | 34 +++
|
||||
qapi/misc.json | 32 +++
|
||||
qemu-options.hx | 13 +
|
||||
@ -20,13 +20,13 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
create mode 100644 savevm-async.c
|
||||
|
||||
diff --git a/Makefile.objs b/Makefile.objs
|
||||
index cf065de5ed..559486973a 100644
|
||||
index 6a143dcd57..21dd93b58c 100644
|
||||
--- a/Makefile.objs
|
||||
+++ b/Makefile.objs
|
||||
@@ -46,6 +46,7 @@ ifeq ($(CONFIG_SOFTMMU),y)
|
||||
common-obj-y = blockdev.o blockdev-nbd.o block/
|
||||
common-obj-y += bootdevice.o iothread.o
|
||||
@@ -48,6 +48,7 @@ common-obj-y += bootdevice.o iothread.o
|
||||
common-obj-y += dump/
|
||||
common-obj-y += job-qmp.o
|
||||
common-obj-y += monitor/
|
||||
+common-obj-y += savevm-async.o
|
||||
common-obj-y += net/
|
||||
common-obj-y += qdev-monitor.o device-hotplug.o
|
||||
@ -56,10 +56,10 @@ index c59444c461..444bd8e43d 100644
|
||||
|
||||
{
|
||||
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
||||
index 9b4035965c..284e97973a 100644
|
||||
index bfa5681dd2..e075d413c0 100644
|
||||
--- a/hmp-commands.hx
|
||||
+++ b/hmp-commands.hx
|
||||
@@ -1926,3 +1926,35 @@ ETEXI
|
||||
@@ -1944,3 +1944,35 @@ ETEXI
|
||||
STEXI
|
||||
@end table
|
||||
ETEXI
|
||||
@ -95,11 +95,45 @@ index 9b4035965c..284e97973a 100644
|
||||
+ .help = "Resume VM after snaphot.",
|
||||
+ .cmd = hmp_savevm_end,
|
||||
+ },
|
||||
diff --git a/hmp.c b/hmp.c
|
||||
index 25fe18cbcf..16243bba50 100644
|
||||
--- a/hmp.c
|
||||
+++ b/hmp.c
|
||||
@@ -2722,6 +2722,63 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
||||
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
|
||||
index c85b6ec75b..4411b7121d 100644
|
||||
--- a/include/migration/snapshot.h
|
||||
+++ b/include/migration/snapshot.h
|
||||
@@ -17,5 +17,6 @@
|
||||
|
||||
int save_snapshot(const char *name, Error **errp);
|
||||
int load_snapshot(const char *name, Error **errp);
|
||||
+int load_snapshot_from_blockdev(const char *filename, Error **errp);
|
||||
|
||||
#endif
|
||||
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
|
||||
index a0e9511440..c6ee8295f0 100644
|
||||
--- a/include/monitor/hmp.h
|
||||
+++ b/include/monitor/hmp.h
|
||||
@@ -25,6 +25,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_uuid(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_chardev(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_mice(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_info_savevm(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
|
||||
@@ -102,6 +103,10 @@ void hmp_netdev_add(Monitor *mon, const QDict *qdict);
|
||||
void hmp_netdev_del(Monitor *mon, const QDict *qdict);
|
||||
void hmp_getfd(Monitor *mon, const QDict *qdict);
|
||||
void hmp_closefd(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_savevm_start(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_snapshot_drive(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_delete_drive_snapshot(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_savevm_end(Monitor *mon, const QDict *qdict);
|
||||
void hmp_sendkey(Monitor *mon, const QDict *qdict);
|
||||
void hmp_screendump(Monitor *mon, const QDict *qdict);
|
||||
void hmp_nbd_server_start(Monitor *mon, const QDict *qdict);
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index 1b32c59329..39a8020367 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -2640,6 +2640,63 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
||||
hmp_handle_error(mon, &err);
|
||||
}
|
||||
|
||||
@ -163,40 +197,6 @@ index 25fe18cbcf..16243bba50 100644
|
||||
void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
|
||||
diff --git a/hmp.h b/hmp.h
|
||||
index 43617f2646..bcb90c478f 100644
|
||||
--- a/hmp.h
|
||||
+++ b/hmp.h
|
||||
@@ -24,6 +24,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_uuid(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_chardev(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_mice(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_info_savevm(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
|
||||
@@ -101,6 +102,10 @@ void hmp_netdev_add(Monitor *mon, const QDict *qdict);
|
||||
void hmp_netdev_del(Monitor *mon, const QDict *qdict);
|
||||
void hmp_getfd(Monitor *mon, const QDict *qdict);
|
||||
void hmp_closefd(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_savevm_start(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_snapshot_drive(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_delete_drive_snapshot(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_savevm_end(Monitor *mon, const QDict *qdict);
|
||||
void hmp_sendkey(Monitor *mon, const QDict *qdict);
|
||||
void hmp_screendump(Monitor *mon, const QDict *qdict);
|
||||
void hmp_nbd_server_start(Monitor *mon, const QDict *qdict);
|
||||
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
|
||||
index c85b6ec75b..4411b7121d 100644
|
||||
--- a/include/migration/snapshot.h
|
||||
+++ b/include/migration/snapshot.h
|
||||
@@ -17,5 +17,6 @@
|
||||
|
||||
int save_snapshot(const char *name, Error **errp);
|
||||
int load_snapshot(const char *name, Error **errp);
|
||||
+int load_snapshot_from_blockdev(const char *filename, Error **errp);
|
||||
|
||||
#endif
|
||||
diff --git a/qapi/migration.json b/qapi/migration.json
|
||||
index 9cfbaf8c6c..e206355d56 100644
|
||||
--- a/qapi/migration.json
|
||||
@ -243,10 +243,10 @@ index 9cfbaf8c6c..e206355d56 100644
|
||||
# @query-migrate:
|
||||
#
|
||||
diff --git a/qapi/misc.json b/qapi/misc.json
|
||||
index 4a0e26720e..49dfda0b28 100644
|
||||
index 2445c950cc..31029e3132 100644
|
||||
--- a/qapi/misc.json
|
||||
+++ b/qapi/misc.json
|
||||
@@ -2358,6 +2358,38 @@
|
||||
@@ -1384,6 +1384,38 @@
|
||||
##
|
||||
{ 'command': 'query-target', 'returns': 'TargetInfo' }
|
||||
|
||||
@ -286,10 +286,10 @@ index 4a0e26720e..49dfda0b28 100644
|
||||
# @AcpiTableOptions:
|
||||
#
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 08749a3391..880c63dab2 100644
|
||||
index 9621e934c0..34994daafd 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -3680,6 +3680,19 @@ STEXI
|
||||
@@ -3731,6 +3731,19 @@ STEXI
|
||||
Start right away with a saved state (@code{loadvm} in monitor)
|
||||
ETEXI
|
||||
|
||||
@ -776,18 +776,18 @@ index 0000000000..2149010bb8
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/vl.c b/vl.c
|
||||
index 98efed1a79..68ca370e19 100644
|
||||
index b426b32134..1c5536e5bb 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -3005,6 +3005,7 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -2869,6 +2869,7 @@ int main(int argc, char **argv, char **envp)
|
||||
int optind;
|
||||
const char *optarg;
|
||||
const char *loadvm = NULL;
|
||||
+ const char *loadstate = NULL;
|
||||
MachineClass *machine_class;
|
||||
const char *cpu_model;
|
||||
const char *cpu_option;
|
||||
const char *vga_model = NULL;
|
||||
@@ -3572,6 +3573,9 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -3445,6 +3446,9 @@ int main(int argc, char **argv, char **envp)
|
||||
case QEMU_OPTION_loadvm:
|
||||
loadvm = optarg;
|
||||
break;
|
||||
@ -797,7 +797,7 @@ index 98efed1a79..68ca370e19 100644
|
||||
case QEMU_OPTION_full_screen:
|
||||
dpy.has_full_screen = true;
|
||||
dpy.full_screen = true;
|
||||
@@ -4579,6 +4583,12 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -4444,6 +4448,12 @@ int main(int argc, char **argv, char **envp)
|
||||
autostart = 0;
|
||||
exit(1);
|
||||
}
|
||||
|
@ -6,12 +6,12 @@ Subject: [PATCH] PVE: block: add the zeroinit block driver filter
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
block/Makefile.objs | 1 +
|
||||
block/zeroinit.c | 203 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 204 insertions(+)
|
||||
block/zeroinit.c | 204 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 205 insertions(+)
|
||||
create mode 100644 block/zeroinit.c
|
||||
|
||||
diff --git a/block/Makefile.objs b/block/Makefile.objs
|
||||
index 7a81892a52..03b5763bfa 100644
|
||||
index 35f3bca4d9..6022242c3f 100644
|
||||
--- a/block/Makefile.objs
|
||||
+++ b/block/Makefile.objs
|
||||
@@ -11,6 +11,7 @@ block-obj-$(CONFIG_QED) += qed.o qed-l2-cache.o qed-table.o qed-cluster.o
|
||||
@ -24,10 +24,10 @@ index 7a81892a52..03b5763bfa 100644
|
||||
block-obj-y += blklogwrites.o
|
||||
diff --git a/block/zeroinit.c b/block/zeroinit.c
|
||||
new file mode 100644
|
||||
index 0000000000..64c49ad0e0
|
||||
index 0000000000..e78511d36c
|
||||
--- /dev/null
|
||||
+++ b/block/zeroinit.c
|
||||
@@ -0,0 +1,203 @@
|
||||
@@ -0,0 +1,204 @@
|
||||
+/*
|
||||
+ * Filter to fake a zero-initialized block device.
|
||||
+ *
|
||||
@ -45,6 +45,7 @@ index 0000000000..64c49ad0e0
|
||||
+#include "qapi/qmp/qstring.h"
|
||||
+#include "qemu/cutils.h"
|
||||
+#include "qemu/option.h"
|
||||
+#include "qemu/module.h"
|
||||
+
|
||||
+typedef struct {
|
||||
+ bool has_zero_init;
|
||||
|
@ -18,10 +18,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
5 files changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index 381659d5ef..9ee43981e8 100644
|
||||
index b26c22c4b8..812783d3cb 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -560,6 +560,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -550,6 +550,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
BlockCompletionFunc *cb, void *opaque,
|
||||
@ -29,7 +29,7 @@ index 381659d5ef..9ee43981e8 100644
|
||||
JobTxn *txn, Error **errp)
|
||||
{
|
||||
int64_t len;
|
||||
@@ -677,6 +678,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -668,6 +669,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
|
||||
&error_abort);
|
||||
job->len = len;
|
||||
@ -38,10 +38,10 @@ index 381659d5ef..9ee43981e8 100644
|
||||
return &job->common;
|
||||
|
||||
diff --git a/block/replication.c b/block/replication.c
|
||||
index 3d4dedddfc..0a265db1b5 100644
|
||||
index 23b2993d74..e70a6cf2bd 100644
|
||||
--- a/block/replication.c
|
||||
+++ b/block/replication.c
|
||||
@@ -543,7 +543,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
@@ -546,7 +546,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
0, MIRROR_SYNC_MODE_NONE, NULL, false,
|
||||
BLOCKDEV_ON_ERROR_REPORT,
|
||||
BLOCKDEV_ON_ERROR_REPORT, JOB_INTERNAL,
|
||||
@ -51,19 +51,19 @@ index 3d4dedddfc..0a265db1b5 100644
|
||||
error_propagate(errp, local_err);
|
||||
backup_job_cleanup(bs);
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index d358169995..a3542db57a 100644
|
||||
index 4d141e9a1f..a7c97b1585 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3546,7 +3546,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
@@ -3574,7 +3574,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
- job_flags, NULL, NULL, txn, &local_err);
|
||||
+ job_flags, NULL, NULL, 0, txn, &local_err);
|
||||
bdrv_unref(target_bs);
|
||||
if (local_err != NULL) {
|
||||
error_propagate(errp, local_err);
|
||||
@@ -3656,7 +3656,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
goto unref;
|
||||
@@ -3679,7 +3679,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
@ -73,10 +73,10 @@ index d358169995..a3542db57a 100644
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index 01e855a066..b409e02be8 100644
|
||||
index 3aa1e832a8..9f4fbad5a6 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -1157,6 +1157,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -1169,6 +1169,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
BlockCompletionFunc *cb, void *opaque,
|
||||
@ -85,10 +85,10 @@ index 01e855a066..b409e02be8 100644
|
||||
|
||||
void hmp_drive_add_node(Monitor *mon, const char *optstr);
|
||||
diff --git a/job.c b/job.c
|
||||
index da8e4b7bf2..86161bd9f3 100644
|
||||
index 28dd48f8a5..7a21e83780 100644
|
||||
--- a/job.c
|
||||
+++ b/job.c
|
||||
@@ -899,7 +899,7 @@ void job_start(Job *job)
|
||||
@@ -898,7 +898,7 @@ void job_start(Job *job)
|
||||
job->co = qemu_coroutine_create(job_co_entry, job);
|
||||
job->pause_count--;
|
||||
job->busy = true;
|
||||
|
@ -6,26 +6,26 @@ Subject: [PATCH] PVE: backup: introduce vma archive format
|
||||
TODO: Move to a libvma block backend.
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
MAINTAINERS | 6 +
|
||||
block/Makefile.objs | 3 +
|
||||
block/vma.c | 503 ++++++++++++++++++++++++++++++++++++++++
|
||||
blockdev.c | 536 +++++++++++++++++++++++++++++++++++++++++++
|
||||
configure | 29 +++
|
||||
hmp-commands-info.hx | 13 ++
|
||||
hmp-commands.hx | 31 +++
|
||||
hmp.c | 63 +++++
|
||||
hmp.h | 3 +
|
||||
qapi/block-core.json | 109 ++++++++-
|
||||
qapi/common.json | 13 ++
|
||||
qapi/misc.json | 13 --
|
||||
12 files changed, 1308 insertions(+), 14 deletions(-)
|
||||
MAINTAINERS | 6 +
|
||||
block/Makefile.objs | 3 +
|
||||
block/vma.c | 503 +++++++++++++++++++++++++++++++++++++++
|
||||
blockdev.c | 536 ++++++++++++++++++++++++++++++++++++++++++
|
||||
configure | 30 +++
|
||||
hmp-commands-info.hx | 13 +
|
||||
hmp-commands.hx | 31 +++
|
||||
include/monitor/hmp.h | 3 +
|
||||
monitor/hmp-cmds.c | 63 +++++
|
||||
qapi/block-core.json | 109 ++++++++-
|
||||
qapi/common.json | 13 +
|
||||
qapi/misc.json | 13 -
|
||||
12 files changed, 1309 insertions(+), 14 deletions(-)
|
||||
create mode 100644 block/vma.c
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 56139ac8ab..5588f5c91e 100644
|
||||
index d6de200453..de09d099f6 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -2499,6 +2499,12 @@ L: qemu-block@nongnu.org
|
||||
@@ -2563,6 +2563,12 @@ L: qemu-block@nongnu.org
|
||||
S: Supported
|
||||
F: block/vvfat.c
|
||||
|
||||
@ -39,13 +39,13 @@ index 56139ac8ab..5588f5c91e 100644
|
||||
M: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
L: qemu-block@nongnu.org
|
||||
diff --git a/block/Makefile.objs b/block/Makefile.objs
|
||||
index 03b5763bfa..00fa730d7b 100644
|
||||
index 6022242c3f..86b10d8ea7 100644
|
||||
--- a/block/Makefile.objs
|
||||
+++ b/block/Makefile.objs
|
||||
@@ -33,6 +33,7 @@ block-obj-$(CONFIG_RBD) += rbd.o
|
||||
block-obj-$(CONFIG_GLUSTERFS) += gluster.o
|
||||
block-obj-$(CONFIG_VXHS) += vxhs.o
|
||||
block-obj-$(CONFIG_LIBSSH2) += ssh.o
|
||||
block-obj-$(CONFIG_LIBSSH) += ssh.o
|
||||
+block-obj-$(CONFIG_VMA) += vma.o
|
||||
block-obj-y += accounting.o dirty-bitmap.o
|
||||
block-obj-y += write-threshold.o
|
||||
@ -566,7 +566,7 @@ index 0000000000..b911b198dc
|
||||
+
|
||||
+block_init(bdrv_vma_init);
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index a3542db57a..5d524b9a74 100644
|
||||
index a7c97b1585..7047475a3c 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -31,11 +31,13 @@
|
||||
@ -583,7 +583,7 @@ index a3542db57a..5d524b9a74 100644
|
||||
#include "block/throttle-groups.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "qemu/error-report.h"
|
||||
@@ -44,6 +46,7 @@
|
||||
@@ -45,6 +47,7 @@
|
||||
#include "qapi/qapi-commands-block.h"
|
||||
#include "qapi/qapi-commands-transaction.h"
|
||||
#include "qapi/qapi-visit-block-core.h"
|
||||
@ -591,7 +591,7 @@ index a3542db57a..5d524b9a74 100644
|
||||
#include "qapi/qmp/qdict.h"
|
||||
#include "qapi/qmp/qnum.h"
|
||||
#include "qapi/qmp/qstring.h"
|
||||
@@ -3148,6 +3151,539 @@ out:
|
||||
@@ -3168,6 +3171,539 @@ out:
|
||||
aio_context_release(aio_context);
|
||||
}
|
||||
|
||||
@ -1132,18 +1132,19 @@ index a3542db57a..5d524b9a74 100644
|
||||
bool has_base, const char *base,
|
||||
bool has_base_node, const char *base_node,
|
||||
diff --git a/configure b/configure
|
||||
index 1c563a7027..d164677950 100755
|
||||
index 714e7fb6a1..5e16d8e562 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -491,6 +491,7 @@ docker="no"
|
||||
@@ -499,6 +499,8 @@ docker="no"
|
||||
debug_mutex="no"
|
||||
libpmem=""
|
||||
default_devices="yes"
|
||||
+libudev="no"
|
||||
+vma=""
|
||||
|
||||
# cross compilers defaults, can be overridden with --cross-cc-ARCH
|
||||
cross_cc_aarch64="aarch64-linux-gnu-gcc"
|
||||
@@ -1518,6 +1519,10 @@ for opt do
|
||||
@@ -1543,6 +1545,10 @@ for opt do
|
||||
;;
|
||||
--disable-libpmem) libpmem=no
|
||||
;;
|
||||
@ -1154,7 +1155,7 @@ index 1c563a7027..d164677950 100755
|
||||
*)
|
||||
echo "ERROR: unknown option $opt"
|
||||
echo "Try '$0 --help' for more information"
|
||||
@@ -1818,6 +1823,7 @@ disabled with --disable-FEATURE, default is enabled if available:
|
||||
@@ -1842,6 +1848,7 @@ disabled with --disable-FEATURE, default is enabled if available:
|
||||
capstone capstone disassembler support
|
||||
debug-mutex mutex debugging support
|
||||
libpmem libpmem support
|
||||
@ -1162,7 +1163,7 @@ index 1c563a7027..d164677950 100755
|
||||
|
||||
NOTE: The object files are built at the place where configure is launched
|
||||
EOF
|
||||
@@ -4378,6 +4384,22 @@ EOF
|
||||
@@ -4402,6 +4409,22 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -1185,7 +1186,7 @@ index 1c563a7027..d164677950 100755
|
||||
##########################################
|
||||
# signalfd probe
|
||||
signalfd="no"
|
||||
@@ -6438,6 +6460,7 @@ echo "docker $docker"
|
||||
@@ -6481,6 +6504,7 @@ echo "docker $docker"
|
||||
echo "libpmem support $libpmem"
|
||||
echo "libudev $libudev"
|
||||
echo "default devices $default_devices"
|
||||
@ -1193,7 +1194,7 @@ index 1c563a7027..d164677950 100755
|
||||
|
||||
if test "$supported_cpu" = "no"; then
|
||||
echo
|
||||
@@ -6931,6 +6954,12 @@ if test "$usb_redir" = "yes" ; then
|
||||
@@ -6983,6 +7007,12 @@ if test "$usb_redir" = "yes" ; then
|
||||
echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
|
||||
fi
|
||||
|
||||
@ -1231,7 +1232,7 @@ index 444bd8e43d..21106bcbe6 100644
|
||||
|
||||
#if defined(CONFIG_SLIRP)
|
||||
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
||||
index 284e97973a..d723552bee 100644
|
||||
index e075d413c0..5bdfdeaf57 100644
|
||||
--- a/hmp-commands.hx
|
||||
+++ b/hmp-commands.hx
|
||||
@@ -105,6 +105,37 @@ STEXI
|
||||
@ -1272,11 +1273,32 @@ index 284e97973a..d723552bee 100644
|
||||
ETEXI
|
||||
|
||||
{
|
||||
diff --git a/hmp.c b/hmp.c
|
||||
index 16243bba50..113671ad2a 100644
|
||||
--- a/hmp.c
|
||||
+++ b/hmp.c
|
||||
@@ -167,6 +167,44 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict)
|
||||
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
|
||||
index c6ee8295f0..0f2f96c4af 100644
|
||||
--- a/include/monitor/hmp.h
|
||||
+++ b/include/monitor/hmp.h
|
||||
@@ -30,6 +30,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_info_backup(Monitor *mon, const QDict *qdict);
|
||||
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);
|
||||
@@ -90,6 +91,8 @@ void hmp_eject(Monitor *mon, const QDict *qdict);
|
||||
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);
|
||||
+void hmp_backup(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_backup_cancel(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index 39a8020367..bc9ca346f7 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -196,6 +196,44 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict)
|
||||
qapi_free_MouseInfoList(mice_list);
|
||||
}
|
||||
|
||||
@ -1321,7 +1343,7 @@ index 16243bba50..113671ad2a 100644
|
||||
static char *SocketAddress_to_str(SocketAddress *addr)
|
||||
{
|
||||
switch (addr->type) {
|
||||
@@ -2059,6 +2097,31 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
|
||||
@@ -2078,6 +2116,31 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
|
||||
hmp_handle_error(mon, &error);
|
||||
}
|
||||
|
||||
@ -1353,29 +1375,8 @@ index 16243bba50..113671ad2a 100644
|
||||
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
Error *error = NULL;
|
||||
diff --git a/hmp.h b/hmp.h
|
||||
index bcb90c478f..043b74edee 100644
|
||||
--- a/hmp.h
|
||||
+++ b/hmp.h
|
||||
@@ -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_parameters(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_info_backup(Monitor *mon, const QDict *qdict);
|
||||
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);
|
||||
@@ -89,6 +90,8 @@ void hmp_eject(Monitor *mon, const QDict *qdict);
|
||||
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);
|
||||
+void hmp_backup(Monitor *mon, const QDict *qdict);
|
||||
+void hmp_backup_cancel(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
|
||||
void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 7ccbfff9d0..6f97460806 100644
|
||||
index 0d43d4f37c..97cb7ec41c 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -796,6 +796,97 @@
|
||||
@ -1476,7 +1477,7 @@ index 7ccbfff9d0..6f97460806 100644
|
||||
##
|
||||
# @BlockDeviceTimedStats:
|
||||
#
|
||||
@@ -2819,7 +2910,7 @@
|
||||
@@ -2835,7 +2926,7 @@
|
||||
'qcow2', 'qed', 'quorum', 'raw', 'rbd',
|
||||
{ 'name': 'replication', 'if': 'defined(CONFIG_REPLICATION)' },
|
||||
'sheepdog',
|
||||
@ -1485,7 +1486,7 @@ index 7ccbfff9d0..6f97460806 100644
|
||||
|
||||
##
|
||||
# @BlockdevOptionsFile:
|
||||
@@ -3836,6 +3927,21 @@
|
||||
@@ -3898,6 +3989,21 @@
|
||||
'server': 'InetSocketAddressBase',
|
||||
'*tls-creds': 'str' } }
|
||||
|
||||
@ -1507,7 +1508,7 @@ index 7ccbfff9d0..6f97460806 100644
|
||||
##
|
||||
# @BlockdevOptionsThrottle:
|
||||
#
|
||||
@@ -3931,6 +4037,7 @@
|
||||
@@ -3993,6 +4099,7 @@
|
||||
'throttle': 'BlockdevOptionsThrottle',
|
||||
'vdi': 'BlockdevOptionsGenericFormat',
|
||||
'vhdx': 'BlockdevOptionsGenericFormat',
|
||||
@ -1537,10 +1538,10 @@ index 99d313ef3b..bae0650c51 100644
|
||||
+##
|
||||
+{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
|
||||
diff --git a/qapi/misc.json b/qapi/misc.json
|
||||
index 49dfda0b28..376f26002a 100644
|
||||
index 31029e3132..335035c04d 100644
|
||||
--- a/qapi/misc.json
|
||||
+++ b/qapi/misc.json
|
||||
@@ -274,19 +274,6 @@
|
||||
@@ -270,19 +270,6 @@
|
||||
##
|
||||
{ 'command': 'query-kvm', 'returns': 'KvmInfo' }
|
||||
|
||||
|
@ -8,7 +8,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
Makefile | 3 +-
|
||||
Makefile.objs | 1 +
|
||||
block/backup.c | 93 +++--
|
||||
block/backup.c | 87 ++--
|
||||
block/replication.c | 1 +
|
||||
blockdev.c | 208 +++++----
|
||||
include/block/block_int.h | 4 +
|
||||
@ -17,26 +17,26 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
vma-writer.c | 771 ++++++++++++++++++++++++++++++++++
|
||||
vma.c | 756 +++++++++++++++++++++++++++++++++
|
||||
vma.h | 150 +++++++
|
||||
11 files changed, 2739 insertions(+), 108 deletions(-)
|
||||
11 files changed, 2734 insertions(+), 107 deletions(-)
|
||||
create mode 100644 vma-reader.c
|
||||
create mode 100644 vma-writer.c
|
||||
create mode 100644 vma.c
|
||||
create mode 100644 vma.h
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index d4c5750256..a14995fdb3 100644
|
||||
index 85862fb81a..421e7b486c 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -419,7 +419,7 @@ dummy := $(call unnest-vars,, \
|
||||
@@ -436,7 +436,7 @@ dummy := $(call unnest-vars,, \
|
||||
|
||||
include $(SRC_PATH)/tests/Makefile.include
|
||||
|
||||
-all: $(DOCS) $(if $(BUILD_DOCS),sphinxdocs) $(TOOLS) $(HELPERS-y) recurse-all modules
|
||||
+all: $(DOCS) $(if $(BUILD_DOCS),sphinxdocs) $(TOOLS) vma$(EXESUF) $(HELPERS-y) recurse-all modules
|
||||
-all: $(DOCS) $(if $(BUILD_DOCS),sphinxdocs) $(TOOLS) $(HELPERS-y) recurse-all modules $(vhost-user-json-y)
|
||||
+all: $(DOCS) $(if $(BUILD_DOCS),sphinxdocs) $(TOOLS) vma$(EXESUF) $(HELPERS-y) recurse-all modules $(vhost-user-json-y)
|
||||
|
||||
qemu-version.h: FORCE
|
||||
$(call quiet-command, \
|
||||
@@ -509,6 +509,7 @@ qemu-img.o: qemu-img-cmds.h
|
||||
@@ -544,6 +544,7 @@ qemu-img.o: qemu-img-cmds.h
|
||||
qemu-img$(EXESUF): qemu-img.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
|
||||
qemu-nbd$(EXESUF): qemu-nbd.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
|
||||
qemu-io$(EXESUF): qemu-io.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
|
||||
@ -45,7 +45,7 @@ index d4c5750256..a14995fdb3 100644
|
||||
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
|
||||
|
||||
diff --git a/Makefile.objs b/Makefile.objs
|
||||
index 559486973a..9477a23ca2 100644
|
||||
index 21dd93b58c..87c6033bc1 100644
|
||||
--- a/Makefile.objs
|
||||
+++ b/Makefile.objs
|
||||
@@ -18,6 +18,7 @@ block-obj-y += block.o blockjob.o job.o
|
||||
@ -57,7 +57,7 @@ index 559486973a..9477a23ca2 100644
|
||||
block-obj-m = block/
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index 9ee43981e8..5240f71bb5 100644
|
||||
index 812783d3cb..05569de5d4 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -41,6 +41,7 @@ typedef struct BackupBlockJob {
|
||||
@ -68,33 +68,33 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
BlockdevOnError on_source_error;
|
||||
BlockdevOnError on_target_error;
|
||||
CoRwlock flush_rwlock;
|
||||
@@ -131,12 +132,20 @@ static int coroutine_fn backup_cow_with_bounce_buffer(BackupBlockJob *job,
|
||||
@@ -129,12 +130,20 @@ static int coroutine_fn backup_cow_with_bounce_buffer(BackupBlockJob *job,
|
||||
}
|
||||
|
||||
if (qemu_iovec_is_zero(&qiov)) {
|
||||
if (buffer_is_zero(*bounce_buffer, nbytes)) {
|
||||
- ret = blk_co_pwrite_zeroes(job->target, start,
|
||||
- qiov.size, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
- nbytes, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
+ if (job->dump_cb) {
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, qiov.size, NULL);
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, nbytes, NULL);
|
||||
+ } else {
|
||||
+ ret = blk_co_pwrite_zeroes(job->target, start,
|
||||
+ qiov.size, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
+ nbytes, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
+ }
|
||||
} else {
|
||||
- ret = blk_co_pwritev(job->target, start,
|
||||
- qiov.size, &qiov, write_flags |
|
||||
- (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0));
|
||||
- ret = blk_co_pwrite(job->target, start,
|
||||
- nbytes, *bounce_buffer, write_flags |
|
||||
- (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0));
|
||||
+ if (job->dump_cb) {
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, qiov.size, *bounce_buffer);
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, nbytes, *bounce_buffer);
|
||||
+ } else {
|
||||
+ ret = blk_co_pwritev(job->target, start,
|
||||
+ qiov.size, &qiov, write_flags |
|
||||
+ (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0));
|
||||
+ ret = blk_co_pwrite(job->target, start,
|
||||
+ nbytes, *bounce_buffer, write_flags |
|
||||
+ (job->compress ? BDRV_REQ_WRITE_COMPRESSED : 0));
|
||||
+ }
|
||||
}
|
||||
if (ret < 0) {
|
||||
trace_backup_do_cow_write_fail(job, start, ret);
|
||||
@@ -220,8 +229,12 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *job,
|
||||
@@ -218,8 +227,11 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *job,
|
||||
trace_backup_do_cow_process(job, start);
|
||||
|
||||
if (job->use_copy_range) {
|
||||
@ -103,13 +103,12 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
+ if (job->dump_cb) {
|
||||
+ ret = - 1;
|
||||
+ } else {
|
||||
+ ret = backup_cow_with_offload(job, start, dirty_end,
|
||||
+ is_write_notifier);
|
||||
+ ret = backup_cow_with_offload(job, start, dirty_end, is_write_notifier);
|
||||
+ }
|
||||
if (ret < 0) {
|
||||
job->use_copy_range = false;
|
||||
}
|
||||
@@ -306,7 +319,9 @@ static void backup_abort(Job *job)
|
||||
@@ -304,7 +316,9 @@ static void backup_abort(Job *job)
|
||||
static void backup_clean(Job *job)
|
||||
{
|
||||
BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
|
||||
@ -120,18 +119,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
blk_unref(s->target);
|
||||
s->target = NULL;
|
||||
|
||||
@@ -320,7 +335,9 @@ static void backup_attached_aio_context(BlockJob *job, AioContext *aio_context)
|
||||
{
|
||||
BackupBlockJob *s = container_of(job, BackupBlockJob, common);
|
||||
|
||||
- blk_set_aio_context(s->target, aio_context);
|
||||
+ if (s->target) {
|
||||
+ blk_set_aio_context(s->target, aio_context);
|
||||
+ }
|
||||
}
|
||||
|
||||
void backup_do_checkpoint(BlockJob *job, Error **errp)
|
||||
@@ -359,9 +376,11 @@ static BlockErrorAction backup_error_action(BackupBlockJob *job,
|
||||
@@ -350,9 +364,11 @@ static BlockErrorAction backup_error_action(BackupBlockJob *job,
|
||||
if (read) {
|
||||
return block_job_error_action(&job->common, job->on_source_error,
|
||||
true, error);
|
||||
@ -144,7 +132,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,6 +578,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -549,6 +565,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_source_error,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
@ -152,7 +140,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
BlockCompletionFunc *cb, void *opaque,
|
||||
int pause_count,
|
||||
JobTxn *txn, Error **errp)
|
||||
@@ -570,7 +590,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -560,7 +577,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
HBitmap *copy_bitmap = NULL;
|
||||
|
||||
assert(bs);
|
||||
@ -161,7 +149,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
|
||||
if (bs == target) {
|
||||
error_setg(errp, "Source and target cannot be the same");
|
||||
@@ -583,23 +603,23 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -573,13 +590,13 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -177,10 +165,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
error_setg(errp, "Compression is not supported for this drive %s",
|
||||
bdrv_get_device_name(target));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
|
||||
+ if (target && bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) {
|
||||
@@ -589,7 +606,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -189,7 +174,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -629,7 +649,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -619,7 +636,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -198,12 +183,13 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
if (cluster_size < 0) {
|
||||
goto error;
|
||||
}
|
||||
@@ -646,15 +666,18 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -636,16 +653,19 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
goto error;
|
||||
}
|
||||
|
||||
- /* The target must match the source in size, so no resize here either */
|
||||
- job->target = blk_new(BLK_PERM_WRITE,
|
||||
- job->target = blk_new(job->common.job.aio_context,
|
||||
- BLK_PERM_WRITE,
|
||||
- BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE |
|
||||
- BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD);
|
||||
- ret = blk_insert_bs(job->target, target, errp);
|
||||
@ -211,7 +197,8 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
- goto error;
|
||||
+ if (target) {
|
||||
+ /* The target must match the source in size, so no resize here either */
|
||||
+ job->target = blk_new(BLK_PERM_WRITE,
|
||||
+ job->target = blk_new(job->common.job.aio_context,
|
||||
+ BLK_PERM_WRITE,
|
||||
+ BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE |
|
||||
+ BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD);
|
||||
+ ret = blk_insert_bs(job->target, target, errp);
|
||||
@ -224,7 +211,7 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
job->on_source_error = on_source_error;
|
||||
job->on_target_error = on_target_error;
|
||||
job->sync_mode = sync_mode;
|
||||
@@ -667,16 +690,20 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -658,16 +678,19 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
job->cluster_size = cluster_size;
|
||||
job->copy_bitmap = copy_bitmap;
|
||||
copy_bitmap = NULL;
|
||||
@ -238,9 +225,9 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
- /* Required permissions are already taken with target's blk_new() */
|
||||
- block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
|
||||
- &error_abort);
|
||||
+ job->use_copy_range = target && !compress; /* compression isn't supported for it */
|
||||
+
|
||||
+ if (target) {
|
||||
+ job->use_copy_range = !compress; /* compression isn't supported for it */
|
||||
+ job->copy_range_size = MIN_NON_ZERO(blk_get_max_transfer(job->common.blk),
|
||||
+ blk_get_max_transfer(job->target));
|
||||
+ job->copy_range_size = MAX(job->cluster_size,
|
||||
@ -251,15 +238,14 @@ index 9ee43981e8..5240f71bb5 100644
|
||||
+ block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
|
||||
+ &error_abort);
|
||||
+ }
|
||||
+
|
||||
job->len = len;
|
||||
job->common.job.pause_count += pause_count;
|
||||
|
||||
diff --git a/block/replication.c b/block/replication.c
|
||||
index 0a265db1b5..e85c62ba9c 100644
|
||||
index e70a6cf2bd..f060755713 100644
|
||||
--- a/block/replication.c
|
||||
+++ b/block/replication.c
|
||||
@@ -543,6 +543,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
@@ -546,6 +546,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
0, MIRROR_SYNC_MODE_NONE, NULL, false,
|
||||
BLOCKDEV_ON_ERROR_REPORT,
|
||||
BLOCKDEV_ON_ERROR_REPORT, JOB_INTERNAL,
|
||||
@ -268,7 +254,7 @@ index 0a265db1b5..e85c62ba9c 100644
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 5d524b9a74..2466a02cbd 100644
|
||||
index 7047475a3c..cee7952bbb 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -31,7 +31,6 @@
|
||||
@ -279,7 +265,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "sysemu/blockdev.h"
|
||||
#include "hw/block/block.h"
|
||||
@@ -63,6 +62,7 @@
|
||||
@@ -64,6 +63,7 @@
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/help_option.h"
|
||||
#include "qemu/throttle-options.h"
|
||||
@ -287,7 +273,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
|
||||
static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =
|
||||
QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states);
|
||||
@@ -3156,15 +3156,14 @@ out:
|
||||
@@ -3176,15 +3176,14 @@ out:
|
||||
static struct PVEBackupState {
|
||||
Error *error;
|
||||
bool cancel;
|
||||
@ -305,7 +291,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
size_t total;
|
||||
size_t transferred;
|
||||
size_t zero_bytes;
|
||||
@@ -3183,6 +3182,71 @@ typedef struct PVEBackupDevInfo {
|
||||
@@ -3203,6 +3202,71 @@ typedef struct PVEBackupDevInfo {
|
||||
|
||||
static void pvebackup_run_next_job(void);
|
||||
|
||||
@ -377,7 +363,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
static void pvebackup_cleanup(void)
|
||||
{
|
||||
qemu_mutex_lock(&backup_state.backup_mutex);
|
||||
@@ -3194,9 +3258,11 @@ static void pvebackup_cleanup(void)
|
||||
@@ -3214,9 +3278,11 @@ static void pvebackup_cleanup(void)
|
||||
|
||||
backup_state.end_time = time(NULL);
|
||||
|
||||
@ -392,7 +378,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
|
||||
g_list_free(backup_state.di_list);
|
||||
@@ -3204,6 +3270,13 @@ static void pvebackup_cleanup(void)
|
||||
@@ -3224,6 +3290,13 @@ static void pvebackup_cleanup(void)
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
}
|
||||
|
||||
@ -406,7 +392,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
{
|
||||
// This always runs in the main loop
|
||||
@@ -3220,9 +3293,9 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
@@ -3240,9 +3313,9 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
di->bs = NULL;
|
||||
di->target = NULL;
|
||||
|
||||
@ -419,7 +405,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
|
||||
// remove self from job queue
|
||||
@@ -3250,14 +3323,9 @@ static void pvebackup_cancel(void *opaque)
|
||||
@@ -3270,14 +3343,9 @@ static void pvebackup_cancel(void *opaque)
|
||||
error_setg(&backup_state.error, "backup cancelled");
|
||||
}
|
||||
|
||||
@ -436,7 +422,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
|
||||
GList *l = backup_state.di_list;
|
||||
@@ -3288,18 +3356,14 @@ void qmp_backup_cancel(Error **errp)
|
||||
@@ -3308,18 +3376,14 @@ void qmp_backup_cancel(Error **errp)
|
||||
Coroutine *co = qemu_coroutine_create(pvebackup_cancel, NULL);
|
||||
qemu_coroutine_enter(co);
|
||||
|
||||
@ -458,7 +444,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
Error **errp)
|
||||
{
|
||||
char *cdata = NULL;
|
||||
@@ -3313,7 +3377,12 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
@@ -3333,7 +3397,12 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
char *basename = g_path_get_basename(file);
|
||||
|
||||
if (format == BACKUP_FORMAT_VMA) {
|
||||
@ -472,7 +458,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
} else if (format == BACKUP_FORMAT_DIR) {
|
||||
char config_path[PATH_MAX];
|
||||
snprintf(config_path, PATH_MAX, "%s/%s", backup_dir, basename);
|
||||
@@ -3330,28 +3399,30 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
@@ -3350,28 +3419,30 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -512,7 +498,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
||||
@@ -3362,7 +3433,7 @@ static void pvebackup_run_next_job(void)
|
||||
@@ -3382,7 +3453,7 @@ static void pvebackup_run_next_job(void)
|
||||
UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
BackupFormat format,
|
||||
bool has_config_file, const char *config_file,
|
||||
@ -521,7 +507,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
bool has_devlist, const char *devlist,
|
||||
bool has_speed, int64_t speed, Error **errp)
|
||||
{
|
||||
@@ -3370,7 +3441,8 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3390,7 +3461,8 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
BlockDriverState *bs = NULL;
|
||||
const char *backup_dir = NULL;
|
||||
Error *local_err = NULL;
|
||||
@ -531,7 +517,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
gchar **devs = NULL;
|
||||
GList *di_list = NULL;
|
||||
GList *l;
|
||||
@@ -3382,7 +3454,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3402,7 +3474,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
backup_state.backup_mutex_initialized = true;
|
||||
}
|
||||
|
||||
@ -540,7 +526,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
error_set(errp, ERROR_CLASS_GENERIC_ERROR,
|
||||
"previous backup not finished");
|
||||
return NULL;
|
||||
@@ -3457,40 +3529,28 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3477,40 +3549,28 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
total += size;
|
||||
}
|
||||
|
||||
@ -589,7 +575,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@@ -3531,14 +3591,14 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3551,14 +3611,14 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
|
||||
/* add configuration file to archive */
|
||||
if (has_config_file) {
|
||||
@ -606,7 +592,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@@ -3561,12 +3621,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3581,12 +3641,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
}
|
||||
backup_state.backup_file = g_strdup(backup_file);
|
||||
|
||||
@ -623,7 +609,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
|
||||
backup_state.total = total;
|
||||
backup_state.transferred = 0;
|
||||
@@ -3577,21 +3638,21 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3597,21 +3658,21 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
while (l) {
|
||||
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
||||
l = g_list_next(l);
|
||||
@ -651,7 +637,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
@@ -3627,9 +3688,10 @@ err:
|
||||
@@ -3647,9 +3708,10 @@ err:
|
||||
g_strfreev(devs);
|
||||
}
|
||||
|
||||
@ -665,16 +651,16 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
}
|
||||
|
||||
if (backup_dir) {
|
||||
@@ -4082,7 +4144,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
@@ -4110,7 +4172,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
- job_flags, NULL, NULL, 0, txn, &local_err);
|
||||
+ job_flags, NULL, NULL, NULL, 0, txn, &local_err);
|
||||
bdrv_unref(target_bs);
|
||||
if (local_err != NULL) {
|
||||
error_propagate(errp, local_err);
|
||||
@@ -4192,7 +4254,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
goto unref;
|
||||
@@ -4215,7 +4277,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
@ -684,7 +670,7 @@ index 5d524b9a74..2466a02cbd 100644
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index b409e02be8..fd1828cd70 100644
|
||||
index 9f4fbad5a6..73a55a7351 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -61,6 +61,9 @@
|
||||
@ -697,7 +683,7 @@ index b409e02be8..fd1828cd70 100644
|
||||
enum BdrvTrackedRequestType {
|
||||
BDRV_TRACKED_READ,
|
||||
BDRV_TRACKED_WRITE,
|
||||
@@ -1156,6 +1159,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -1168,6 +1171,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_source_error,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
@ -706,10 +692,10 @@ index b409e02be8..fd1828cd70 100644
|
||||
int pause_count,
|
||||
JobTxn *txn, Error **errp);
|
||||
diff --git a/job.c b/job.c
|
||||
index 86161bd9f3..114640688a 100644
|
||||
index 7a21e83780..9d27999678 100644
|
||||
--- a/job.c
|
||||
+++ b/job.c
|
||||
@@ -249,7 +249,8 @@ static bool job_started(Job *job)
|
||||
@@ -248,7 +248,8 @@ static bool job_started(Job *job)
|
||||
return job->co;
|
||||
}
|
||||
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
2 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 880c63dab2..6c98b2b510 100644
|
||||
index 34994daafd..6db02fe903 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -801,6 +801,9 @@ STEXI
|
||||
@@ -802,6 +802,9 @@ STEXI
|
||||
@table @option
|
||||
ETEXI
|
||||
|
||||
@ -28,10 +28,10 @@ index 880c63dab2..6c98b2b510 100644
|
||||
"-fda/-fdb file use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
|
||||
DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
|
||||
diff --git a/vl.c b/vl.c
|
||||
index 68ca370e19..bb2cdb8ea9 100644
|
||||
index 1c5536e5bb..7ffcd271f1 100644
|
||||
--- a/vl.c
|
||||
+++ b/vl.c
|
||||
@@ -2993,6 +2993,7 @@ static void user_register_global_props(void)
|
||||
@@ -2857,6 +2857,7 @@ static void user_register_global_props(void)
|
||||
int main(int argc, char **argv, char **envp)
|
||||
{
|
||||
int i;
|
||||
@ -39,7 +39,7 @@ index 68ca370e19..bb2cdb8ea9 100644
|
||||
int snapshot, linux_boot;
|
||||
const char *initrd_filename;
|
||||
const char *kernel_filename, *kernel_cmdline;
|
||||
@@ -3681,6 +3682,13 @@ int main(int argc, char **argv, char **envp)
|
||||
@@ -3570,6 +3571,13 @@ int main(int argc, char **argv, char **envp)
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
|
@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
||||
index 78903ea909..cdfbec5e47 100644
|
||||
index e764a2bb03..f66ea72d78 100644
|
||||
--- a/hw/intc/apic_common.c
|
||||
+++ b/hw/intc/apic_common.c
|
||||
@@ -257,6 +257,15 @@ static void apic_reset_common(DeviceState *dev)
|
||||
@@ -258,6 +258,15 @@ static void apic_reset_common(DeviceState *dev)
|
||||
info->vapic_base_update(s);
|
||||
|
||||
apic_init_reset(dev);
|
||||
|
@ -13,10 +13,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
2 files changed, 43 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 0613f59c7b..ef5c1bf487 100644
|
||||
index 760648b78c..e40386384e 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -2223,6 +2223,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
@@ -2240,6 +2240,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
int fd;
|
||||
uint64_t perm, shared;
|
||||
int result = 0;
|
||||
@ -24,7 +24,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
|
||||
/* Validate options and set default values */
|
||||
assert(options->driver == BLOCKDEV_DRIVER_FILE);
|
||||
@@ -2256,19 +2257,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
@@ -2273,19 +2274,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
|
||||
shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
|
||||
|
||||
@ -59,7 +59,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
}
|
||||
|
||||
/* Clear the file by truncating it to 0 */
|
||||
@@ -2301,13 +2305,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
@@ -2318,13 +2322,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
@ -82,7 +82,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
}
|
||||
|
||||
out_close:
|
||||
@@ -2328,6 +2334,7 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
@@ -2345,6 +2351,7 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
PreallocMode prealloc;
|
||||
char *buf = NULL;
|
||||
Error *local_err = NULL;
|
||||
@ -90,7 +90,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
|
||||
/* Skip file: protocol prefix */
|
||||
strstart(filename, "file:", &filename);
|
||||
@@ -2345,6 +2352,18 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
@@ -2362,6 +2369,18 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -109,7 +109,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
options = (BlockdevCreateOptions) {
|
||||
.driver = BLOCKDEV_DRIVER_FILE,
|
||||
.u.file = {
|
||||
@@ -2354,6 +2373,8 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
@@ -2371,6 +2390,8 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
.preallocation = prealloc,
|
||||
.has_nocow = true,
|
||||
.nocow = nocow,
|
||||
@ -118,7 +118,7 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
},
|
||||
};
|
||||
return raw_co_create(&options, errp);
|
||||
@@ -2789,7 +2810,7 @@ static int raw_check_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared,
|
||||
@@ -2812,7 +2833,7 @@ static int raw_check_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared,
|
||||
}
|
||||
|
||||
/* Copy locks to the new fd */
|
||||
@ -128,10 +128,10 @@ index 0613f59c7b..ef5c1bf487 100644
|
||||
false, errp);
|
||||
if (ret < 0) {
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 6f97460806..0e9c239485 100644
|
||||
index 97cb7ec41c..f432d4f3ec 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4219,7 +4219,8 @@
|
||||
@@ -4284,7 +4284,8 @@
|
||||
'data': { 'filename': 'str',
|
||||
'size': 'size',
|
||||
'*preallocation': 'PreallocMode',
|
||||
|
@ -1,6 +1,6 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Date: Tue, 25 Jun 2019 11:17:58 +0200
|
||||
From: Stefan Reiter <s.reiter@proxmox.com>
|
||||
Date: Thu, 14 Nov 2019 14:38:02 +0100
|
||||
Subject: [PATCH] PVE: monitor: disable oob capability
|
||||
|
||||
A bisect revealed that commit 8258292e18c3
|
||||
@ -14,22 +14,20 @@ disable oob, so we can get a functioning qemu out...
|
||||
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
monitor.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
monitor/qmp.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/monitor.c b/monitor.c
|
||||
index daadbcdede..0f79a7dfa4 100644
|
||||
--- a/monitor.c
|
||||
+++ b/monitor.c
|
||||
@@ -4616,10 +4616,7 @@ void monitor_init(Chardev *chr, int flags)
|
||||
bool use_readline = flags & MONITOR_USE_READLINE;
|
||||
diff --git a/monitor/qmp.c b/monitor/qmp.c
|
||||
index fb3e66c62a..ad6703dc52 100644
|
||||
--- a/monitor/qmp.c
|
||||
+++ b/monitor/qmp.c
|
||||
@@ -379,8 +379,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty)
|
||||
MonitorQMP *mon = g_new0(MonitorQMP, 1);
|
||||
|
||||
/* Note: we run QMP monitor in I/O thread when @chr supports that */
|
||||
- monitor_data_init(mon, false,
|
||||
- (flags & MONITOR_USE_CONTROL)
|
||||
- && qemu_chr_has_feature(chr,
|
||||
- QEMU_CHAR_FEATURE_GCONTEXT));
|
||||
+ monitor_data_init(mon, false, false);
|
||||
- monitor_data_init(&mon->common, true, false,
|
||||
- qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT));
|
||||
+ monitor_data_init(&mon->common, true, false, false);
|
||||
|
||||
mon->pretty = pretty;
|
||||
|
||||
qemu_chr_fe_init(&mon->chr, chr, &error_abort);
|
||||
mon->flags = flags;
|
||||
|
@ -11,10 +11,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
||||
1 file changed, 180 insertions(+), 70 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 2466a02cbd..85031de942 100644
|
||||
index cee7952bbb..cec0f770e8 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3153,6 +3153,34 @@ out:
|
||||
@@ -3173,6 +3173,34 @@ out:
|
||||
|
||||
/* PVE backup related function */
|
||||
|
||||
@ -49,7 +49,7 @@ index 2466a02cbd..85031de942 100644
|
||||
static struct PVEBackupState {
|
||||
Error *error;
|
||||
bool cancel;
|
||||
@@ -3180,12 +3208,14 @@ typedef struct PVEBackupDevInfo {
|
||||
@@ -3200,12 +3228,14 @@ typedef struct PVEBackupDevInfo {
|
||||
BlockDriverState *target;
|
||||
} PVEBackupDevInfo;
|
||||
|
||||
@ -66,7 +66,7 @@ index 2466a02cbd..85031de942 100644
|
||||
const uint64_t size = bytes;
|
||||
const unsigned char *buf = pbuf;
|
||||
PVEBackupDevInfo *di = opaque;
|
||||
@@ -3247,8 +3277,10 @@ static int pvebackup_dump_cb(void *opaque, BlockBackend *target,
|
||||
@@ -3267,8 +3297,10 @@ static int pvebackup_dump_cb(void *opaque, BlockBackend *target,
|
||||
return size;
|
||||
}
|
||||
|
||||
@ -78,7 +78,7 @@ index 2466a02cbd..85031de942 100644
|
||||
qemu_mutex_lock(&backup_state.backup_mutex);
|
||||
// Avoid race between block jobs and backup-cancel command:
|
||||
if (!backup_state.vmaw) {
|
||||
@@ -3270,18 +3302,19 @@ static void pvebackup_cleanup(void)
|
||||
@@ -3290,18 +3322,19 @@ static void pvebackup_cleanup(void)
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
di->completed = true;
|
||||
|
||||
@@ -3294,8 +3327,7 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
@@ -3314,8 +3347,7 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
di->target = NULL;
|
||||
|
||||
if (backup_state.vmaw) {
|
||||
@ -117,7 +117,7 @@ index 2466a02cbd..85031de942 100644
|
||||
}
|
||||
|
||||
// remove self from job queue
|
||||
@@ -3305,12 +3337,25 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
@@ -3325,12 +3357,25 @@ static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
||||
if (!backup_state.cancel) {
|
||||
@ -145,7 +145,7 @@ index 2466a02cbd..85031de942 100644
|
||||
backup_state.cancel = true;
|
||||
qemu_mutex_lock(&backup_state.backup_mutex);
|
||||
// Avoid race between block jobs and backup-cancel command:
|
||||
@@ -3345,21 +3390,16 @@ static void pvebackup_cancel(void *opaque)
|
||||
@@ -3365,21 +3410,16 @@ static void pvebackup_cancel(void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
@ -170,7 +170,7 @@ index 2466a02cbd..85031de942 100644
|
||||
}
|
||||
|
||||
static int config_to_vma(const char *file, BackupFormat format,
|
||||
@@ -3400,8 +3440,11 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
@@ -3420,8 +3460,11 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
}
|
||||
|
||||
bool job_should_pause(Job *job);
|
||||
@ -183,7 +183,7 @@ index 2466a02cbd..85031de942 100644
|
||||
qemu_mutex_lock(&backup_state.backup_mutex);
|
||||
|
||||
GList *l = backup_state.di_list;
|
||||
@@ -3427,16 +3470,33 @@ static void pvebackup_run_next_job(void)
|
||||
@@ -3447,16 +3490,33 @@ static void pvebackup_run_next_job(void)
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
||||
// no more jobs, run the cleanup
|
||||
@ -224,7 +224,7 @@ index 2466a02cbd..85031de942 100644
|
||||
BlockBackend *blk;
|
||||
BlockDriverState *bs = NULL;
|
||||
const char *backup_dir = NULL;
|
||||
@@ -3455,16 +3515,16 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3475,16 +3535,16 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
}
|
||||
|
||||
if (backup_state.di_list) {
|
||||
@ -246,7 +246,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
gchar **d = devs;
|
||||
while (d && *d) {
|
||||
@@ -3472,18 +3532,18 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3492,18 +3552,18 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
if (blk) {
|
||||
bs = blk_bs(blk);
|
||||
if (bdrv_is_read_only(bs)) {
|
||||
@ -268,7 +268,7 @@ index 2466a02cbd..85031de942 100644
|
||||
"Device '%s' not found", *d);
|
||||
goto err;
|
||||
}
|
||||
@@ -3506,7 +3566,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3526,7 +3586,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
}
|
||||
|
||||
if (!di_list) {
|
||||
@ -277,7 +277,7 @@ index 2466a02cbd..85031de942 100644
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -3516,13 +3576,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3536,13 +3596,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
while (l) {
|
||||
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
||||
l = g_list_next(l);
|
||||
@ -293,7 +293,7 @@ index 2466a02cbd..85031de942 100644
|
||||
goto err;
|
||||
}
|
||||
di->size = size;
|
||||
@@ -3532,10 +3592,10 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3552,10 +3612,10 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
uuid_generate(uuid);
|
||||
|
||||
if (format == BACKUP_FORMAT_VMA) {
|
||||
@ -306,7 +306,7 @@ index 2466a02cbd..85031de942 100644
|
||||
}
|
||||
goto err;
|
||||
}
|
||||
@@ -3549,18 +3609,18 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3569,18 +3629,18 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
const char *devname = bdrv_get_device_name(di->bs);
|
||||
di->dev_id = vma_writer_register_stream(vmaw, devname, di->size);
|
||||
if (di->dev_id <= 0) {
|
||||
@ -330,7 +330,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
l = di_list;
|
||||
while (l) {
|
||||
@@ -3574,31 +3634,31 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3594,31 +3654,31 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
bdrv_img_create(di->targetfile, "raw", NULL, NULL, NULL,
|
||||
di->size, flags, false, &local_err);
|
||||
if (local_err) {
|
||||
@ -369,7 +369,7 @@ index 2466a02cbd..85031de942 100644
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@@ -3611,7 +3671,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3631,7 +3691,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
backup_state.error = NULL;
|
||||
}
|
||||
|
||||
@ -378,7 +378,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
backup_state.start_time = time(NULL);
|
||||
backup_state.end_time = 0;
|
||||
@@ -3619,7 +3679,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3639,7 +3699,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
if (backup_state.backup_file) {
|
||||
g_free(backup_state.backup_file);
|
||||
}
|
||||
@ -387,7 +387,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
backup_state.vmaw = vmaw;
|
||||
|
||||
@@ -3638,14 +3698,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3658,14 +3718,13 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
while (l) {
|
||||
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
||||
l = g_list_next(l);
|
||||
@ -405,7 +405,7 @@ index 2466a02cbd..85031de942 100644
|
||||
} else {
|
||||
job_start(&job->job);
|
||||
}
|
||||
@@ -3658,13 +3717,14 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3678,13 +3737,14 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
qemu_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
||||
if (!backup_state.error) {
|
||||
@ -422,7 +422,7 @@ index 2466a02cbd..85031de942 100644
|
||||
|
||||
err:
|
||||
|
||||
@@ -3691,23 +3751,61 @@ err:
|
||||
@@ -3711,23 +3771,61 @@ err:
|
||||
if (vmaw) {
|
||||
Error *err = NULL;
|
||||
vma_writer_close(vmaw, &err);
|
||||
@ -488,7 +488,7 @@ index 2466a02cbd..85031de942 100644
|
||||
}
|
||||
|
||||
info->has_status = true;
|
||||
@@ -3743,7 +3841,19 @@ BackupStatus *qmp_query_backup(Error **errp)
|
||||
@@ -3763,7 +3861,19 @@ BackupStatus *qmp_query_backup(Error **errp)
|
||||
info->has_transferred = true;
|
||||
info->transferred = backup_state.transferred;
|
||||
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
||||
1 file changed, 52 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 85031de942..7e9241cf42 100644
|
||||
index cec0f770e8..29196c18d8 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3195,7 +3195,7 @@ static struct PVEBackupState {
|
||||
@@ -3215,7 +3215,7 @@ static struct PVEBackupState {
|
||||
size_t total;
|
||||
size_t transferred;
|
||||
size_t zero_bytes;
|
||||
@ -26,7 +26,7 @@ index 85031de942..7e9241cf42 100644
|
||||
bool backup_mutex_initialized;
|
||||
} backup_state;
|
||||
|
||||
@@ -3220,7 +3220,10 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
@@ -3240,7 +3240,10 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
const unsigned char *buf = pbuf;
|
||||
PVEBackupDevInfo *di = opaque;
|
||||
|
||||
@ -37,7 +37,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return size; // return success
|
||||
}
|
||||
|
||||
@@ -3231,6 +3234,7 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
@@ -3251,6 +3254,7 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
"got unaligned write inside backup dump "
|
||||
"callback (sector %ld)", start);
|
||||
}
|
||||
@ -45,7 +45,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return -1; // not aligned to cluster size
|
||||
}
|
||||
|
||||
@@ -3272,6 +3276,8 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
@@ -3292,6 +3296,8 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
backup_state.transferred += size;
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ index 85031de942..7e9241cf42 100644
|
||||
// Note: always return success, because we want that writes succeed anyways.
|
||||
|
||||
return size;
|
||||
@@ -3281,10 +3287,9 @@ static void coroutine_fn pvebackup_co_cleanup(void)
|
||||
@@ -3301,10 +3307,9 @@ static void coroutine_fn pvebackup_co_cleanup(void)
|
||||
{
|
||||
assert(qemu_in_coroutine());
|
||||
|
||||
@ -67,7 +67,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3299,7 +3304,7 @@ static void coroutine_fn pvebackup_co_cleanup(void)
|
||||
@@ -3319,7 +3324,7 @@ static void coroutine_fn pvebackup_co_cleanup(void)
|
||||
|
||||
g_list_free(backup_state.di_list);
|
||||
backup_state.di_list = NULL;
|
||||
@ -76,7 +76,7 @@ index 85031de942..7e9241cf42 100644
|
||||
}
|
||||
|
||||
typedef struct PVEBackupCompeteCallbackData {
|
||||
@@ -3313,6 +3318,8 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
@@ -3333,6 +3338,8 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
|
||||
PVEBackupCompeteCallbackData *cb_data = opaque;
|
||||
|
||||
@ -85,7 +85,7 @@ index 85031de942..7e9241cf42 100644
|
||||
PVEBackupDevInfo *di = cb_data->di;
|
||||
int ret = cb_data->result;
|
||||
|
||||
@@ -3331,12 +3338,14 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
@@ -3351,12 +3358,14 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
}
|
||||
|
||||
// remove self from job queue
|
||||
@ -103,7 +103,7 @@ index 85031de942..7e9241cf42 100644
|
||||
pvebackup_co_run_next_job();
|
||||
}
|
||||
}
|
||||
@@ -3356,11 +3365,13 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
@@ -3376,11 +3385,13 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
{
|
||||
assert(qemu_in_coroutine());
|
||||
|
||||
@ -119,7 +119,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3373,6 +3384,7 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
@@ -3393,6 +3404,7 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
vma_writer_set_error(backup_state.vmaw, "backup cancelled");
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ index 85031de942..7e9241cf42 100644
|
||||
GList *l = backup_state.di_list;
|
||||
while (l) {
|
||||
PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
|
||||
@@ -3383,6 +3395,7 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
@@ -3403,6 +3415,7 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
AioContext *aio_context = blk_get_aio_context(job->blk);
|
||||
aio_context_acquire(aio_context);
|
||||
if (!di->completed) {
|
||||
@ -135,7 +135,7 @@ index 85031de942..7e9241cf42 100644
|
||||
job_cancel(&job->job, false);
|
||||
}
|
||||
aio_context_release(aio_context);
|
||||
@@ -3391,7 +3404,8 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
@@ -3411,7 +3424,8 @@ static void coroutine_fn pvebackup_co_cancel(void *opaque)
|
||||
}
|
||||
|
||||
qemu_co_mutex_unlock(&backup_state.backup_mutex);
|
||||
@ -145,7 +145,7 @@ index 85031de942..7e9241cf42 100644
|
||||
}
|
||||
|
||||
void qmp_backup_cancel(Error **errp)
|
||||
@@ -3445,7 +3459,7 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
@@ -3465,7 +3479,7 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
{
|
||||
assert(qemu_in_coroutine());
|
||||
|
||||
@ -154,7 +154,7 @@ index 85031de942..7e9241cf42 100644
|
||||
|
||||
GList *l = backup_state.di_list;
|
||||
while (l) {
|
||||
@@ -3454,11 +3468,13 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
@@ -3474,11 +3488,13 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
if (!di->completed && di->bs && di->bs->job) {
|
||||
BlockJob *job = di->bs->job;
|
||||
AioContext *aio_context = blk_get_aio_context(job->blk);
|
||||
@ -171,7 +171,7 @@ index 85031de942..7e9241cf42 100644
|
||||
} else {
|
||||
job_resume(&job->job);
|
||||
}
|
||||
@@ -3467,7 +3483,7 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
@@ -3487,7 +3503,7 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -180,7 +180,7 @@ index 85031de942..7e9241cf42 100644
|
||||
|
||||
// no more jobs, run the cleanup
|
||||
pvebackup_co_cleanup();
|
||||
@@ -3510,11 +3526,14 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3530,11 +3546,14 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
BlockJob *job;
|
||||
|
||||
if (!backup_state.backup_mutex_initialized) {
|
||||
@ -196,7 +196,7 @@ index 85031de942..7e9241cf42 100644
|
||||
error_set(task->errp, ERROR_CLASS_GENERIC_ERROR,
|
||||
"previous backup not finished");
|
||||
return;
|
||||
@@ -3686,7 +3705,6 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3706,7 +3725,6 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
uuid_copy(backup_state.uuid, uuid);
|
||||
uuid_unparse_lower(uuid, backup_state.uuid_str);
|
||||
|
||||
@ -204,7 +204,7 @@ index 85031de942..7e9241cf42 100644
|
||||
backup_state.di_list = di_list;
|
||||
|
||||
backup_state.total = total;
|
||||
@@ -3704,20 +3722,21 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3724,20 +3742,21 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
1, NULL, &local_err);
|
||||
if (!job || local_err != NULL) {
|
||||
error_setg(&backup_state.error, "backup_job_create failed");
|
||||
@ -230,7 +230,7 @@ index 85031de942..7e9241cf42 100644
|
||||
}
|
||||
|
||||
uuid_info = g_malloc0(sizeof(*uuid_info));
|
||||
@@ -3758,6 +3777,8 @@ err:
|
||||
@@ -3778,6 +3797,8 @@ err:
|
||||
rmdir(backup_dir);
|
||||
}
|
||||
|
||||
@ -239,7 +239,7 @@ index 85031de942..7e9241cf42 100644
|
||||
task->result = NULL;
|
||||
return;
|
||||
}
|
||||
@@ -3785,6 +3806,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
@@ -3805,6 +3826,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
|
||||
};
|
||||
|
||||
block_on_coroutine_fn(pvebackup_co_start, &task);
|
||||
@ -247,7 +247,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return task.result;
|
||||
}
|
||||
|
||||
@@ -3802,9 +3824,15 @@ static void coroutine_fn pvebackup_co_query(void *opaque)
|
||||
@@ -3822,9 +3844,15 @@ static void coroutine_fn pvebackup_co_query(void *opaque)
|
||||
|
||||
BackupStatus *info = g_malloc0(sizeof(*info));
|
||||
|
||||
@ -263,7 +263,7 @@ index 85031de942..7e9241cf42 100644
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3842,6 +3870,8 @@ static void coroutine_fn pvebackup_co_query(void *opaque)
|
||||
@@ -3862,6 +3890,8 @@ static void coroutine_fn pvebackup_co_query(void *opaque)
|
||||
info->transferred = backup_state.transferred;
|
||||
|
||||
task->result = info;
|
||||
|
@ -12,10 +12,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
||||
4 files changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index 5240f71bb5..2ccec79db6 100644
|
||||
index 05569de5d4..a3f0d2c9a5 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -579,6 +579,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -566,6 +566,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
BackupDumpFunc *dump_cb,
|
||||
@ -23,7 +23,7 @@ index 5240f71bb5..2ccec79db6 100644
|
||||
BlockCompletionFunc *cb, void *opaque,
|
||||
int pause_count,
|
||||
JobTxn *txn, Error **errp)
|
||||
@@ -649,7 +650,12 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -636,7 +637,12 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -38,10 +38,10 @@ index 5240f71bb5..2ccec79db6 100644
|
||||
goto error;
|
||||
}
|
||||
diff --git a/block/replication.c b/block/replication.c
|
||||
index e85c62ba9c..a2ad512251 100644
|
||||
index f060755713..b9465c3587 100644
|
||||
--- a/block/replication.c
|
||||
+++ b/block/replication.c
|
||||
@@ -543,7 +543,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
@@ -546,7 +546,7 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||
0, MIRROR_SYNC_MODE_NONE, NULL, false,
|
||||
BLOCKDEV_ON_ERROR_REPORT,
|
||||
BLOCKDEV_ON_ERROR_REPORT, JOB_INTERNAL,
|
||||
@ -51,10 +51,10 @@ index e85c62ba9c..a2ad512251 100644
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 7e9241cf42..6d16043131 100644
|
||||
index 29196c18d8..a95beb823e 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3524,6 +3524,7 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3544,6 +3544,7 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
GList *l;
|
||||
UuidInfo *uuid_info;
|
||||
BlockJob *job;
|
||||
@ -62,7 +62,7 @@ index 7e9241cf42..6d16043131 100644
|
||||
|
||||
if (!backup_state.backup_mutex_initialized) {
|
||||
qemu_co_mutex_init(&backup_state.backup_mutex);
|
||||
@@ -3611,6 +3612,7 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3631,6 +3632,7 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
uuid_generate(uuid);
|
||||
|
||||
if (format == BACKUP_FORMAT_VMA) {
|
||||
@ -70,7 +70,7 @@ index 7e9241cf42..6d16043131 100644
|
||||
vmaw = vma_writer_create(task->backup_file, uuid, &local_err);
|
||||
if (!vmaw) {
|
||||
if (local_err) {
|
||||
@@ -3718,8 +3720,8 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3738,8 +3740,8 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
l = g_list_next(l);
|
||||
job = backup_job_create(NULL, di->bs, di->target, backup_state.speed, MIRROR_SYNC_MODE_FULL, NULL,
|
||||
false, BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
||||
@ -81,16 +81,16 @@ index 7e9241cf42..6d16043131 100644
|
||||
if (!job || local_err != NULL) {
|
||||
error_setg(&backup_state.error, "backup_job_create failed");
|
||||
break;
|
||||
@@ -4284,7 +4286,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
@@ -4312,7 +4314,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
- job_flags, NULL, NULL, NULL, 0, txn, &local_err);
|
||||
+ job_flags, NULL, 0, NULL, NULL, 0, txn, &local_err);
|
||||
bdrv_unref(target_bs);
|
||||
if (local_err != NULL) {
|
||||
error_propagate(errp, local_err);
|
||||
@@ -4394,7 +4396,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
goto unref;
|
||||
@@ -4417,7 +4419,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||
backup->sync, bmap, backup->compress,
|
||||
backup->on_source_error, backup->on_target_error,
|
||||
@ -100,10 +100,10 @@ index 7e9241cf42..6d16043131 100644
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index fd1828cd70..0ac312b359 100644
|
||||
index 73a55a7351..13dfee215d 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -1144,6 +1144,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||
@@ -1156,6 +1156,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||
* @on_target_error: The action to take upon error writing to the target.
|
||||
* @creation_flags: Flags that control the behavior of the Job lifetime.
|
||||
* See @BlockJobCreateFlags
|
||||
@ -113,7 +113,7 @@ index fd1828cd70..0ac312b359 100644
|
||||
* @cb: Completion function for the job.
|
||||
* @opaque: Opaque pointer value passed to @cb.
|
||||
* @txn: Transaction that this job is part of (may be NULL).
|
||||
@@ -1160,6 +1163,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -1172,6 +1175,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
BlockdevOnError on_target_error,
|
||||
int creation_flags,
|
||||
BackupDumpFunc *dump_cb,
|
||||
|
@ -12,20 +12,20 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index 2ccec79db6..cc20d77b9f 100644
|
||||
index a3f0d2c9a5..3e99d23e98 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -133,7 +133,12 @@ static int coroutine_fn backup_cow_with_bounce_buffer(BackupBlockJob *job,
|
||||
@@ -131,7 +131,12 @@ static int coroutine_fn backup_cow_with_bounce_buffer(BackupBlockJob *job,
|
||||
|
||||
if (qemu_iovec_is_zero(&qiov)) {
|
||||
if (buffer_is_zero(*bounce_buffer, nbytes)) {
|
||||
if (job->dump_cb) {
|
||||
- ret = job->dump_cb(job->common.job.opaque, job->target, start, qiov.size, NULL);
|
||||
+ if (qiov.size == job->cluster_size) {
|
||||
- ret = job->dump_cb(job->common.job.opaque, job->target, start, nbytes, NULL);
|
||||
+ if (nbytes == job->cluster_size) {
|
||||
+ // Note: pass NULL to indicate that we want to write [0u8; cluster_size]
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, qiov.size, NULL);
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, nbytes, NULL);
|
||||
+ } else {
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, qiov.size, *bounce_buffer);
|
||||
+ ret = job->dump_cb(job->common.job.opaque, job->target, start, nbytes, *bounce_buffer);
|
||||
+ }
|
||||
} else {
|
||||
ret = blk_co_pwrite_zeroes(job->target, start,
|
||||
qiov.size, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
nbytes, write_flags | BDRV_REQ_MAY_UNMAP);
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
||||
1 file changed, 26 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 6d16043131..786921da0a 100644
|
||||
index a95beb823e..530b76c82f 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3416,10 +3416,16 @@ void qmp_backup_cancel(Error **errp)
|
||||
@@ -3436,10 +3436,16 @@ void qmp_backup_cancel(Error **errp)
|
||||
block_on_coroutine_fn(pvebackup_co_cancel, NULL);
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ index 6d16043131..786921da0a 100644
|
||||
char *cdata = NULL;
|
||||
gsize clen = 0;
|
||||
GError *err = NULL;
|
||||
@@ -3429,28 +3435,30 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
@@ -3449,28 +3455,30 @@ static int config_to_vma(const char *file, BackupFormat format,
|
||||
}
|
||||
|
||||
char *basename = g_path_get_basename(file);
|
||||
@ -77,7 +77,7 @@ index 6d16043131..786921da0a 100644
|
||||
}
|
||||
|
||||
bool job_should_pause(Job *job);
|
||||
@@ -3526,6 +3534,9 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3546,6 +3554,9 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
BlockJob *job;
|
||||
int dump_cb_block_size = -1;
|
||||
|
||||
@ -87,7 +87,7 @@ index 6d16043131..786921da0a 100644
|
||||
if (!backup_state.backup_mutex_initialized) {
|
||||
qemu_co_mutex_init(&backup_state.backup_mutex);
|
||||
backup_state.backup_mutex_initialized = true;
|
||||
@@ -3670,16 +3681,17 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
@@ -3690,16 +3701,17 @@ static void coroutine_fn pvebackup_co_start(void *opaque)
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -9,10 +9,10 @@ The backup loop will automatically abort if we return an error.
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 786921da0a..a36c4ce23d 100644
|
||||
index 530b76c82f..568f71fdb4 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3254,10 +3254,8 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
@@ -3274,10 +3274,8 @@ static int coroutine_fn pvebackup_co_dump_cb(void *opaque, BlockBackend *target,
|
||||
if (!backup_state.error) {
|
||||
vma_writer_error_propagate(backup_state.vmaw, &backup_state.error);
|
||||
}
|
||||
|
@ -12,10 +12,10 @@ jobs in the list.
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index a36c4ce23d..421240fbb8 100644
|
||||
index 568f71fdb4..66f2711185 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3339,12 +3339,14 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
@@ -3359,12 +3359,14 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
backup_state.di_list = g_list_remove(backup_state.di_list, di);
|
||||
g_free(di);
|
||||
|
||||
@ -32,7 +32,7 @@ index a36c4ce23d..421240fbb8 100644
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3490,9 +3492,6 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
@@ -3510,9 +3512,6 @@ static void coroutine_fn pvebackup_co_run_next_job(void)
|
||||
}
|
||||
}
|
||||
qemu_co_mutex_unlock(&backup_state.backup_mutex);
|
||||
|
@ -9,10 +9,10 @@ Subject: [PATCH] pvebackup_complete_cb: avoid poll loop if already inside
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/blockdev.c b/blockdev.c
|
||||
index 421240fbb8..e889bd13d5 100644
|
||||
index 66f2711185..083ada6c8e 100644
|
||||
--- a/blockdev.c
|
||||
+++ b/blockdev.c
|
||||
@@ -3169,6 +3169,8 @@ static void coroutine_fn block_on_coroutine_wrapper(void *opaque)
|
||||
@@ -3189,6 +3189,8 @@ static void coroutine_fn block_on_coroutine_wrapper(void *opaque)
|
||||
|
||||
static void block_on_coroutine_fn(CoroutineEntry *entry, void *entry_arg)
|
||||
{
|
||||
@ -21,7 +21,7 @@ index 421240fbb8..e889bd13d5 100644
|
||||
AioContext *ctx = qemu_get_current_aio_context();
|
||||
BlockOnCoroutineWrapper wrapper = {
|
||||
.finished = false,
|
||||
@@ -3352,13 +3354,17 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
@@ -3372,13 +3374,17 @@ static void coroutine_fn pvebackup_co_complete_cb(void *opaque)
|
||||
|
||||
static void pvebackup_complete_cb(void *opaque, int ret)
|
||||
{
|
||||
|
@ -9,10 +9,10 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/backup.c b/block/backup.c
|
||||
index cc20d77b9f..cdf815816f 100644
|
||||
index 3e99d23e98..dbdc0a76ca 100644
|
||||
--- a/block/backup.c
|
||||
+++ b/block/backup.c
|
||||
@@ -655,11 +655,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
@@ -642,11 +642,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
2
qemu
2
qemu
@ -1 +1 @@
|
||||
Subproject commit 23967e5b2a6c6d04b8db766a8a149f3631a7b899
|
||||
Subproject commit 9e06029aea3b2eca1d5261352e695edc1e7d7b8b
|
Loading…
Reference in New Issue
Block a user