From aea2a33c73f28ecd8f10b242ecadddcc79c1c28b Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Wed, 27 May 2009 10:06:11 +0100 Subject: 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 Signed-off-by: Anthony Liguori --- block.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'block.c') 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) -- cgit v1.2.3