http://git.et.redhat.com/?p=qemu-fedora.git Update the current patches with ones produced using format-patch, no real changes here. Drop a couple of patches which aren't referenced in the spec file
124 lines
3.8 KiB
Diff
124 lines
3.8 KiB
Diff
From 1941d978942be058aab8df4fafe3a5a444ee17c8 Mon Sep 17 00:00:00 2001
|
|
From: Mark McLoughlin <markmc@redhat.com>
|
|
Date: Wed, 27 May 2009 10:06:11 +0100
|
|
Subject: [PATCH 16/18] 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
|
|
|
|
(cherry picked from commit aea2a33c73f28ecd8f10b242ecadddcc79c1c28b)
|
|
|
|
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
|
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
|
|
---
|
|
block.c | 9 ++++++++-
|
|
block.h | 2 +-
|
|
hw/ide.c | 26 ++++++++++++++++++--------
|
|
3 files changed, 27 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/block.c b/block.c
|
|
index 9a2873f..863897a 100644
|
|
--- a/block.c
|
|
+++ b/block.c
|
|
@@ -1673,11 +1673,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 {
|
|
@@ -1686,7 +1690,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)
|
|
diff --git a/block.h b/block.h
|
|
index 979781a..e1070e9 100644
|
|
--- a/block.h
|
|
+++ b/block.h
|
|
@@ -132,7 +132,7 @@ int bdrv_is_inserted(BlockDriverState *bs);
|
|
int bdrv_media_changed(BlockDriverState *bs);
|
|
int bdrv_is_locked(BlockDriverState *bs);
|
|
void bdrv_set_locked(BlockDriverState *bs, int locked);
|
|
-void bdrv_eject(BlockDriverState *bs, int eject_flag);
|
|
+int bdrv_eject(BlockDriverState *bs, int eject_flag);
|
|
void bdrv_set_change_cb(BlockDriverState *bs,
|
|
void (*change_cb)(void *opaque), void *opaque);
|
|
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
|
|
diff --git a/hw/ide.c b/hw/ide.c
|
|
index 6ad1d08..9b93e7f 100644
|
|
--- a/hw/ide.c
|
|
+++ b/hw/ide.c
|
|
@@ -359,6 +359,7 @@
|
|
#define ASC_INCOMPATIBLE_FORMAT 0x30
|
|
#define ASC_MEDIUM_NOT_PRESENT 0x3a
|
|
#define ASC_SAVING_PARAMETERS_NOT_SUPPORTED 0x39
|
|
+#define ASC_MEDIA_REMOVAL_PREVENTED 0x53
|
|
|
|
#define CFA_NO_ERROR 0x00
|
|
#define CFA_MISC_ERROR 0x09
|
|
@@ -1818,18 +1819,27 @@ static void ide_atapi_cmd(IDEState *s)
|
|
break;
|
|
case GPCMD_START_STOP_UNIT:
|
|
{
|
|
- int start, eject;
|
|
+ int start, eject, err = 0;
|
|
start = packet[4] & 1;
|
|
eject = (packet[4] >> 1) & 1;
|
|
|
|
- if (eject && !start) {
|
|
- /* eject the disk */
|
|
- bdrv_eject(s->bs, 1);
|
|
- } else if (eject && start) {
|
|
- /* close the tray */
|
|
- bdrv_eject(s->bs, 0);
|
|
+ if (eject) {
|
|
+ err = bdrv_eject(s->bs, !start);
|
|
+ }
|
|
+
|
|
+ switch (err) {
|
|
+ case 0:
|
|
+ ide_atapi_cmd_ok(s);
|
|
+ break;
|
|
+ case -EBUSY:
|
|
+ ide_atapi_cmd_error(s, SENSE_NOT_READY,
|
|
+ ASC_MEDIA_REMOVAL_PREVENTED);
|
|
+ break;
|
|
+ default:
|
|
+ ide_atapi_cmd_error(s, SENSE_NOT_READY,
|
|
+ ASC_MEDIUM_NOT_PRESENT);
|
|
+ break;
|
|
}
|
|
- ide_atapi_cmd_ok(s);
|
|
}
|
|
break;
|
|
case GPCMD_MECHANISM_STATUS:
|
|
--
|
|
1.6.2.2
|
|
|