From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, quintela@redhat.com,
stefano.stabellini@eu.citrix.com, lcapitulino@redhat.com,
hare@suse.de, amit.shah@redhat.com, hch@lst.de
Subject: [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable"
Date: Wed, 3 Aug 2011 15:08:14 +0200 [thread overview]
Message-ID: <1312376904-16115-36-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1312376904-16115-1-git-send-email-armbru@redhat.com>
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>
---
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,
};
--
1.7.6
next prev parent reply other threads:[~2011-08-03 13:24 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 ` Markus Armbruster [this message]
2011-08-04 17:58 ` [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable" Luiz Capitulino
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=1312376904-16115-36-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=amit.shah@redhat.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=lcapitulino@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).