From: Luiz Capitulino <lcapitulino@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, quintela@redhat.com,
stefano.stabellini@eu.citrix.com, qemu-devel@nongnu.org,
hare@suse.de, amit.shah@redhat.com, hch@lst.de
Subject: Re: [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable"
Date: Thu, 4 Aug 2011 14:58:26 -0300 [thread overview]
Message-ID: <20110804145826.58167635@doriath> (raw)
In-Reply-To: <1312376904-16115-36-git-send-email-armbru@redhat.com>
On Wed, 3 Aug 2011 15:08:14 +0200
Markus Armbruster <armbru@redhat.com> wrote:
> BlockDriverState member removable is a confused mess. It is true when
> an ide-cd, scsi-cd or floppy qdev is attached, or when the
> BlockDriverState was created with -drive if={floppy,sd} or -drive
> if={ide,scsi,xen,none},media=cdrom ("created removable"), except when
> an ide-hd, scsi-hd, scsi-generic or virtio-blk qdev is attached.
>
> Three users remain:
>
> 1. eject_device(), via bdrv_is_removable() uses it to determine
> whether a block device can eject media.
>
> 2. bdrv_info() is monitor command "info block". QMP documentation
> says "true if the device is removable, false otherwise". From the
> monitor user's point of view, the only sensible interpretation of
> "is removable" is "can eject media with monitor commands eject and
> change".
>
> A block device can eject media unless a device is attached that
> doesn't support it. Switch the two users over to new
> bdrv_dev_has_removable_media() that returns exactly that.
>
> 3. bdrv_getlength() uses to suppress its length cache when media can
> change (see commit 46a4e4e6). Media change is either monitor
> command change (updates the length cache), monitor command eject
> (doesn't update the length cache, easily fixable), or physical
> media change (invalidates length cache, not so easily fixable).
>
> I'm refraining from improving anything here, because this series is
> long enough already. Instead, I simply switch it over to
> bdrv_dev_has_removable_media() as well.
>
> This changes the behavior of the length cache and of monitor commands
> eject and change in two cases:
>
> a. drive not created removable, no device attached
>
> The commit makes the drive removable, and defeats the length cache.
>
> Example: -drive if=none
>
> b. drive created removable, but the attached drive is non-removable,
> and doesn't call bdrv_set_removable(..., 0) (most devices don't)
>
> The commit makes the drive non-removable, and enables the length
> cache.
>
> Example: -drive if=xen,media=cdrom -M xenpv
>
> The other non-removable devices that don't call
> bdrv_set_removable() can't currently use a drive created removable,
> either because they aren't qdevified, or because they lack a drive
> property. Won't stay that way.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
Looks good to me.
> ---
> block.c | 18 +++++++++++-------
> block.h | 3 ++-
> blockdev.c | 2 +-
> hw/scsi-disk.c | 5 +++++
> 4 files changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/block.c b/block.c
> index b3a5ee7..87a3ef3 100644
> --- a/block.c
> +++ b/block.c
> @@ -775,6 +775,9 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
> {
> bs->dev_ops = ops;
> bs->dev_opaque = opaque;
> + if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
> + bs_snapshots = NULL;
> + }
> }
>
> static void bdrv_dev_change_media_cb(BlockDriverState *bs)
> @@ -784,6 +787,11 @@ static void bdrv_dev_change_media_cb(BlockDriverState *bs)
> }
> }
>
> +bool bdrv_dev_has_removable_media(BlockDriverState *bs)
> +{
> + return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
> +}
> +
> static void bdrv_dev_resize_cb(BlockDriverState *bs)
> {
> if (bs->dev_ops && bs->dev_ops->resize_cb) {
> @@ -1289,7 +1297,7 @@ int64_t bdrv_getlength(BlockDriverState *bs)
> if (!drv)
> return -ENOMEDIUM;
>
> - if (bs->growable || bs->removable) {
> + if (bs->growable || bdrv_dev_has_removable_media(bs)) {
> if (drv->bdrv_getlength) {
> return drv->bdrv_getlength(bs);
> }
> @@ -1574,11 +1582,6 @@ void bdrv_set_removable(BlockDriverState *bs, int removable)
> }
> }
>
> -int bdrv_is_removable(BlockDriverState *bs)
> -{
> - return bs->removable;
> -}
> -
> int bdrv_is_read_only(BlockDriverState *bs)
> {
> return bs->read_only;
> @@ -1857,7 +1860,8 @@ void bdrv_info(Monitor *mon, QObject **ret_data)
>
> bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
> "'removable': %i, 'locked': %i }",
> - bs->device_name, bs->removable,
> + bs->device_name,
> + bdrv_dev_has_removable_media(bs),
> bdrv_dev_is_medium_locked(bs));
>
> if (bs->drv) {
> diff --git a/block.h b/block.h
> index 4a6b957..fd8f1d1 100644
> --- a/block.h
> +++ b/block.h
> @@ -34,6 +34,7 @@ typedef struct BlockDevOps {
> * Runs when virtual media changed (monitor commands eject, change)
> * Beware: doesn't run when a host device's physical media
> * changes. Sure would be useful if it did.
> + * Device models with removable media must implement this callback.
> */
> void (*change_media_cb)(void *opaque);
> /*
> @@ -99,6 +100,7 @@ void bdrv_detach_dev(BlockDriverState *bs, void *dev);
> void *bdrv_get_attached_dev(BlockDriverState *bs);
> void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
> void *opaque);
> +bool bdrv_dev_has_removable_media(BlockDriverState *bs);
> bool bdrv_dev_is_medium_locked(BlockDriverState *bs);
> int bdrv_read(BlockDriverState *bs, int64_t sector_num,
> uint8_t *buf, int nb_sectors);
> @@ -206,7 +208,6 @@ void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
> BlockErrorAction on_write_error);
> BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read);
> void bdrv_set_removable(BlockDriverState *bs, int removable);
> -int bdrv_is_removable(BlockDriverState *bs);
> int bdrv_is_read_only(BlockDriverState *bs);
> int bdrv_is_sg(BlockDriverState *bs);
> int bdrv_enable_write_cache(BlockDriverState *bs);
> diff --git a/blockdev.c b/blockdev.c
> index bb1f8c4..bcddfc0 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -645,7 +645,7 @@ out:
>
> static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
> {
> - if (!bdrv_is_removable(bs)) {
> + if (!bdrv_dev_has_removable_media(bs)) {
> qerror_report(QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs));
> return -1;
> }
> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index 04e0a77..a30063a 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -1211,12 +1211,17 @@ static void scsi_destroy(SCSIDevice *dev)
> blockdev_mark_auto_del(s->qdev.conf.bs);
> }
>
> +static void scsi_cd_change_media_cb(void *opaque)
> +{
> +}
> +
> static bool scsi_cd_is_medium_locked(void *opaque)
> {
> return ((SCSIDiskState *)opaque)->tray_locked;
> }
>
> static const BlockDevOps scsi_cd_block_ops = {
> + .change_media_cb = scsi_cd_change_media_cb,
> .is_medium_locked = scsi_cd_is_medium_locked,
> };
>
next prev parent reply other threads:[~2011-08-04 17:58 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-03 13:07 [Qemu-devel] [PATCH v2 00/45] Block layer cleanup & fixes Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 01/45] block: Attach non-qdev devices as well Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 02/45] block: Generalize change_cb() to BlockDevOps Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 03/45] block: Split change_cb() into change_media_cb(), resize_cb() Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 04/45] ide: Update command code definitions as per ACS-2 Table B.2 Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 05/45] ide: Clean up case label indentation in ide_exec_cmd() Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 06/45] ide: Fix ATA command READ to set ATAPI signature for CD-ROM Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 07/45] ide: Use a table to declare which drive kinds accept each command Markus Armbruster
2011-08-03 16:53 ` Blue Swirl
2011-08-03 17:15 ` Markus Armbruster
2011-09-02 10:08 ` Kevin Wolf
2011-09-02 14:43 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 08/45] ide: Reject ATA commands specific to drive kinds Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 09/45] ide/atapi: Clean up misleading name in cmd_start_stop_unit() Markus Armbruster
2011-09-02 10:20 ` Kevin Wolf
2011-09-02 14:47 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 10/45] ide/atapi: Track tray open/close state Markus Armbruster
2011-09-02 10:23 ` Kevin Wolf
2011-09-02 14:51 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 11/45] scsi-disk: Factor out scsi_disk_emulate_start_stop() Markus Armbruster
2011-08-04 6:12 ` Hannes Reinecke
2011-09-02 10:26 ` Kevin Wolf
2011-09-02 14:55 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 12/45] scsi-disk: Track tray open/close state Markus Armbruster
2011-08-04 6:13 ` Hannes Reinecke
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 13/45] block: Revert entanglement of bdrv_is_inserted() with tray status Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 14/45] block: Drop tray status tracking, no longer used Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 15/45] ide/atapi: Track tray locked state Markus Armbruster
2011-09-02 11:02 ` Kevin Wolf
2011-09-02 14:56 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 16/45] scsi-disk: " Markus Armbruster
2011-08-04 6:14 ` Hannes Reinecke
2011-08-04 6:39 ` Markus Armbruster
2011-08-04 6:46 ` Hannes Reinecke
2011-08-04 7:25 ` Markus Armbruster
2011-08-04 7:30 ` Hannes Reinecke
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 17/45] block: Leave enforcing tray lock to device models Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 18/45] block: Drop medium lock tracking, ask device models instead Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 19/45] block: Rename bdrv_set_locked() to bdrv_lock_medium() Markus Armbruster
2011-09-02 11:30 ` Kevin Wolf
2011-09-02 14:58 ` Markus Armbruster
2011-08-03 13:07 ` [Qemu-devel] [PATCH v2 20/45] ide: Provide IDEDeviceInfo method exit() Markus Armbruster
2011-08-04 17:48 ` Luiz Capitulino
2011-08-05 7:13 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 21/45] ide/atapi: Don't fail eject when tray is already open Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 22/45] ide/atapi: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-09-02 12:07 ` Kevin Wolf
2011-09-02 15:19 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when it can't eject Markus Armbruster
2011-08-04 6:20 ` Hannes Reinecke
2011-08-04 6:48 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 24/45] scsi-disk: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-08-04 6:21 ` Hannes Reinecke
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 25/45] ide: Give vmstate structs internal linkage where possible Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 26/45] ide/atapi: Preserve tray state on migration Markus Armbruster
2011-09-02 12:20 ` Kevin Wolf
2011-09-02 12:35 ` Paolo Bonzini
2011-09-02 15:22 ` Markus Armbruster
2011-09-02 15:25 ` Paolo Bonzini
2011-09-02 15:20 ` Markus Armbruster
2011-09-02 15:59 ` Kevin Wolf
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 27/45] scsi-disk: " Markus Armbruster
2011-08-04 6:23 ` Hannes Reinecke
2011-08-04 6:45 ` Paolo Bonzini
2011-08-04 9:57 ` Kevin Wolf
2011-09-02 12:25 ` Kevin Wolf
2011-09-02 15:35 ` Markus Armbruster
2011-09-02 16:18 ` Kevin Wolf
2011-09-02 16:45 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 28/45] block/raw: Fix to forward method bdrv_media_changed() Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 29/45] block: Leave tracking media change to device models Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 30/45] fdc: Make media change detection more robust Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 31/45] block: Clean up bdrv_flush_all() Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 32/45] savevm: Include writable devices with removable media Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 33/45] xen: Clean up pci_piix3_xen_ide_unplug()'s test for "not a CD" Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 34/45] spitz tosa: Simplify "drive is suitable for microdrive" test Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable" Markus Armbruster
2011-08-04 17:58 ` Luiz Capitulino [this message]
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 36/45] block: Drop BlockDriverState member removable Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 37/45] block: Show whether the guest ejected the medium in info block Markus Armbruster
2011-08-04 18:05 ` Luiz Capitulino
2011-09-02 13:04 ` Kevin Wolf
2011-09-02 15:29 ` Markus Armbruster
2011-09-02 16:22 ` Kevin Wolf
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 38/45] block: Move BlockConf & friends from block_int.h to block.h Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 39/45] hw: Trim superfluous #include "block_int.h" Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 40/45] block: Declare qemu_blockalign() in block.h, not block_int.h Markus Armbruster
2011-08-04 18:10 ` Luiz Capitulino
2011-08-04 18:22 ` Markus Armbruster
2011-08-04 18:28 ` Luiz Capitulino
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 41/45] block: New bdrv_set_buffer_alignment() Markus Armbruster
2011-09-02 13:13 ` Kevin Wolf
2011-09-02 15:30 ` Markus Armbruster
2011-09-02 16:25 ` Kevin Wolf
2011-09-02 16:53 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 42/45] block: Reset buffer alignment on detach Markus Armbruster
2011-09-02 13:20 ` Kevin Wolf
2011-09-02 15:32 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 43/45] nbd: Clean up use of block_int.h Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 44/45] block: New change_media_cb() parameter load Markus Armbruster
2011-09-02 13:26 ` Kevin Wolf
2011-09-02 15:33 ` Markus Armbruster
2011-08-03 13:08 ` [Qemu-devel] [PATCH v2 45/45] ide/atapi scsi-disk: Make monitor eject -f, then change work Markus Armbruster
2011-08-04 15:54 ` [Qemu-devel] [PATCH v2 00/45] Block layer cleanup & fixes Avi Kivity
2011-09-02 13:37 ` 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=20110804145826.58167635@doriath \
--to=lcapitulino@redhat.com \
--cc=amit.shah@redhat.com \
--cc=armbru@redhat.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefano.stabellini@eu.citrix.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).