[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 23/30] scsi-disk: restruct emulation: READ_CAPACITY
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 23/30] scsi-disk: restruct emulation: READ_CAPACITY |
Date: |
Thu, 26 Nov 2009 15:34:09 +0100 |
Move READ_CAPACITY emulation from scsi_send_command() to
scsi_disk_emulate_command().
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/scsi-disk.c | 55 +++++++++++++++++++++++++++----------------------------
1 files changed, 27 insertions(+), 28 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 7d59998..4f56a22 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -617,7 +617,9 @@ static int scsi_disk_emulate_mode_sense(SCSIRequest *req,
uint8_t *outbuf)
static int scsi_disk_emulate_command(SCSIRequest *req, uint8_t *outbuf)
{
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
BlockDriverState *bdrv = req->dev->dinfo->bdrv;
+ uint64_t nb_sectors;
int buflen = 0;
switch (req->cmd.buf[0]) {
@@ -679,6 +681,30 @@ static int scsi_disk_emulate_command(SCSIRequest *req,
uint8_t *outbuf)
case ALLOW_MEDIUM_REMOVAL:
bdrv_set_locked(bdrv, req->cmd.buf[4] & 1);
break;
+ case READ_CAPACITY:
+ /* The normal LEN field for this command is zero. */
+ memset(outbuf, 0, 8);
+ bdrv_get_geometry(bdrv, &nb_sectors);
+ if (!nb_sectors)
+ goto not_ready;
+ nb_sectors /= s->cluster_size;
+ /* Returned value is the address of the last sector. */
+ nb_sectors--;
+ /* Remember the new size for read/write sanity checking. */
+ s->max_lba = nb_sectors;
+ /* Clip to 2TB, instead of returning capacity modulo 2TB. */
+ if (nb_sectors > UINT32_MAX)
+ nb_sectors = UINT32_MAX;
+ outbuf[0] = (nb_sectors >> 24) & 0xff;
+ outbuf[1] = (nb_sectors >> 16) & 0xff;
+ outbuf[2] = (nb_sectors >> 8) & 0xff;
+ outbuf[3] = nb_sectors & 0xff;
+ outbuf[4] = 0;
+ outbuf[5] = 0;
+ outbuf[6] = s->cluster_size * 2;
+ outbuf[7] = 0;
+ buflen = 8;
+ break;
default:
goto illegal_request;
}
@@ -792,6 +818,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t
tag,
case RELEASE_10:
case START_STOP:
case ALLOW_MEDIUM_REMOVAL:
+ case READ_CAPACITY:
rc = scsi_disk_emulate_command(&r->req, outbuf);
if (rc > 0) {
r->iov.iov_len = rc;
@@ -801,34 +828,6 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t
tag,
return 0;
}
break;
- case READ_CAPACITY:
- DPRINTF("Read Capacity\n");
- /* The normal LEN field for this command is zero. */
- memset(outbuf, 0, 8);
- bdrv_get_geometry(s->qdev.dinfo->bdrv, &nb_sectors);
- nb_sectors /= s->cluster_size;
- /* Returned value is the address of the last sector. */
- if (nb_sectors) {
- nb_sectors--;
- /* Remember the new size for read/write sanity checking. */
- s->max_lba = nb_sectors;
- /* Clip to 2TB, instead of returning capacity modulo 2TB. */
- if (nb_sectors > UINT32_MAX)
- nb_sectors = UINT32_MAX;
- outbuf[0] = (nb_sectors >> 24) & 0xff;
- outbuf[1] = (nb_sectors >> 16) & 0xff;
- outbuf[2] = (nb_sectors >> 8) & 0xff;
- outbuf[3] = nb_sectors & 0xff;
- outbuf[4] = 0;
- outbuf[5] = 0;
- outbuf[6] = s->cluster_size * 2;
- outbuf[7] = 0;
- r->iov.iov_len = 8;
- } else {
- scsi_command_complete(r, CHECK_CONDITION, NOT_READY);
- return 0;
- }
- break;
case READ_6:
case READ_10:
case 0x88:
--
1.6.2.5
- [Qemu-devel] [PATCH 15/30] scsi: add scsi_req_print(), (continued)
- [Qemu-devel] [PATCH 15/30] scsi: add scsi_req_print(), Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 19/30] scsi-disk: restruct emulation: RESERVE+RELEASE, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 27/30] scsi-disk: restruct emulation: SERVICE_ACTION_IN, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 18/30] scsi-disk: restruct emulation: INQUIRY, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 21/30] scsi-disk: restruct emulation: START_STOP, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 26/30] scsi-disk: restruct emulation: GET_CONFIGURATION, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 30/30] scsi: add read/write 16 commands., Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 16/30] scsi-disk: restruct emulation: core + TEST_UNIT_READY., Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 22/30] scsi-disk: restruct emulation: ALLOW_MEDIUM_REMOVAL, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 28/30] scsi-disk: restruct emulation: REPORT_LUNS, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 23/30] scsi-disk: restruct emulation: READ_CAPACITY,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 25/30] scsi-disk: restruct emulation: READ_TOC, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 20/30] scsi-disk: restruct emulation: MODE_SENSE, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 29/30] scsi-disk: restruct emulation: VERIFY, Gerd Hoffmann, 2009/11/26
- [Qemu-devel] [PATCH 24/30] scsi-disk: restruct emulation: SYNCHRONIZE_CACHE, Gerd Hoffmann, 2009/11/26