[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 30/33] scsi: move max_lba to SCSIDevice
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 30/33] scsi: move max_lba to SCSIDevice |
Date: |
Tue, 25 Oct 2011 12:40:38 +0200 |
The field is only in scsi-disk for now. Moving it up to SCSIDevice makes
it easier to reuse the scsi-generic reqops elsewhere.
At the same time, make scsi-generic get max_lba from snooped READ CAPACITY
commands as well.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-disk.c | 15 +++++++--------
hw/scsi-generic.c | 2 ++
hw/scsi.h | 1 +
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 723fffe..4544f1c 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -66,7 +66,6 @@ struct SCSIDiskState
{
SCSIDevice qdev;
uint32_t removable;
- uint64_t max_lba;
bool media_changed;
bool media_event;
QEMUBH *bh;
@@ -1175,7 +1174,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r)
/* 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;
+ s->qdev.max_lba = nb_sectors;
/* Clip to 2TB, instead of returning capacity modulo 2TB. */
if (nb_sectors > UINT32_MAX) {
nb_sectors = UINT32_MAX;
@@ -1230,7 +1229,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r)
/* 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;
+ s->qdev.max_lba = nb_sectors;
outbuf[0] = (nb_sectors >> 56) & 0xff;
outbuf[1] = (nb_sectors >> 48) & 0xff;
outbuf[2] = (nb_sectors >> 40) & 0xff;
@@ -1345,7 +1344,7 @@ static int32_t scsi_send_command(SCSIRequest *req,
uint8_t *buf)
case READ_16:
len = r->req.cmd.xfer / s->qdev.blocksize;
DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
- if (r->req.cmd.lba > s->max_lba) {
+ if (r->req.cmd.lba > s->qdev.max_lba) {
goto illegal_lba;
}
r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
@@ -1362,7 +1361,7 @@ static int32_t scsi_send_command(SCSIRequest *req,
uint8_t *buf)
DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
(command & 0xe) == 0xe ? "And Verify " : "",
r->req.cmd.lba, len);
- if (r->req.cmd.lba > s->max_lba) {
+ if (r->req.cmd.lba > s->qdev.max_lba) {
goto illegal_lba;
}
r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
@@ -1388,7 +1387,7 @@ static int32_t scsi_send_command(SCSIRequest *req,
uint8_t *buf)
case SEEK_10:
DPRINTF("Seek(%d) (sector %" PRId64 ")\n", command == SEEK_6 ? 6 : 10,
r->req.cmd.lba);
- if (r->req.cmd.lba > s->max_lba) {
+ if (r->req.cmd.lba > s->qdev.max_lba) {
goto illegal_lba;
}
break;
@@ -1398,7 +1397,7 @@ static int32_t scsi_send_command(SCSIRequest *req,
uint8_t *buf)
DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
r->req.cmd.lba, len);
- if (r->req.cmd.lba > s->max_lba) {
+ if (r->req.cmd.lba > s->qdev.max_lba) {
goto illegal_lba;
}
@@ -1457,7 +1456,7 @@ static void scsi_disk_reset(DeviceState *dev)
if (nb_sectors) {
nb_sectors--;
}
- s->max_lba = nb_sectors;
+ s->qdev.max_lba = nb_sectors;
}
static void scsi_destroy(SCSIDevice *dev)
diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
index 9fd1a6d..9e293ee 100644
--- a/hw/scsi-generic.c
+++ b/hw/scsi-generic.c
@@ -174,9 +174,11 @@ static void scsi_read_complete(void * opaque, int ret)
/* Snoop READ CAPACITY output to set the blocksize. */
if (r->req.cmd.buf[0] == READ_CAPACITY_10) {
s->blocksize = ldl_be_p(&r->buf[4]);
+ s->max_lba = ldl_be_p(&r->buf[0]);
} else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 &&
(r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
s->blocksize = ldl_be_p(&r->buf[8]);
+ s->max_lba = ldq_be_p(&r->buf[0]);
}
bdrv_set_buffer_alignment(s->conf.bs, s->blocksize);
diff --git a/hw/scsi.h b/hw/scsi.h
index c8649cf..d56e875 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -70,6 +70,7 @@ struct SCSIDevice
uint32_t lun;
int blocksize;
int type;
+ uint64_t max_lba;
};
/* cdrom.c */
--
1.7.6
- [Qemu-devel] [PATCH v2 06/33] scsi-disk: report media changed via unit attention sense codes, (continued)
- [Qemu-devel] [PATCH v2 06/33] scsi-disk: report media changed via unit attention sense codes, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 09/33] scsi-disk: store valid mode pages in a table, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 08/33] scsi-disk: add stubs for more MMC commands, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 07/33] scsi-disk: fix coding style issues (braces), Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 17/33] scsi: implement REPORT LUNS for arbitrary LUNs, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 13/33] scsi-disk: report media changed via GET EVENT STATUS NOTIFICATION, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 12/33] scsi-disk: support READ DVD STRUCTURE, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 10/33] atapi/scsi-disk: make mode page values coherent between the two, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 32/33] scsi: export scsi_generic_reqops, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 24/33] scsi-generic: check ioctl statuses when SG_IO succeeds, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 30/33] scsi: move max_lba to SCSIDevice,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 22/33] scsi-generic: drop SCSIGenericState, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 11/33] scsi-disk: support DVD profile in GET CONFIGURATION, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 19/33] scsi: add channel to addressing, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 31/33] scsi: make reqops const, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 28/33] scsi-disk: remove cluster_size, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 29/33] scsi-disk: small clean up to INQUIRY, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 20/33] scsi-disk: fail READ CAPACITY if LBA != 0 but PMI == 0, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 23/33] scsi-generic: remove scsi_req_fixup, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 33/33] scsi: pass cdb to alloc_req, Paolo Bonzini, 2011/10/25
- [Qemu-devel] [PATCH v2 27/33] scsi-disk: do not duplicate BlockDriverState member, Paolo Bonzini, 2011/10/25