qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, stefano.stabellini@eu.citrix.com,
	dbaryshkov@gmail.com, quintela@redhat.com, qemu-devel@nongnu.org,
	amit.shah@redhat.com
Subject: Re: [Qemu-devel] [PATCH 45/55] block: Clean up remaining users of "removable"
Date: Thu, 21 Jul 2011 14:33:36 -0300	[thread overview]
Message-ID: <20110721143336.4275b5f6@doriath> (raw)
In-Reply-To: <1311179069-27882-46-git-send-email-armbru@redhat.com>

On Wed, 20 Jul 2011 18:24:19 +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 9591c8a..b394f17 100644
> --- a/block.c
> +++ b/block.c
> @@ -750,6 +750,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)
> @@ -759,6 +762,11 @@ static void bdrv_dev_change_media_cb(BlockDriverState *bs)
>      }
>  }
>  
> +int bdrv_dev_has_removable_media(BlockDriverState *bs)
> +{
> +    return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb);
> +}
> +
>  bool bdrv_dev_is_medium_ejected(BlockDriverState *bs)
>  {
>      if (bs->dev_ops && bs->dev_ops->is_medium_ejected) {
> @@ -1198,7 +1206,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);
>          }
> @@ -1483,11 +1491,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;
> @@ -1765,7 +1768,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));
>          bs_dict = qobject_to_qdict(bs_obj);
>  
> diff --git a/block.h b/block.h
> index b034d51..f6fa3d0 100644
> --- a/block.h
> +++ b/block.h
> @@ -33,6 +33,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);
>      /*
> @@ -102,6 +103,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);
> +int bdrv_dev_has_removable_media(BlockDriverState *bs);
>  bool bdrv_dev_is_medium_ejected(BlockDriverState *bs);
>  int bdrv_dev_is_medium_locked(BlockDriverState *bs);
>  int bdrv_read(BlockDriverState *bs, int64_t sector_num,
> @@ -207,7 +209,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 4c58128..06a82d3 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 ad63814..ae194c5 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -1276,6 +1276,10 @@ 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_ejected(void *opaque)
>  {
>      return ((SCSIDiskState *)opaque)->tray_open;
> @@ -1287,6 +1291,7 @@ static bool scsi_cd_is_medium_locked(void *opaque)
>  }
>  
>  static const BlockDevOps scsi_cd_block_ops = {
> +    .change_media_cb = scsi_cd_change_media_cb,
>      .is_medium_ejected = scsi_cd_is_medium_ejected,
>      .is_medium_locked = scsi_cd_is_medium_locked,
>  };

  reply	other threads:[~2011-07-21 17:33 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-20 16:23 [Qemu-devel] [PATCH 00/55] Block layer cleanup & fixes Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 01/55] blockdev: Make eject fail for non-removable drives even with -f Markus Armbruster
2011-07-25 12:27   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 02/55] block: Reset device model callbacks on detach Markus Armbruster
2011-07-25 12:27   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 03/55] block: Attach non-qdev devices as well Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 04/55] block: Generalize change_cb() to BlockDevOps Markus Armbruster
2011-07-25 12:30   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 05/55] block: Split change_cb() into change_media_cb(), resize_cb() Markus Armbruster
2011-07-25 12:31   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 06/55] block/raw-win32: Drop disabled code for removable host devices Markus Armbruster
2011-07-25 12:32   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 07/55] block: Make BlockDriver method bdrv_set_locked() return void Markus Armbruster
     [not found]   ` <20110721111134.787a83af@doriath>
2011-07-21 15:07     ` Markus Armbruster
2011-07-21 16:34       ` Luiz Capitulino
2011-07-22 14:36       ` Kevin Wolf
2011-07-20 16:23 ` [Qemu-devel] [PATCH 08/55] block: Make BlockDriver method bdrv_eject() " Markus Armbruster
2011-07-22 14:41   ` Kevin Wolf
2011-07-22 15:04     ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 09/55] block: Don't let locked flag prevent medium load Markus Armbruster
2011-07-22 14:51   ` Kevin Wolf
2011-07-22 15:33     ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 10/55] ide: Update command code definitions as per ACS-2 Table B.2 Markus Armbruster
2011-07-25 12:34   ` Christoph Hellwig
2011-07-25 17:15     ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 11/55] ide: Clean up case label indentation in ide_exec_cmd() Markus Armbruster
2011-07-25 12:34   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 12/55] ide: Fix ATA command READ to set ATAPI signature for CD-ROM Markus Armbruster
2011-07-26 11:57   ` Christoph Hellwig
2011-07-26 13:33     ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 13/55] ide: Use a table to declare which drive kinds accept each command Markus Armbruster
2011-07-26 11:58   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 14/55] ide: Reject ATA commands specific to drive kinds Markus Armbruster
2011-07-26 11:58   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 15/55] ide/atapi: Clean up misleading name in cmd_start_stop_unit() Markus Armbruster
2011-07-26 11:59   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 16/55] ide/atapi: Track tray open/close state Markus Armbruster
2011-07-26 11:59   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 17/55] ide/atapi: Switch from BlockDriverState's tray_open to own Markus Armbruster
2011-07-26 12:00   ` Christoph Hellwig
2011-07-26 13:36     ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 18/55] scsi-disk: Reject CD-specific SCSI commands to disks Markus Armbruster
2011-07-26 12:02   ` Christoph Hellwig
2011-07-26 13:36     ` Markus Armbruster
2011-07-29  8:41       ` Markus Armbruster
2011-07-20 16:23 ` [Qemu-devel] [PATCH 19/55] scsi-disk: Factor out scsi_disk_emulate_start_stop() Markus Armbruster
2011-07-26 12:03   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 20/55] scsi-disk: Track tray open/close state Markus Armbruster
2011-07-26 12:03   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 21/55] block: Revert entanglement of bdrv_is_inserted() with tray status Markus Armbruster
2011-07-26 12:10   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 22/55] block: Drop tray status tracking, no longer used Markus Armbruster
2011-07-26 12:11   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 23/55] block: Show whether the guest ejected the medium in info block Markus Armbruster
     [not found]   ` <20110721112232.28405a1c@doriath>
2011-07-21 15:08     ` Markus Armbruster
2011-07-21 16:38       ` Luiz Capitulino
2011-07-21 17:30         ` Luiz Capitulino
2011-07-20 16:23 ` [Qemu-devel] [PATCH 24/55] ide/atapi: Track tray locked state Markus Armbruster
2011-07-26 12:13   ` Christoph Hellwig
2011-07-20 16:23 ` [Qemu-devel] [PATCH 25/55] ide/atapi: Switch from BlockDriverState's locked to own tray_locked Markus Armbruster
2011-07-26 12:14   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 26/55] scsi-disk: Track tray locked state Markus Armbruster
2011-07-26 12:14   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 27/55] scsi-disk: Switch from BlockDriverState's locked to own tray_locked Markus Armbruster
2011-07-26 12:14   ` Christoph Hellwig
2011-07-26 13:38     ` Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 28/55] block: Leave enforcing tray lock to device models Markus Armbruster
     [not found]   ` <20110721113051.4ea99b04@doriath>
2011-07-21 15:16     ` Markus Armbruster
2011-07-21 16:40       ` Luiz Capitulino
2011-07-20 16:24 ` [Qemu-devel] [PATCH 29/55] block: Drop medium lock tracking, ask device models instead Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 30/55] block: Rename bdrv_set_locked() to bdrv_lock_medium() Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 31/55] ide: Provide IDEDeviceInfo method exit() Markus Armbruster
2011-07-26 12:16   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 32/55] ide/atapi: Don't fail eject when tray is already open Markus Armbruster
2011-07-26 12:16   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 33/55] ide/atapi: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-07-26 12:17   ` Christoph Hellwig
2011-07-26 13:43     ` Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 34/55] scsi-disk: Fix START_STOP to fail when it can't eject Markus Armbruster
2011-07-26 12:17   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 35/55] scsi-disk: Avoid physical/virtual tray state mismatch Markus Armbruster
2011-07-26 12:17   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 36/55] ide: Give vmstate structs internal linkage where possible Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 37/55] ide/atapi: Preserve tray state on migration Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 38/55] scsi-disk: " Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 39/55] block/raw: Fix to forward method bdrv_media_changed() Markus Armbruster
2011-07-26 12:18   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 40/55] block: Leave tracking media change to device models Markus Armbruster
2011-07-26 12:19   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 41/55] fdc: Make media change detection more robust Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 42/55] block: Clean up bdrv_flush_all() Markus Armbruster
2011-07-26 12:19   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 43/55] savevm: Include writable devices with removable media Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 44/55] spitz tosa: Simplify "drive is suitable for microdrive" test Markus Armbruster
2011-07-30  2:24   ` andrzej zaborowski
2011-08-01 12:33     ` Markus Armbruster
2011-08-01 13:04       ` Peter Maydell
2011-08-03  8:12         ` Markus Armbruster
2011-08-03 12:05           ` andrzej zaborowski
2011-08-03 13:28             ` Markus Armbruster
2011-08-03 13:37               ` andrzej zaborowski
2011-08-03 16:38                 ` Markus Armbruster
2011-08-03 17:26                   ` andrzej zaborowski
2011-08-03 18:24                     ` Markus Armbruster
2011-08-03 20:20                       ` andrzej zaborowski
2011-08-04  8:02                         ` Kevin Wolf
2011-08-09  4:32                           ` andrzej zaborowski
2011-08-09  7:32                             ` Kevin Wolf
2011-08-09 11:56                               ` Markus Armbruster
2011-08-09 12:10                                 ` Kevin Wolf
2011-08-09 12:36                                   ` Markus Armbruster
2011-08-09 12:46                                     ` Kevin Wolf
2011-08-04  9:36                         ` Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 45/55] block: Clean up remaining users of "removable" Markus Armbruster
2011-07-21 17:33   ` Luiz Capitulino [this message]
2011-07-26 13:03   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 46/55] block: Drop BlockDriverState member removable Markus Armbruster
2011-07-26 13:03   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 47/55] block: Move BlockConf & friends from block_int.h to block.h Markus Armbruster
2011-07-26 13:04   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 48/55] hw: Trim superfluous #include "block_int.h" Markus Armbruster
2011-07-26 13:04   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 49/55] block: Declare qemu_blockalign() in block.h, not block_int.h Markus Armbruster
2011-07-26 13:05   ` Christoph Hellwig
2011-07-26 14:10     ` Markus Armbruster
2011-07-29  8:56     ` Markus Armbruster
2011-07-29 13:11       ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 50/55] block: New bdrv_set_buffer_alignment() Markus Armbruster
2011-07-26 13:06   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 51/55] block: Reset buffer alignment on detach Markus Armbruster
2011-07-26 13:06   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 52/55] block: Move BlockDriverAIOCB & friends from block_int.h to block.h Markus Armbruster
2011-07-26 13:07   ` Christoph Hellwig
2011-07-26 14:11     ` Markus Armbruster
2011-07-20 16:24 ` [Qemu-devel] [PATCH 53/55] nbd: Clean up use of block_int.h Markus Armbruster
2011-07-26 13:07   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 54/55] block: New change_media_cb() parameter load Markus Armbruster
2011-07-26 13:08   ` Christoph Hellwig
2011-07-20 16:24 ` [Qemu-devel] [PATCH 55/55] ide/atapi scsi-disk: Make monitor eject -f, then change work Markus Armbruster
2011-07-26 13:08   ` Christoph Hellwig
2011-07-23  3:15 ` [Qemu-devel] [PATCH 00/55] Block layer cleanup & fixes Amit Shah
2011-07-25 15:33   ` Markus Armbruster
2011-07-26  5:33     ` Amit Shah
2011-07-28  8:12 ` Kevin Wolf
2011-07-28  9:34 ` Amit Shah

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=20110721143336.4275b5f6@doriath \
    --to=lcapitulino@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dbaryshkov@gmail.com \
    --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).