From: Max Reitz <mreitz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Alberto Garcia <berto@igalia.com>,
qemu-block@nongnu.org, John Snow <jsnow@redhat.com>,
qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v7 33/39] blockdev: Implement change with basic operations
Date: Fri, 23 Oct 2015 16:43:05 +0200 [thread overview]
Message-ID: <562A4779.2040708@redhat.com> (raw)
In-Reply-To: <20151023141131.GI3797@noname.redhat.com>
[-- Attachment #1: Type: text/plain, Size: 6285 bytes --]
On 23.10.2015 16:11, Kevin Wolf wrote:
> Am 19.10.2015 um 17:53 hat Max Reitz geschrieben:
>> 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>
>> ---
>> blockdev.c | 184 +++++++++++++++++++++++++------------------------------------
>> 1 file changed, 74 insertions(+), 110 deletions(-)
>>
>> diff --git a/blockdev.c b/blockdev.c
>> index 0481686..50e5e74 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -1901,44 +1901,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;
>> @@ -1976,78 +1938,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)
>> {
>> @@ -2204,6 +2094,80 @@ 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;
>> + BlockBackendRootState *blk_rs;
>> + 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);
>> + }
>> +
>> + blk_rs = blk_get_root_state(blk);
>> + bdrv_flags = blk_rs->read_only ? 0 : BDRV_O_RDWR;
>> + bdrv_flags |= blk_rs->open_flags & ~BDRV_O_RDWR;
>> +
>> + 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;
>> + }
>> +
>> + medium_bs->detect_zeroes = blk_rs->detect_zeroes;
>> + if (blk_rs->throttle_group) {
>> + bdrv_io_limits_enable(medium_bs, blk_rs->throttle_group);
>> + }
>
> Would it make sense to have a blk_apply_root_state() that does these
> updates? Otherwise you have to keep this place up to date if the struct
> is ever extended. (Which would mean that we forgot something, so
> hopefully not.)
Makes sense. I'll probably write one with an annotation that it's only
to be used by this function.
Max
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
next prev parent reply other threads:[~2015-10-23 14:43 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-19 15:53 [Qemu-devel] [PATCH v7 00/39] blockdev: BlockBackend and media Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 01/39] block: Remove host floppy support Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 02/39] block: Set BDRV_O_INCOMING in bdrv_fill_options() Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 03/39] blockdev: Allow creation of BDS trees without BB Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 04/39] iotests: Only create BB if necessary Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 05/39] block: Make bdrv_is_inserted() return a bool Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 06/39] block: Add blk_is_available() Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 07/39] block: Make bdrv_is_inserted() recursive Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 08/39] block/raw_bsd: Drop raw_is_inserted() Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 09/39] block: Invoke change media CB before NULLing drv Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 10/39] hw/block/fdc: Implement tray status Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 11/39] hw/usb-storage: Check whether BB is inserted Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 12/39] block: Fix BB AIOCB AioContext without BDS Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 13/39] block: Move guest_block_size into BlockBackend Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 14/39] block: Remove wr_highest_sector from BlockAcctStats Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 15/39] block: Move BlockAcctStats into BlockBackend Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 16/39] block: Move I/O status and error actions into BB Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 17/39] block/throttle-groups: Make incref/decref public Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 18/39] block: Add BlockBackendRootState Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 19/39] block: Make some BB functions fall back to BBRS Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 20/39] block: Fail requests to empty BlockBackend Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 21/39] block: Prepare remaining BB functions for NULL BDS Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 22/39] block: Add blk_insert_bs() Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 23/39] block: Prepare for NULL BDS Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 24/39] blockdev: Do not create BDS for empty drive Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 25/39] blockdev: Pull out blockdev option extraction Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 26/39] blockdev: Allow more options for BB-less BDS tree Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 27/39] block: Add blk_remove_bs() Max Reitz
2015-10-20 8:33 ` Kevin Wolf
2015-10-21 13:47 ` Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 28/39] blockdev: Add blockdev-open-tray Max Reitz
2015-10-23 13:22 ` Kevin Wolf
2015-10-23 14:22 ` Max Reitz
2015-10-23 13:26 ` Kevin Wolf
2015-10-23 14:26 ` Max Reitz
2015-10-23 14:45 ` Kevin Wolf
2015-10-23 15:25 ` Max Reitz
2015-10-23 15:44 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 29/39] blockdev: Add blockdev-close-tray Max Reitz
2015-10-23 13:43 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 30/39] blockdev: Add blockdev-remove-medium Max Reitz
2015-10-23 13:45 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 31/39] blockdev: Add blockdev-insert-medium Max Reitz
2015-10-21 11:49 ` Alberto Garcia
2015-10-21 13:47 ` Max Reitz
2015-10-23 13:39 ` Kevin Wolf
2015-10-23 14:04 ` Max Reitz
2015-10-23 13:42 ` Kevin Wolf
2015-10-23 14:35 ` Max Reitz
2015-10-23 14:52 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 32/39] blockdev: Implement eject with basic operations Max Reitz
2015-10-23 13:54 ` Kevin Wolf
2015-10-23 14:42 ` Max Reitz
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 33/39] blockdev: Implement change " Max Reitz
2015-10-23 14:11 ` Kevin Wolf
2015-10-23 14:43 ` Max Reitz [this message]
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 34/39] block: Inquire tray state before tray-moved events Max Reitz
2015-10-23 14:16 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 35/39] qmp: Introduce blockdev-change-medium Max Reitz
2015-10-23 14:25 ` Kevin Wolf
2015-10-23 15:08 ` Max Reitz
2015-10-26 12:14 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 36/39] hmp: Use blockdev-change-medium for change command Max Reitz
2015-10-26 12:13 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 37/39] blockdev: read-only-mode for blockdev-change-medium Max Reitz
2015-10-26 12:13 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 38/39] hmp: Add read-only-mode option to change command Max Reitz
2015-10-26 12:12 ` Kevin Wolf
2015-10-19 15:53 ` [Qemu-devel] [PATCH v7 39/39] iotests: Add test for change-related QMP commands Max Reitz
2015-10-26 13:46 ` Kevin Wolf
2015-10-20 11:10 ` [Qemu-devel] [PATCH v7 00/39] blockdev: BlockBackend and media Kevin Wolf
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=562A4779.2040708@redhat.com \
--to=mreitz@redhat.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).