[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when
From: |
Hannes Reinecke |
Subject: |
Re: [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when it can't eject |
Date: |
Thu, 04 Aug 2011 08:20:21 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.14) Gecko/20110221 SUSE/3.1.8 Thunderbird/3.1.8 |
On 08/03/2011 03:08 PM, Markus Armbruster wrote:
Don't fail when tray is already open.
Signed-off-by: Markus Armbruster<address@hidden>
---
hw/scsi-bus.c | 10 ++++++++++
hw/scsi-disk.c | 15 +++++++++++----
hw/scsi.h | 4 ++++
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 0b0344c..1c5fe7f 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -441,6 +441,11 @@ const struct SCSISense sense_code_NO_MEDIUM = {
.key = NOT_READY, .asc = 0x3a, .ascq = 0x00
};
+/* LUN not ready, medium removal prevented */
+const struct SCSISense sense_code_MEDIUM_REMOVAL_PREVENTED_NR = {
+ .key = NOT_READY, .asc = 0x53, .ascq = 0x00
+};
+
I would prefer to have the naming reversed,
eg NOT_READY_REMOVAL_PREVENTED
/* Hardware error, internal target failure */
const struct SCSISense sense_code_TARGET_FAILURE = {
.key = HARDWARE_ERROR, .asc = 0x44, .ascq = 0x00
@@ -466,6 +471,11 @@ const struct SCSISense sense_code_LUN_NOT_SUPPORTED = {
.key = ILLEGAL_REQUEST, .asc = 0x25, .ascq = 0x00
};
+/* Illegal request, medium removal prevented */
+const struct SCSISense sense_code_MEDIUM_REMOVAL_PREVENTED_ILL = {
+ .key = ILLEGAL_REQUEST, .asc = 0x53, .ascq = 0x00
+};
+
Same here: ILLEGAL_REQ_REMOVAL_PREVENTED
/* Command aborted, I/O process terminated */
const struct SCSISense sense_code_IO_ERROR = {
.key = ABORTED_COMMAND, .asc = 0x00, .ascq = 0x06
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 79d7737..19a1843 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -828,7 +828,7 @@ static int scsi_disk_emulate_read_toc(SCSIRequest *req,
uint8_t *outbuf)
return toclen;
}
-static void scsi_disk_emulate_start_stop(SCSIDiskReq *r)
+static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
{
SCSIRequest *req =&r->req;
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
@@ -836,12 +836,17 @@ static void scsi_disk_emulate_start_stop(SCSIDiskReq *r)
bool loej = req->cmd.buf[4]& 2;
if (s->qdev.type == TYPE_ROM&& loej) {
- if (!start&& s->tray_locked) {
- return;
+ if (!start&& !s->tray_open&& s->tray_locked) {
+ scsi_command_complete(r, CHECK_CONDITION,
+ bdrv_is_inserted(s->bs)
+ ? SENSE_CODE(MEDIUM_REMOVAL_PREVENTED_ILL)
+ : SENSE_CODE(MEDIUM_REMOVAL_PREVENTED_NR));
+ return -1;
}
bdrv_eject(s->bs, !start);
s->tray_open = !start;
}
+ return 0;
}
static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
@@ -897,7 +902,9 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r,
uint8_t *outbuf)
goto illegal_request;
break;
case START_STOP:
- scsi_disk_emulate_start_stop(r);
+ if (scsi_disk_emulate_start_stop(r)< 0) {
+ return -1;
+ }
break;
case ALLOW_MEDIUM_REMOVAL:
s->tray_locked = req->cmd.buf[4]& 1;
diff --git a/hw/scsi.h b/hw/scsi.h
index 6b15bbc..63442c6 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -118,6 +118,8 @@ extern const struct SCSISense sense_code_NO_SENSE;
extern const struct SCSISense sense_code_LUN_NOT_READY;
/* LUN not ready, Medium not present */
extern const struct SCSISense sense_code_NO_MEDIUM;
+/* LUN not readt, medium removal prevented */
+extern const struct SCSISense sense_code_MEDIUM_REMOVAL_PREVENTED_NR;
LUN not ready.
Naming see above.
/* Hardware error, internal target failure */
extern const struct SCSISense sense_code_TARGET_FAILURE;
/* Illegal request, invalid command operation code */
@@ -128,6 +130,8 @@ extern const struct SCSISense sense_code_LBA_OUT_OF_RANGE;
extern const struct SCSISense sense_code_INVALID_FIELD;
/* Illegal request, LUN not supported */
extern const struct SCSISense sense_code_LUN_NOT_SUPPORTED;
+/* Illegal request, medium removal prevented */
+extern const struct SCSISense sense_code_MEDIUM_REMOVAL_PREVENTED_ILL;
See above.
/* Command aborted, I/O process terminated */
extern const struct SCSISense sense_code_IO_ERROR;
/* Command aborted, I_T Nexus loss occurred */
Other than that it's okay.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
address@hidden +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
- [Qemu-devel] [PATCH v2 38/45] block: Move BlockConf & friends from block_int.h to block.h, (continued)
- [Qemu-devel] [PATCH v2 38/45] block: Move BlockConf & friends from block_int.h to block.h, Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 43/45] nbd: Clean up use of block_int.h, Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 31/45] block: Clean up bdrv_flush_all(), Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 17/45] block: Leave enforcing tray lock to device models, Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 18/45] block: Drop medium lock tracking, ask device models instead, Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 35/45] block: Clean up remaining users of "removable", Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 37/45] block: Show whether the guest ejected the medium in info block, Markus Armbruster, 2011/08/03
- [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when it can't eject, Markus Armbruster, 2011/08/03
- Re: [Qemu-devel] [PATCH v2 23/45] scsi-disk: Fix START_STOP to fail when it can't eject,
Hannes Reinecke <=
- [Qemu-devel] [PATCH v2 40/45] block: Declare qemu_blockalign() in block.h, not block_int.h, Markus Armbruster, 2011/08/03
- Re: [Qemu-devel] [PATCH v2 00/45] Block layer cleanup & fixes, Avi Kivity, 2011/08/04