[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 07/10] block: add ability for block-stream to use
From: |
Jeff Cody |
Subject: |
[Qemu-devel] [PATCH v4 07/10] block: add ability for block-stream to use node-name |
Date: |
Wed, 4 Jun 2014 09:51:09 -0400 |
This adds the ability for block-stream to use node-name arguments
for base, to specify the backing image to stream from.
Both 'base' and 'base-node-name' are optional, but mutually exclusive.
Either can be specified, but not both together.
The argument for "device" is now optional as well, so long as
base-node-name is specified. From the node-name, we can determine
the full device chain.
Signed-off-by: Jeff Cody <address@hidden>
---
blockdev.c | 48 +++++++++++++++++++++++++++++++++++++++---------
hmp.c | 2 +-
qapi-schema.json | 16 ++++++++++++----
qmp-commands.hx | 2 +-
4 files changed, 53 insertions(+), 15 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 7a97b7f..16b44f7 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1872,38 +1872,68 @@ static void block_job_cb(void *opaque, int ret)
bdrv_put_ref_bh_schedule(bs);
}
-void qmp_block_stream(const char *device, bool has_base,
- const char *base, bool has_speed, int64_t speed,
+void qmp_block_stream(const char *device,
+ bool has_base, const char *base,
+ bool has_base_node_name, const char *base_node_name,
+ bool has_speed, int64_t speed,
bool has_on_error, BlockdevOnError on_error,
Error **errp)
{
- BlockDriverState *bs;
+ BlockDriverState *bs = NULL;
BlockDriverState *base_bs = NULL;
+ BlockDriverState *tmp_bs;
Error *local_err = NULL;
+ const char *base_name = NULL;
if (!has_on_error) {
on_error = BLOCKDEV_ON_ERROR_REPORT;
}
+ if (has_base && has_base_node_name) {
+ error_setg(errp, "'base' and 'base-node-name' are mutually exclusive");
+ return;
+ }
+
bs = bdrv_find(device);
if (!bs) {
error_set(errp, QERR_DEVICE_NOT_FOUND, device);
return;
}
+ if (has_base_node_name) {
+ base_bs = bdrv_lookup_bs(NULL, base_node_name, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+ tmp_bs = bdrv_find_overlay(bs, base_bs);
+ if (tmp_bs) {
+ base_name = tmp_bs->backing_file;
+ }
+ }
+
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_STREAM, errp)) {
return;
}
- if (base) {
+ if (has_base) {
base_bs = bdrv_find_backing_image(bs, base);
- if (base_bs == NULL) {
- error_set(errp, QERR_BASE_NOT_FOUND, base);
- return;
- }
+ base_name = base;
+ }
+
+ if (base_bs == NULL && (has_base || has_base_node_name)) {
+ error_set(errp, QERR_BASE_NOT_FOUND, base);
+ return;
+ }
+
+ /* Verify that 'base' is in the same chain as 'bs', if 'base' was
+ * specified */
+ if (base_bs && !bdrv_chain_contains(bs, base_bs)) {
+ error_setg(errp, "'device' and 'base' are not in the same chain");
+ return;
}
- stream_start(bs, base_bs, base, has_speed ? speed : 0,
+ stream_start(bs, base_bs, base_name, has_speed ? speed : 0,
on_error, block_job_cb, bs, &local_err);
if (local_err) {
error_propagate(errp, local_err);
diff --git a/hmp.c b/hmp.c
index ccc35d4..bb934df 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1173,7 +1173,7 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
int64_t speed = qdict_get_try_int(qdict, "speed", 0);
qmp_block_stream(device, base != NULL, base,
- qdict_haskey(qdict, "speed"), speed,
+ false, NULL, qdict_haskey(qdict, "speed"), speed,
true, BLOCKDEV_ON_ERROR_REPORT, &error);
hmp_handle_error(mon, &error);
diff --git a/qapi-schema.json b/qapi-schema.json
index b449aec..2cdd96e 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2599,9 +2599,17 @@
# On successful completion the image file is updated to drop the backing file
# and the BLOCK_JOB_COMPLETED event is emitted.
#
-# @device: the device name
+# @device: The device name.
+#
+# For 'base', either @base or @base-node-name may be set but not both. If
+# neither is specified, the entire chain will be streamed into the active
image,
+# and the chain will consist of a single image (the current active layer) with
+# no backing file.
#
-# @base: #optional the common backing file name
+# @base: #optional the common backing file name
+#
+# @base-node-name: #optional the block driver state node name of the
+# common backing file. (Since 2.1)
#
# @speed: #optional the maximum speed, in bytes per second
#
@@ -2615,8 +2623,8 @@
# Since: 1.1
##
{ 'command': 'block-stream',
- 'data': { 'device': 'str', '*base': 'str', '*speed': 'int',
- '*on-error': 'BlockdevOnError' } }
+ 'data': { 'device': 'str', '*base': 'str', '*base-node-name': 'str',
+ '*speed': 'int', '*on-error': 'BlockdevOnError' } }
##
# @block-job-set-speed:
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 1014b68..9ddc39a 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -979,7 +979,7 @@ EQMP
{
.name = "block-stream",
- .args_type = "device:B,base:s?,speed:o?,on-error:s?",
+ .args_type =
"device:B,base:s?,base-node-name:s?,speed:o?,on-error:s?",
.mhandler.cmd_new = qmp_marshal_input_block_stream,
},
--
1.9.3
- [Qemu-devel] [PATCH v4 04/10] block: make 'top' argument to block-commit optional, (continued)
- [Qemu-devel] [PATCH v4 04/10] block: make 'top' argument to block-commit optional, Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 03/10] block: simplify bdrv_find_base() and bdrv_find_overlay(), Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 05/10] block: Accept node-name arguments for block-commit, Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 06/10] block: extend block-commit to accept a string for the backing file, Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 08/10] block: add backing-file option to block-stream, Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 07/10] block: add ability for block-stream to use node-name,
Jeff Cody <=
- [Qemu-devel] [PATCH v4 09/10] block: Add QMP documentation for block-stream, Jeff Cody, 2014/06/04
- [Qemu-devel] [PATCH v4 10/10] block: add QAPI command to allow live backing file change, Jeff Cody, 2014/06/04