summaryrefslogtreecommitdiff
path: root/block.c
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2009-05-27 10:06:11 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-16 15:52:37 -0500
commitaea2a33c73f28ecd8f10b242ecadddcc79c1c28b (patch)
treeca6c9a834af6603744cb10af6f88c8c95669969f /block.c
parent2ea42952ee131b90c5286203d5d38deb66d32aec (diff)
downloadqemu-aea2a33c73f28ecd8f10b242ecadddcc79c1c28b.tar.gz
Prevent CD-ROM media eject while device is locked
Section 10.8.25 ("START/STOP UNIT Command") of SFF-8020i states that if the device is locked we should refuse to eject if the device is locked. ASC_MEDIA_REMOVAL_PREVENTED is the appropriate return in this case. In order to stop itself from ejecting the media it is running from, Fedora's installer (anaconda) requires the CDROMEJECT ioctl() to fail if the drive has been previously locked. See also https://bugzilla.redhat.com/501412 Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block.c')
-rw-r--r--block.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/block.c b/block.c
index ad5ee7a170..aca5a6d282 100644
--- a/block.c
+++ b/block.c
@@ -1566,11 +1566,15 @@ int bdrv_media_changed(BlockDriverState *bs)
/**
* If eject_flag is TRUE, eject the media. Otherwise, close the tray
*/
-void bdrv_eject(BlockDriverState *bs, int eject_flag)
+int bdrv_eject(BlockDriverState *bs, int eject_flag)
{
BlockDriver *drv = bs->drv;
int ret;
+ if (bs->locked) {
+ return -EBUSY;
+ }
+
if (!drv || !drv->bdrv_eject) {
ret = -ENOTSUP;
} else {
@@ -1579,7 +1583,10 @@ void bdrv_eject(BlockDriverState *bs, int eject_flag)
if (ret == -ENOTSUP) {
if (eject_flag)
bdrv_close(bs);
+ ret = 0;
}
+
+ return ret;
}
int bdrv_is_locked(BlockDriverState *bs)