[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/12] scsi-disk: report media changed via unit atte
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 06/12] scsi-disk: report media changed via unit attention sense codes |
Date: |
Tue, 20 Sep 2011 17:26:40 +0200 |
Building on the previous patch, this one adds a media change callback
to scsi-disk.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-bus.c | 5 +++++
hw/scsi-disk.c | 29 ++++++++++++++++++++++++++++-
hw/scsi.h | 2 ++
3 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index c190509..867b1a8 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -847,6 +847,11 @@ const struct SCSISense sense_code_RESET = {
.key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x00
};
+/* Unit attention, No medium */
+const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM = {
+ .key = UNIT_ATTENTION, .asc = 0x3a, .ascq = 0x00
+};
+
/* Unit attention, Medium may have changed */
const struct SCSISense sense_code_MEDIUM_CHANGED = {
.key = UNIT_ATTENTION, .asc = 0x28, .ascq = 0x00
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index b5447af..5052a63 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -71,6 +71,7 @@ struct SCSIDiskState
int cluster_size;
uint32_t removable;
uint64_t max_lba;
+ bool media_changed;
QEMUBH *bh;
char *version;
char *serial;
@@ -1197,7 +1198,18 @@ static void scsi_destroy(SCSIDevice *dev)
static void scsi_cd_change_media_cb(void *opaque, bool load)
{
- ((SCSIDiskState *)opaque)->tray_open = !load;
+ SCSIDiskState *s = opaque;
+
+ /*
+ * When a CD gets changed, we have to report an ejected state and
+ * then a loaded state to guests so that they detect tray
+ * open/close and media change events. Guests that do not use
+ * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
+ * states rely on this behavior.
+ */
+ s->media_changed = load;
+ s->tray_open = !load;
+ s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
}
static bool scsi_cd_is_tray_open(void *opaque)
@@ -1216,6 +1231,15 @@ static const BlockDevOps scsi_cd_block_ops = {
.is_medium_locked = scsi_cd_is_medium_locked,
};
+static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
+{
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
+ if (s->media_changed) {
+ s->media_changed = false;
+ s->qdev.unit_attention = SENSE_CODE(MEDIUM_CHANGED);
+ }
+}
+
static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
@@ -1327,6 +1351,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.init = scsi_hd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
+ .unit_attention_reported = scsi_disk_unit_attention_reported,
.qdev.props = (Property[]) {
DEFINE_SCSI_DISK_PROPERTIES(),
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
@@ -1341,6 +1366,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.init = scsi_cd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
+ .unit_attention_reported = scsi_disk_unit_attention_reported,
.qdev.props = (Property[]) {
DEFINE_SCSI_DISK_PROPERTIES(),
DEFINE_PROP_END_OF_LIST(),
@@ -1354,6 +1380,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.init = scsi_disk_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
+ .unit_attention_reported = scsi_disk_unit_attention_reported,
.qdev.props = (Property[]) {
DEFINE_SCSI_DISK_PROPERTIES(),
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
diff --git a/hw/scsi.h b/hw/scsi.h
index 6d40b8e..7004aaa 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -161,6 +161,8 @@ extern const struct SCSISense sense_code_IO_ERROR;
extern const struct SCSISense sense_code_I_T_NEXUS_LOSS;
/* Command aborted, Logical Unit failure */
extern const struct SCSISense sense_code_LUN_FAILURE;
+/* LUN not ready, Medium not present */
+extern const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM;
/* Unit attention, Power on, reset or bus device reset occurred */
extern const struct SCSISense sense_code_RESET;
/* Unit attention, Medium may have changed*/
--
1.7.6
- [Qemu-devel] [PATCH 00/12] scsi-disk: Add DVD-ROM support and media change + atapi: nitpicking, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 04/12] atapi: fill in AUDIO_CTL page correctly, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 06/12] scsi-disk: report media changed via unit attention sense codes,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 01/12] scsi: pass correct sense code for ENOMEDIUM, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 07/12] scsi-disk: add stubs for more MMC commands, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 03/12] atapi: move GESN definitions to scsi-defs.h, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 09/12] atapi/scsi-disk: make mode page values coherent between the two, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 08/12] scsi-disk: store valid mode pages in a table, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 05/12] scsi: notify the device when unit attention is reported, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 02/12] atapi/scsi: unify definitions for MMC, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 12/12] scsi-disk: report media changed via GET EVENT STATUS NOTIFICATION, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 11/12] scsi-disk: support READ DVD STRUCTURE, Paolo Bonzini, 2011/09/20
- [Qemu-devel] [PATCH 10/12] scsi-disk: support DVD profile in GET CONFIGURATION, Paolo Bonzini, 2011/09/20