diff options
author | Kevin Wolf <kwolf@redhat.com> | 2016-06-23 14:20:24 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2016-09-05 19:06:47 +0200 |
commit | 2dfb4c033f2f8fbad252bed1ba3e0fed112cbb7c (patch) | |
tree | b0ce7a33c273549cb6917384f851d1af85cbf573 | |
parent | 07eec652722f3d12b07c5b28d0671ddfc22fe6a5 (diff) |
block: Accept node-name for blockdev-snapshot-delete-internal-sync
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-delete-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>
-rw-r--r-- | blockdev.c | 16 | ||||
-rw-r--r-- | qapi/block.json | 5 | ||||
-rw-r--r-- | qmp-commands.hx | 2 | ||||
-rwxr-xr-x | tests/qemu-iotests/057 | 2 |
4 files changed, 8 insertions, 17 deletions
diff --git a/blockdev.c b/blockdev.c index ccff1f7d05..9feffcd088 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1306,21 +1306,17 @@ SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device, Error **errp) { BlockDriverState *bs; - BlockBackend *blk; AioContext *aio_context; QEMUSnapshotInfo sn; Error *local_err = NULL; SnapshotInfo *info = NULL; int ret; - 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 NULL; } - - aio_context = blk_get_aio_context(blk); + aio_context = bdrv_get_aio_context(bs); aio_context_acquire(aio_context); if (!has_id) { @@ -1336,12 +1332,6 @@ SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device, goto out_aio_context; } - if (!blk_is_available(blk)) { - error_setg(errp, "Device '%s' has no medium", device); - goto out_aio_context; - } - bs = blk_bs(blk); - if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE, errp)) { goto out_aio_context; } diff --git a/qapi/block.json b/qapi/block.json index 937337dce5..c0e831fd29 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -99,14 +99,15 @@ # both. One of the name or id is required. Return SnapshotInfo for the # successfully deleted snapshot. # -# @device: the name of the device to delete the snapshot from +# @device: the device name or node-name of a root node to delete the snapshot +# from # # @id: optional the snapshot's ID to be deleted # # @name: optional the snapshot's name to be deleted # # Returns: SnapshotInfo on success -# If @device is not a valid block device, DeviceNotFound +# If @device is not a valid block device, GenericError # If snapshot not found, GenericError # If the format of the image used does not support it, # BlockFormatFeatureNotSupported diff --git a/qmp-commands.hx b/qmp-commands.hx index 034d51718c..6793c8d36b 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -1639,7 +1639,7 @@ fail. Arguments: -- "device": device name (json-string) +- "device": the device name or node-name of a root node (json-string) - "id": ID of the snapshot (json-string, optional) - "name": name of the snapshot (json-string, optional) diff --git a/tests/qemu-iotests/057 b/tests/qemu-iotests/057 index 9cdd582e39..bb6c06a6fd 100755 --- a/tests/qemu-iotests/057 +++ b/tests/qemu-iotests/057 @@ -239,7 +239,7 @@ class TestSnapshotDelete(ImageSnapshotTestCase): result = self.vm.qmp('blockdev-snapshot-delete-internal-sync', device = 'drive_error', id = '0') - self.assert_qmp(result, 'error/class', 'DeviceNotFound') + self.assert_qmp(result, 'error/class', 'GenericError') def test_error_no_id_and_name(self): result = self.vm.qmp('blockdev-snapshot-delete-internal-sync', |