From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 10/37] blockdev: Implement change with basic operations
Date: Thu, 5 Nov 2015 19:17:38 +0100 [thread overview]
Message-ID: <1446747485-6562-11-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1446747485-6562-1-git-send-email-kwolf@redhat.com>
From: Max Reitz <mreitz@redhat.com>
Implement 'change' on block devices by calling blockdev-open-tray,
blockdev-remove-medium, blockdev-insert-medium (a variation of that
which does not need a node-name) and blockdev-close-tray.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
blockdev.c | 178 +++++++++++++++++++++++--------------------------------------
1 file changed, 68 insertions(+), 110 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 8c86a8d..df93173 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1930,44 +1930,6 @@ exit:
}
}
-
-static void eject_device(BlockBackend *blk, int force, Error **errp)
-{
- BlockDriverState *bs = blk_bs(blk);
- AioContext *aio_context;
-
- if (!bs) {
- /* No medium inserted, so there is nothing to do */
- return;
- }
-
- aio_context = bdrv_get_aio_context(bs);
- aio_context_acquire(aio_context);
-
- if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) {
- goto out;
- }
- if (!blk_dev_has_removable_media(blk)) {
- error_setg(errp, "Device '%s' is not removable",
- bdrv_get_device_name(bs));
- goto out;
- }
-
- if (blk_dev_is_medium_locked(blk) && !blk_dev_is_tray_open(blk)) {
- blk_dev_eject_request(blk, force);
- if (!force) {
- error_setg(errp, "Device '%s' is locked",
- bdrv_get_device_name(bs));
- goto out;
- }
- }
-
- bdrv_close(bs);
-
-out:
- aio_context_release(aio_context);
-}
-
void qmp_eject(const char *device, bool has_force, bool force, Error **errp)
{
Error *local_err = NULL;
@@ -2005,78 +1967,6 @@ void qmp_block_passwd(bool has_device, const char *device,
aio_context_release(aio_context);
}
-/* Assumes AioContext is held */
-static void qmp_bdrv_open_encrypted(BlockDriverState **pbs,
- const char *filename,
- int bdrv_flags, const char *format,
- const char *password, Error **errp)
-{
- Error *local_err = NULL;
- QDict *options = NULL;
- int ret;
-
- if (format) {
- options = qdict_new();
- qdict_put(options, "driver", qstring_from_str(format));
- }
-
- ret = bdrv_open(pbs, filename, NULL, options, bdrv_flags, &local_err);
- if (ret < 0) {
- error_propagate(errp, local_err);
- return;
- }
-
- bdrv_add_key(*pbs, password, errp);
-}
-
-void qmp_change_blockdev(const char *device, const char *filename,
- const char *format, Error **errp)
-{
- BlockBackend *blk;
- BlockDriverState *bs;
- AioContext *aio_context;
- int bdrv_flags;
- bool new_bs;
- Error *err = NULL;
-
- blk = blk_by_name(device);
- if (!blk) {
- error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
- "Device '%s' not found", device);
- return;
- }
- bs = blk_bs(blk);
- new_bs = !bs;
-
- aio_context = blk_get_aio_context(blk);
- aio_context_acquire(aio_context);
-
- eject_device(blk, 0, &err);
- if (err) {
- error_propagate(errp, err);
- goto out;
- }
-
- bdrv_flags = blk_is_read_only(blk) ? 0 : BDRV_O_RDWR;
- bdrv_flags |= blk_get_root_state(blk)->open_flags & ~BDRV_O_RDWR;
-
- qmp_bdrv_open_encrypted(&bs, filename, bdrv_flags, format, NULL, &err);
- if (err) {
- error_propagate(errp, err);
- goto out;
- }
-
- if (new_bs) {
- blk_insert_bs(blk, bs);
- /* Has been sent automatically by bdrv_open() if blk_bs(blk) was not
- * NULL */
- blk_dev_change_media_cb(blk, true);
- }
-
-out:
- aio_context_release(aio_context);
-}
-
void qmp_blockdev_open_tray(const char *device, bool has_force, bool force,
Error **errp)
{
@@ -2243,6 +2133,74 @@ void qmp_blockdev_insert_medium(const char *device, const char *node_name,
qmp_blockdev_insert_anon_medium(device, bs, errp);
}
+void qmp_change_blockdev(const char *device, const char *filename,
+ const char *format, Error **errp)
+{
+ BlockBackend *blk;
+ BlockDriverState *medium_bs = NULL;
+ int bdrv_flags, ret;
+ QDict *options = NULL;
+ Error *err = NULL;
+
+ blk = blk_by_name(device);
+ if (!blk) {
+ error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
+ "Device '%s' not found", device);
+ goto fail;
+ }
+
+ if (blk_bs(blk)) {
+ blk_update_root_state(blk);
+ }
+
+ bdrv_flags = blk_get_open_flags_from_root_state(blk);
+
+ if (format) {
+ options = qdict_new();
+ qdict_put(options, "driver", qstring_from_str(format));
+ }
+
+ assert(!medium_bs);
+ ret = bdrv_open(&medium_bs, filename, NULL, options, bdrv_flags, errp);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ blk_apply_root_state(blk, medium_bs);
+
+ bdrv_add_key(medium_bs, NULL, &err);
+ if (err) {
+ error_propagate(errp, err);
+ goto fail;
+ }
+
+ qmp_blockdev_open_tray(device, false, false, &err);
+ if (err) {
+ error_propagate(errp, err);
+ goto fail;
+ }
+
+ qmp_blockdev_remove_medium(device, &err);
+ if (err) {
+ error_propagate(errp, err);
+ goto fail;
+ }
+
+ qmp_blockdev_insert_anon_medium(device, medium_bs, &err);
+ if (err) {
+ error_propagate(errp, err);
+ goto fail;
+ }
+
+ qmp_blockdev_close_tray(device, errp);
+
+fail:
+ /* If the medium has been inserted, the device has its own reference, so
+ * ours must be relinquished; and if it has not been inserted successfully,
+ * the reference must be relinquished anyway */
+ bdrv_unref(medium_bs);
+}
+
/* throttling disk I/O limits */
void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
int64_t bps_wr,
--
1.8.3.1
next prev parent reply other threads:[~2015-11-05 18:18 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-05 18:17 [Qemu-devel] [PULL 00/37] Block layer patches Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 01/37] block: Don't call blk_bs() twice in bdrv_lookup_bs() Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 02/37] block: Add blk_remove_bs() Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 03/37] block: Make bdrv_states public Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 04/37] block: Add functions for inheriting a BBRS Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 05/37] blockdev: Add blockdev-open-tray Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 06/37] blockdev: Add blockdev-close-tray Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 07/37] blockdev: Add blockdev-remove-medium Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 08/37] blockdev: Add blockdev-insert-medium Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 09/37] blockdev: Implement eject with basic operations Kevin Wolf
2015-11-05 18:17 ` Kevin Wolf [this message]
2015-11-05 18:17 ` [Qemu-devel] [PULL 11/37] block: Inquire tray state before tray-moved events Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 12/37] qmp: Introduce blockdev-change-medium Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 13/37] hmp: Use blockdev-change-medium for change command Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 14/37] blockdev: read-only-mode for blockdev-change-medium Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 15/37] hmp: Add read-only-mode option to change command Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 16/37] iotests: Add test for change-related QMP commands Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 17/37] block: check for existing device IDs in external_snapshot_prepare() Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 18/37] block: rename BlockdevSnapshot to BlockdevSnapshotSync Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 19/37] block: support passing 'backing': '' to 'blockdev-add' Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 20/37] block: add a 'blockdev-snapshot' QMP command Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 21/37] block: add tests for the 'blockdev-snapshot' command Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 22/37] commit: reopen overlay_bs before base Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 23/37] qemu-iotests: Test the reopening of overlay_bs in 'block-commit' Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 24/37] qcow2: avoid misaligned 64bit bswap Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 25/37] qemu-img: add check for zero-length job len Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 26/37] throttle: Check for pending requests in throttle_group_unregister_bs() Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 27/37] throttle: Use bs->throttle_state instead of bs->io_limits_enabled Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 28/37] block: Disallow snapshots if the overlay doesn't support backing files Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 29/37] block: Remove inner quotation marks in iotest 085 Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 30/37] block: test 'blockdev-snapshot' using a file BDS as the overlay Kevin Wolf
2015-11-05 18:17 ` [Qemu-devel] [PULL 31/37] qemu-iotests: fix cleanup of background processes Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 32/37] qemu-iotests: fix -valgrind option for check Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 33/37] mirror: block all operations on the target image during the job Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 34/37] block: Add blk_get_refcnt() Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 35/37] block: Add 'x-blockdev-del' QMP command Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 36/37] iotests: Add tests for the x-blockdev-del command Kevin Wolf
2015-11-05 18:18 ` [Qemu-devel] [PULL 37/37] qcow2: Fix qcow2_get_cluster_offset() for zero clusters Kevin Wolf
2015-11-05 19:01 ` [Qemu-devel] [PULL 00/37] Block layer patches Peter Maydell
2015-11-06 8:17 ` Kevin Wolf
2015-11-06 15:10 ` Max Reitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1446747485-6562-11-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).