Skip to content

Commit

Permalink
block: Accept node-name for blockdev-snapshot-internal-sync
Browse files Browse the repository at this point in the history
In order to remove the necessity to use BlockBackend names in the
external API, we want to allow node-names everywhere. This converts
blockdev-snapshot-internal-sync to accept a node-name without lifting
the restriction that we're operating at a root node.

In case of an invalid device name, the command returns the GenericError
error class now instead of DeviceNotFound, because this is what
qmp_get_root_bs() returns.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
kevmw committed Sep 5, 2016
1 parent 2dfb4c0 commit 75dfd40
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 17 deletions.
15 changes: 3 additions & 12 deletions blockdev.c
Expand Up @@ -1511,7 +1511,6 @@ static void internal_snapshot_prepare(BlkActionState *common,
Error *local_err = NULL;
const char *device;
const char *name;
BlockBackend *blk;
BlockDriverState *bs;
QEMUSnapshotInfo old_sn, *sn;
bool ret;
Expand All @@ -1534,23 +1533,15 @@ static void internal_snapshot_prepare(BlkActionState *common,
return;
}

blk = blk_by_name(device);
if (!blk) {
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
"Device '%s' not found", device);
bs = qmp_get_root_bs(device, errp);
if (!bs) {
return;
}

/* AioContext is released in .clean() */
state->aio_context = blk_get_aio_context(blk);
state->aio_context = bdrv_get_aio_context(bs);
aio_context_acquire(state->aio_context);

if (!blk_is_available(blk)) {
error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
return;
}
bs = blk_bs(blk);

state->bs = bs;
bdrv_drained_begin(bs);

Expand Down
5 changes: 3 additions & 2 deletions qapi/block.json
Expand Up @@ -58,7 +58,8 @@
##
# @BlockdevSnapshotInternal
#
# @device: the name of the device to generate the snapshot from
# @device: the device name or node-name of a root node to generate the snapshot
# from
#
# @name: the name of the internal snapshot to be created
#
Expand All @@ -80,7 +81,7 @@
# For the arguments, see the documentation of BlockdevSnapshotInternal.
#
# Returns: nothing on success
# If @device is not a valid block device, DeviceNotFound
# If @device is not a valid block device, GenericError
# If any snapshot matching @name exists, or @name is empty,
# GenericError
# If the format of the image used does not support it,
Expand Down
6 changes: 4 additions & 2 deletions qmp-commands.hx
Expand Up @@ -1407,7 +1407,8 @@ actions array:
- "mode": whether and how QEMU should create the snapshot file
(NewImageMode, optional, default "absolute-paths")
When "type" is "blockdev-snapshot-internal-sync":
- "device": device name to snapshot (json-string)
- "device": the device name or node-name of a root node to snapshot
(json-string)
- "name": name of the new snapshot (json-string)

Example:
Expand Down Expand Up @@ -1608,7 +1609,8 @@ name already exists, the operation will fail.

Arguments:

- "device": device name to snapshot (json-string)
- "device": the device name or node-name of a root node to snapshot
(json-string)
- "name": name of the new snapshot (json-string)

Example:
Expand Down
2 changes: 1 addition & 1 deletion tests/qemu-iotests/057
Expand Up @@ -182,7 +182,7 @@ class TestSingleTransaction(ImageSnapshotTestCase):
'name': 'a' },
}]
result = self.vm.qmp('transaction', actions = actions)
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
self.assert_qmp(result, 'error/class', 'GenericError')

def test_error_exist(self):
self.createSnapshotInTransaction(1)
Expand Down

0 comments on commit 75dfd40

Please sign in to comment.