[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/6] ISCSI: get device type at connection time
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 4/6] ISCSI: get device type at connection time |
Date: |
Tue, 29 May 2012 11:20:10 +0200 |
From: Ronnie Sahlberg <address@hidden>
This is needed to avoid READ CAPACITY(16) for MMC devices.
Signed-off-by: Ronnie Sahlberg <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
block/iscsi.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index 9cd258f..91cca83 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -29,6 +29,7 @@
#include "qemu-error.h"
#include "block_int.h"
#include "trace.h"
+#include "hw/scsi-defs.h"
#include <iscsi/iscsi.h>
#include <iscsi/scsi-lowlevel.h>
@@ -37,6 +38,7 @@
typedef struct IscsiLun {
struct iscsi_context *iscsi;
int lun;
+ enum scsi_inquiry_peripheral_device_type type;
int block_size;
uint64_t num_blocks;
int events;
@@ -508,18 +510,33 @@ iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int
status,
}
static void
-iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data,
+iscsi_inquiry_cb(struct iscsi_context *iscsi, int status, void *command_data,
void *opaque)
{
struct IscsiTask *itask = opaque;
- struct scsi_task *task;
+ struct scsi_task *task = command_data;
+ struct scsi_inquiry_standard *inq;
if (status != 0) {
itask->status = 1;
itask->complete = 1;
+ scsi_free_scsi_task(task);
return;
}
+ inq = scsi_datain_unmarshall(task);
+ if (inq == NULL) {
+ error_report("iSCSI: Failed to unmarshall inquiry data.");
+ itask->status = 1;
+ itask->complete = 1;
+ scsi_free_scsi_task(task);
+ return;
+ }
+
+ itask->iscsilun->type = inq->periperal_device_type;
+
+ scsi_free_scsi_task(task);
+
task = iscsi_readcapacity16_task(iscsi, itask->iscsilun->lun,
iscsi_readcapacity16_cb, opaque);
if (task == NULL) {
@@ -530,6 +547,30 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status,
void *command_data,
}
}
+static void
+iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data,
+ void *opaque)
+{
+ struct IscsiTask *itask = opaque;
+ struct scsi_task *task;
+
+ if (status != 0) {
+ itask->status = 1;
+ itask->complete = 1;
+ return;
+ }
+
+ task = iscsi_inquiry_task(iscsi, itask->iscsilun->lun,
+ 0, 0, 36,
+ iscsi_inquiry_cb, opaque);
+ if (task == NULL) {
+ error_report("iSCSI: failed to send inquiry command.");
+ itask->status = 1;
+ itask->complete = 1;
+ return;
+ }
+}
+
static int parse_chap(struct iscsi_context *iscsi, const char *target)
{
QemuOptsList *list;
--
1.7.10.1
- [Qemu-devel] [PULL 0/6] updated SCSI changes for 1.1.0-rc4, Paolo Bonzini, 2012/05/29
- [Qemu-devel] [PATCH 2/6] ISCSI: redo how we set up the events, Paolo Bonzini, 2012/05/29
- [Qemu-devel] [PATCH 1/6] scsi: declare vmstate_info_scsi_requests to be static, Paolo Bonzini, 2012/05/29
- [Qemu-devel] [PATCH 3/6] ISCSI: change num_blocks to 64-bit, Paolo Bonzini, 2012/05/29
- [Qemu-devel] [PATCH 4/6] ISCSI: get device type at connection time,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 5/6] ISCSI: Only call READCAPACITY16 for SBC devices, use READCAPACITY10 for MMC, Paolo Bonzini, 2012/05/29
- [Qemu-devel] [PATCH 6/6] ISCSI: Switch to using READ16/WRITE16 for I/O to the LUN, Paolo Bonzini, 2012/05/29
- Re: [Qemu-devel] [PULL 0/6] updated SCSI changes for 1.1.0-rc4, Anthony Liguori, 2012/05/29