[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/10] scsi-disk: small clean up to INQUIRY
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 06/10] scsi-disk: small clean up to INQUIRY |
Date: |
Wed, 12 Oct 2011 16:24:07 +0200 |
Set s->removable, s->qdev.blocksize and s->qdev.type in the callers
of scsi_initfn.
With this in place, s->qdev.type is allowed, and we can just reuse it
as the first byte in VPD data (just like we do in standard INQUIRY data).
Also set s->removable is set consistently and we can use it.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-disk.c | 46 +++++++++++++++++++++-------------------------
1 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 5e3ef51..a4daa29 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -397,11 +397,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req,
uint8_t *outbuf)
return -1;
}
- if (s->qdev.type == TYPE_ROM) {
- outbuf[buflen++] = 5;
- } else {
- outbuf[buflen++] = 0;
- }
+ outbuf[buflen++] = s->qdev.type & 0x1f;
outbuf[buflen++] = page_code ; // this page
outbuf[buflen++] = 0x00;
@@ -541,11 +537,10 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req,
uint8_t *outbuf)
memset(outbuf, 0, buflen);
outbuf[0] = s->qdev.type & 0x1f;
+ outbuf[1] = s->removable ? 0x80 : 0;
if (s->qdev.type == TYPE_ROM) {
- outbuf[1] = 0x80;
memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
} else {
- outbuf[1] = s->removable ? 0x80 : 0;
memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
}
memcpy(&outbuf[8], "QEMU ", 8);
@@ -1511,7 +1506,7 @@ static void scsi_disk_unit_attention_reported(SCSIDevice
*dev)
}
}
-static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type)
+static int scsi_initfn(SCSIDevice *dev)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
DriveInfo *dinfo;
@@ -1521,7 +1516,7 @@ static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type)
return -1;
}
- if (scsi_type == TYPE_DISK && !bdrv_is_inserted(s->qdev.conf.bs)) {
+ if (!s->removable && !bdrv_is_inserted(s->qdev.conf.bs)) {
error_report("Device needs media, but drive is empty");
return -1;
}
@@ -1543,19 +1538,12 @@ static int scsi_initfn(SCSIDevice *dev, uint8_t
scsi_type)
return -1;
}
- if (scsi_type == TYPE_ROM) {
+ if (s->removable) {
bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_cd_block_ops, s);
- s->qdev.blocksize = 2048;
- } else if (scsi_type == TYPE_DISK) {
- s->qdev.blocksize = s->qdev.conf.logical_block_size;
- } else {
- error_report("scsi-disk: Unhandled SCSI type %02x", scsi_type);
- return -1;
}
s->cluster_size = s->qdev.blocksize / 512;
bdrv_set_buffer_alignment(s->qdev.conf.bs, s->qdev.blocksize);
- s->qdev.type = scsi_type;
qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
bdrv_iostatus_enable(s->qdev.conf.bs);
add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, ",0");
@@ -1564,27 +1552,35 @@ static int scsi_initfn(SCSIDevice *dev, uint8_t
scsi_type)
static int scsi_hd_initfn(SCSIDevice *dev)
{
- return scsi_initfn(dev, TYPE_DISK);
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
+ s->qdev.blocksize = s->qdev.conf.logical_block_size;
+ s->qdev.type = TYPE_DISK;
+ return scsi_initfn(&s->qdev);
}
static int scsi_cd_initfn(SCSIDevice *dev)
{
- return scsi_initfn(dev, TYPE_ROM);
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
+ s->qdev.blocksize = 2048;
+ s->qdev.type = TYPE_ROM;
+ s->removable = true;
+ return scsi_initfn(&s->qdev);
}
static int scsi_disk_initfn(SCSIDevice *dev)
{
DriveInfo *dinfo;
- uint8_t scsi_type;
if (!dev->conf.bs) {
- scsi_type = TYPE_DISK; /* will die in scsi_initfn() */
- } else {
- dinfo = drive_get_by_blockdev(dev->conf.bs);
- scsi_type = dinfo->media_cd ? TYPE_ROM : TYPE_DISK;
+ return scsi_initfn(dev); /* ... and die there */
}
- return scsi_initfn(dev, scsi_type);
+ dinfo = drive_get_by_blockdev(dev->conf.bs);
+ if (dinfo->media_cd) {
+ return scsi_cd_initfn(dev);
+ } else {
+ return scsi_hd_initfn(dev);
+ }
}
static SCSIReqOps scsi_disk_reqops = {
--
1.7.6
- [Qemu-devel] [PATCH 00/10] scsi: add specialized block device passthrough, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 03/10] scsi-generic: check ioctl statuses when SG_IO succeeds, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 02/10] scsi-generic: remove scsi_req_fixup, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 05/10] scsi-disk: do not duplicate BlockDriverState member, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 07/10] scsi: make reqops const, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 01/10] scsi-generic: drop SCSIGenericState, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 06/10] scsi-disk: small clean up to INQUIRY,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 08/10] scsi: export scsi_generic_reqops, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 09/10] scsi: pass cdb to alloc_req, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 04/10] scsi-generic: look at host status, Paolo Bonzini, 2011/10/12
- [Qemu-devel] [PATCH 10/10] scsi-disk: add scsi-block for device passthrough, Paolo Bonzini, 2011/10/12