[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 05/17] scsi: Remove 'lun' argument
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 05/17] scsi: Remove 'lun' argument |
Date: |
Wed, 29 Oct 2014 10:07:13 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 |
On 10/29/2014 08:53 AM, Hannes Reinecke wrote:
> All scsi functions take a scsi device as argument, which has
> a LUN assigned to it. So we can get rid of specifying the 'lun'
> as separate argument.
... except if you are sending a command to a non-existent LUN, in which
case scsi_req_new detects this and redirects to a special SCSIReqOps
instance:
... else if (lun != d->lun ||
buf[0] == REPORT_LUNS ||
(buf[0] == REQUEST_SENSE && d->sense_len)) {
ops = &reqops_target_command;
} else {
ops = NULL;
}
Yes, it's ugly. If you have a better idea, I'm all ears. Passing a
NULL SCSIDevice is hard though.
Paolo
> Signed-off-by: Hannes Reinecke <address@hidden>
> ---
> hw/scsi/esp.c | 2 +-
> hw/scsi/lsi53c895a.c | 3 +--
> hw/scsi/megasas.c | 44 +++++++++++++++++------------------
> hw/scsi/scsi-bus.c | 62
> +++++++++++++++++++++++---------------------------
> hw/scsi/scsi-disk.c | 13 +++++------
> hw/scsi/scsi-generic.c | 4 ++--
> hw/scsi/virtio-scsi.c | 1 -
> hw/scsi/vmw_pvscsi.c | 2 +-
> hw/usb/dev-storage.c | 2 +-
> hw/usb/dev-uas.c | 1 -
> include/hw/scsi/scsi.h | 7 +++---
> 11 files changed, 65 insertions(+), 76 deletions(-)
>
> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
> index 5ab44d8..1123156 100644
> --- a/hw/scsi/esp.c
> +++ b/hw/scsi/esp.c
> @@ -129,7 +129,7 @@ static void do_busid_cmd(ESPState *s, uint8_t *buf,
> uint8_t busid)
> trace_esp_do_busid_cmd(busid);
> lun = busid & 7;
> current_lun = scsi_device_find(&s->bus, 0, s->current_dev->id, lun);
> - s->current_req = scsi_req_new(current_lun, 0, lun, buf, s);
> + s->current_req = scsi_req_new(current_lun, 0, buf, s);
> datalen = scsi_req_enqueue(s->current_req);
> s->ti_size = datalen;
> if (datalen != 0) {
> diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
> index d9b4c7e..a185e0c 100644
> --- a/hw/scsi/lsi53c895a.c
> +++ b/hw/scsi/lsi53c895a.c
> @@ -783,8 +783,7 @@ static void lsi_do_command(LSIState *s)
> assert(s->current == NULL);
> s->current = g_malloc0(sizeof(lsi_request));
> s->current->tag = s->select_tag;
> - s->current->req = scsi_req_new(dev, s->current->tag, s->current_lun, buf,
> - s->current);
> + s->current->req = scsi_req_new(dev, s->current->tag, buf, s->current);
>
> n = scsi_req_enqueue(s->current->req);
> if (n) {
> diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
> index eedc992..5b9e508 100644
> --- a/hw/scsi/megasas.c
> +++ b/hw/scsi/megasas.c
> @@ -971,14 +971,13 @@ static int megasas_dcmd_pd_list_query(MegasasState *s,
> MegasasCmd *cmd)
> return MFI_STAT_OK;
> }
>
> -static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
> - MegasasCmd *cmd)
> +static int megasas_pd_get_info_submit(SCSIDevice *sdev, MegasasCmd *cmd)
> {
> struct mfi_pd_info *info = cmd->iov_buf;
> size_t dcmd_size = sizeof(struct mfi_pd_info);
> BlockConf *conf = &sdev->conf;
> uint64_t pd_size;
> - uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
> + uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (sdev->lun & 0xFF);
> uint8_t cmdbuf[6];
> SCSIRequest *req;
> size_t len, resid;
> @@ -990,7 +989,7 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev,
> int lun,
> info->inquiry_data[0] = 0x7f; /* Force PQual 0x3, PType 0x1f */
> info->vpd_page83[0] = 0x7f;
> megasas_setup_inquiry(cmdbuf, 0, sizeof(info->inquiry_data));
> - req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
> + req = scsi_req_new(sdev, cmd->index, cmdbuf, cmd);
> if (!req) {
> trace_megasas_dcmd_req_alloc_failed(cmd->index,
> "PD get info std inquiry");
> @@ -999,7 +998,8 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev,
> int lun,
> return MFI_STAT_FLASH_ALLOC_FAIL;
> }
> trace_megasas_dcmd_internal_submit(cmd->index,
> - "PD get info std inquiry", lun);
> + "PD get info std inquiry",
> + sdev->lun);
> len = scsi_req_enqueue(req);
> if (len > 0) {
> cmd->iov_size = len;
> @@ -1008,14 +1008,15 @@ static int megasas_pd_get_info_submit(SCSIDevice
> *sdev, int lun,
> return MFI_STAT_INVALID_STATUS;
> } else if (info->inquiry_data[0] != 0x7f && info->vpd_page83[0] == 0x7f)
> {
> megasas_setup_inquiry(cmdbuf, 0x83, sizeof(info->vpd_page83));
> - req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
> + req = scsi_req_new(sdev, cmd->index, cmdbuf, cmd);
> if (!req) {
> trace_megasas_dcmd_req_alloc_failed(cmd->index,
> "PD get info vpd inquiry");
> return MFI_STAT_FLASH_ALLOC_FAIL;
> }
> trace_megasas_dcmd_internal_submit(cmd->index,
> - "PD get info vpd inquiry", lun);
> + "PD get info vpd inquiry",
> + sdev->lun);
> len = scsi_req_enqueue(req);
> if (len > 0) {
> cmd->iov_size = len;
> @@ -1074,7 +1075,7 @@ static int megasas_dcmd_pd_get_info(MegasasState *s,
> MegasasCmd *cmd)
>
> if (sdev) {
> /* Submit inquiry */
> - retval = megasas_pd_get_info_submit(sdev, pd_id, cmd);
> + retval = megasas_pd_get_info_submit(sdev, cmd);
> }
>
> return retval;
> @@ -1136,8 +1137,7 @@ static int megasas_dcmd_ld_list_query(MegasasState *s,
> MegasasCmd *cmd)
> return MFI_STAT_OK;
> }
>
> -static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
> - MegasasCmd *cmd)
> +static int megasas_ld_get_info_submit(SCSIDevice *sdev, MegasasCmd *cmd)
> {
> struct mfi_ld_info *info = cmd->iov_buf;
> size_t dcmd_size = sizeof(struct mfi_ld_info);
> @@ -1145,7 +1145,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev,
> int lun,
> SCSIRequest *req;
> ssize_t len, resid;
> BlockConf *conf = &sdev->conf;
> - uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
> + uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (sdev->lun & 0xFF);
> uint64_t ld_size;
>
> if (!cmd->iov_buf) {
> @@ -1153,7 +1153,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev,
> int lun,
> memset(cmd->iov_buf, 0x0, dcmd_size);
> info = cmd->iov_buf;
> megasas_setup_inquiry(cdb, 0x83, sizeof(info->vpd_page83));
> - req = scsi_req_new(sdev, cmd->index, lun, cdb, cmd);
> + req = scsi_req_new(sdev, cmd->index, cdb, cmd);
> if (!req) {
> trace_megasas_dcmd_req_alloc_failed(cmd->index,
> "LD get info vpd inquiry");
> @@ -1162,7 +1162,8 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev,
> int lun,
> return MFI_STAT_FLASH_ALLOC_FAIL;
> }
> trace_megasas_dcmd_internal_submit(cmd->index,
> - "LD get info vpd inquiry", lun);
> + "LD get info vpd inquiry",
> + sdev->lun);
> len = scsi_req_enqueue(req);
> if (len > 0) {
> cmd->iov_size = len;
> @@ -1172,7 +1173,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev,
> int lun,
> }
>
> info->ld_config.params.state = MFI_LD_STATE_OPTIMAL;
> - info->ld_config.properties.ld.v.target_id = lun;
> + info->ld_config.properties.ld.v.target_id = sdev->lun;
> info->ld_config.params.stripe_size = 3;
> info->ld_config.params.num_drives = 1;
> info->ld_config.params.is_consistent = 1;
> @@ -1217,7 +1218,7 @@ static int megasas_dcmd_ld_get_info(MegasasState *s,
> MegasasCmd *cmd)
> }
>
> if (sdev) {
> - retval = megasas_ld_get_info_submit(sdev, ld_id, cmd);
> + retval = megasas_ld_get_info_submit(sdev, cmd);
> }
>
> return retval;
> @@ -1509,17 +1510,16 @@ static int megasas_finish_internal_dcmd(MegasasCmd
> *cmd,
> {
> int opcode;
> int retval = MFI_STAT_OK;
> - int lun = req->lun;
>
> opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
> scsi_req_unref(req);
> - trace_megasas_dcmd_internal_finish(cmd->index, opcode, lun);
> + trace_megasas_dcmd_internal_finish(cmd->index, opcode, req->dev->lun);
> switch (opcode) {
> case MFI_DCMD_PD_GET_INFO:
> - retval = megasas_pd_get_info_submit(req->dev, lun, cmd);
> + retval = megasas_pd_get_info_submit(req->dev, cmd);
> break;
> case MFI_DCMD_LD_GET_INFO:
> - retval = megasas_ld_get_info_submit(req->dev, lun, cmd);
> + retval = megasas_ld_get_info_submit(req->dev, cmd);
> break;
> default:
> trace_megasas_dcmd_internal_invalid(cmd->index, opcode);
> @@ -1609,8 +1609,7 @@ static int megasas_handle_scsi(MegasasState *s,
> MegasasCmd *cmd,
> return MFI_STAT_SCSI_DONE_WITH_ERROR;
> }
>
> - cmd->req = scsi_req_new(sdev, cmd->index,
> - cmd->frame->header.lun_id, cdb, cmd);
> + cmd->req = scsi_req_new(sdev, cmd->index, cdb, cmd);
> if (!cmd->req) {
> trace_megasas_scsi_req_alloc_failed(
> mfi_frame_desc[cmd->frame->header.frame_cmd],
> @@ -1686,8 +1685,7 @@ static int megasas_handle_io(MegasasState *s,
> MegasasCmd *cmd)
> }
>
> megasas_encode_lba(cdb, lba_start, lba_count, is_write);
> - cmd->req = scsi_req_new(sdev, cmd->index,
> - cmd->frame->header.lun_id, cdb, cmd);
> + cmd->req = scsi_req_new(sdev, cmd->index, cdb, cmd);
> if (!cmd->req) {
> trace_megasas_scsi_req_alloc_failed(
> mfi_frame_desc[cmd->frame->header.frame_cmd],
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index 64d0880..0f13b77 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -72,12 +72,12 @@ int scsi_bus_parse_cdb(SCSIDevice *dev, SCSICommand *cmd,
> uint8_t *buf,
> return rc;
> }
>
> -static SCSIRequest *scsi_device_alloc_req(SCSIDevice *s, uint32_t tag,
> uint32_t lun,
> +static SCSIRequest *scsi_device_alloc_req(SCSIDevice *s, uint32_t tag,
> uint8_t *buf, void *hba_private)
> {
> SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
> if (sc->alloc_req) {
> - return sc->alloc_req(s, tag, lun, buf, hba_private);
> + return sc->alloc_req(s, tag, buf, hba_private);
> }
>
> return NULL;
> @@ -401,8 +401,6 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq
> *r)
>
> static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
> {
> - assert(r->req.dev->lun != r->req.lun);
> -
> scsi_target_alloc_buf(&r->req, SCSI_INQUIRY_LEN);
>
> if (r->req.cmd.buf[1] & 0x2) {
> @@ -442,7 +440,7 @@ static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
> /* PAGE CODE == 0 */
> r->len = MIN(r->req.cmd.xfer, SCSI_INQUIRY_LEN);
> memset(r->buf, 0, r->len);
> - if (r->req.lun != 0) {
> + if (r->req.dev->lun != 0) {
> r->buf[0] = TYPE_NO_LUN;
> } else {
> r->buf[0] = TYPE_NOT_PRESENT | TYPE_INACTIVE;
> @@ -549,7 +547,7 @@ static const struct SCSIReqOps reqops_target_command = {
>
>
> SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
> - uint32_t tag, uint32_t lun, void *hba_private)
> + uint32_t tag, void *hba_private)
> {
> SCSIRequest *req;
> SCSIBus *bus = scsi_bus_from_device(d);
> @@ -563,18 +561,17 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops,
> SCSIDevice *d,
> req->bus = bus;
> req->dev = d;
> req->tag = tag;
> - req->lun = lun;
> req->hba_private = hba_private;
> req->status = -1;
> req->ops = reqops;
> object_ref(OBJECT(d));
> object_ref(OBJECT(qbus->parent));
> notifier_list_init(&req->cancel_notifiers);
> - trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_alloc(req->dev->id, req->dev->lun, req->tag);
> return req;
> }
>
> -SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
> +SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag,
> uint8_t *buf, void *hba_private)
> {
> SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
> @@ -597,8 +594,7 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag,
> uint32_t lun,
> */
> !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
> ops = &reqops_unit_attention;
> - } else if (lun != d->lun ||
> - buf[0] == REPORT_LUNS ||
> + } else if (buf[0] == REPORT_LUNS ||
> (buf[0] == REQUEST_SENSE && d->sense_len)) {
> ops = &reqops_target_command;
> } else {
> @@ -612,23 +608,22 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag,
> uint32_t lun,
> }
>
> if (ret != 0) {
> - trace_scsi_req_parse_bad(d->id, lun, tag, buf[0]);
> - req = scsi_req_alloc(&reqops_invalid_opcode, d, tag, lun,
> hba_private);
> + trace_scsi_req_parse_bad(d->id, d->lun, tag, buf[0]);
> + req = scsi_req_alloc(&reqops_invalid_opcode, d, tag, hba_private);
> } else {
> assert(cmd.len != 0);
> - trace_scsi_req_parsed(d->id, lun, tag, buf[0],
> + trace_scsi_req_parsed(d->id, d->lun, tag, buf[0],
> cmd.mode, cmd.xfer);
> if (cmd.lba != -1) {
> - trace_scsi_req_parsed_lba(d->id, lun, tag, buf[0],
> - cmd.lba);
> + trace_scsi_req_parsed_lba(d->id, d->lun, tag, buf[0], cmd.lba);
> }
>
> if (cmd.xfer > INT32_MAX) {
> - req = scsi_req_alloc(&reqops_invalid_field, d, tag, lun,
> hba_private);
> + req = scsi_req_alloc(&reqops_invalid_field, d, tag, hba_private);
> } else if (ops) {
> - req = scsi_req_alloc(ops, d, tag, lun, hba_private);
> + req = scsi_req_alloc(ops, d, tag, hba_private);
> } else {
> - req = scsi_device_alloc_req(d, tag, lun, buf, hba_private);
> + req = scsi_device_alloc_req(d, tag, buf, hba_private);
> }
> }
>
> @@ -637,16 +632,16 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag,
> uint32_t lun,
>
> switch (buf[0]) {
> case INQUIRY:
> - trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]);
> + trace_scsi_inquiry(d->id, d->lun, tag, cmd.buf[1], cmd.buf[2]);
> break;
> case TEST_UNIT_READY:
> - trace_scsi_test_unit_ready(d->id, lun, tag);
> + trace_scsi_test_unit_ready(d->id, d->lun, tag);
> break;
> case REPORT_LUNS:
> - trace_scsi_report_luns(d->id, lun, tag);
> + trace_scsi_report_luns(d->id, d->lun, tag);
> break;
> case REQUEST_SENSE:
> - trace_scsi_request_sense(d->id, lun, tag);
> + trace_scsi_request_sense(d->id, d->lun, tag);
> break;
> default:
> break;
> @@ -734,7 +729,7 @@ int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf,
> int len, bool fixed)
>
> void scsi_req_build_sense(SCSIRequest *req, SCSISense sense)
> {
> - trace_scsi_req_build_sense(req->dev->id, req->lun, req->tag,
> + trace_scsi_req_build_sense(req->dev->id, req->dev->lun, req->tag,
> sense.key, sense.asc, sense.ascq);
> memset(req->sense, 0, 18);
> req->sense[0] = 0x70;
> @@ -772,7 +767,7 @@ int32_t scsi_req_enqueue(SCSIRequest *req)
>
> static void scsi_req_dequeue(SCSIRequest *req)
> {
> - trace_scsi_req_dequeue(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_dequeue(req->dev->id, req->dev->lun, req->tag);
> req->retry = false;
> if (req->enqueued) {
> QTAILQ_REMOVE(&req->dev->requests, req, next);
> @@ -1622,10 +1617,10 @@ void scsi_req_unref(SCSIRequest *req)
> void scsi_req_continue(SCSIRequest *req)
> {
> if (req->io_canceled) {
> - trace_scsi_req_continue_canceled(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_continue_canceled(req->dev->id, req->dev->lun,
> req->tag);
> return;
> }
> - trace_scsi_req_continue(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_continue(req->dev->id, req->dev->lun, req->tag);
> if (req->cmd.mode == SCSI_XFER_TO_DEV) {
> req->ops->write_data(req);
> } else {
> @@ -1640,10 +1635,11 @@ void scsi_req_data(SCSIRequest *req, int len)
> {
> uint8_t *buf;
> if (req->io_canceled) {
> - trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
> + trace_scsi_req_data_canceled(req->dev->id, req->dev->lun,
> + req->tag, len);
> return;
> }
> - trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
> + trace_scsi_req_data(req->dev->id, req->dev->lun, req->tag, len);
> assert(req->cmd.mode != SCSI_XFER_NONE);
> if (!req->sg) {
> req->resid -= len;
> @@ -1746,7 +1742,7 @@ void scsi_req_cancel_complete(SCSIRequest *req)
> * */
> void scsi_req_cancel_async(SCSIRequest *req, Notifier *notifier)
> {
> - trace_scsi_req_cancel(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_cancel(req->dev->id, req->dev->lun, req->tag);
> if (notifier) {
> notifier_list_add(&req->cancel_notifiers, notifier);
> }
> @@ -1763,7 +1759,7 @@ void scsi_req_cancel_async(SCSIRequest *req, Notifier
> *notifier)
>
> void scsi_req_cancel(SCSIRequest *req)
> {
> - trace_scsi_req_cancel(req->dev->id, req->lun, req->tag);
> + trace_scsi_req_cancel(req->dev->id, req->dev->lun, req->tag);
> if (!req->enqueued) {
> return;
> }
> @@ -1895,7 +1891,7 @@ static void put_scsi_requests(QEMUFile *f, void *pv,
> size_t size)
> qemu_put_sbyte(f, req->retry ? 1 : 2);
> qemu_put_buffer(f, req->cmd.buf, sizeof(req->cmd.buf));
> qemu_put_be32s(f, &req->tag);
> - qemu_put_be32s(f, &req->lun);
> + qemu_put_be32s(f, &req->dev->lun);
> if (bus->info->save_request) {
> bus->info->save_request(f, req);
> }
> @@ -1921,7 +1917,7 @@ static int get_scsi_requests(QEMUFile *f, void *pv,
> size_t size)
> qemu_get_buffer(f, buf, sizeof(buf));
> qemu_get_be32s(f, &tag);
> qemu_get_be32s(f, &lun);
> - req = scsi_req_new(s, tag, lun, buf, NULL);
> + req = scsi_req_new(s, tag, buf, NULL);
> req->retry = (sbyte == 1);
> if (bus->info->load_request) {
> req->hba_private = bus->info->load_request(f, req);
> diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
> index 30e3789..dec669e 100644
> --- a/hw/scsi/scsi-disk.c
> +++ b/hw/scsi/scsi-disk.c
> @@ -2374,7 +2374,7 @@ static const SCSIReqOps *const
> scsi_disk_reqops_dispatch[256] = {
> [WRITE_VERIFY_16] = &scsi_disk_dma_reqops,
> };
>
> -static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t
> lun,
> +static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag,
> uint8_t *buf, void *hba_private)
> {
> SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
> @@ -2387,10 +2387,10 @@ static SCSIRequest *scsi_new_request(SCSIDevice *d,
> uint32_t tag, uint32_t lun,
> if (!ops) {
> ops = &scsi_disk_emulate_reqops;
> }
> - req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private);
> + req = scsi_req_alloc(ops, &s->qdev, tag, hba_private);
>
> #ifdef DEBUG_SCSI
> - DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
> + DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", d->lun, tag, buf[0]);
> {
> int i;
> for (i = 1; i < scsi_cdb_length(buf); i++) {
> @@ -2539,16 +2539,15 @@ static bool scsi_block_is_passthrough(SCSIDiskState
> *s, uint8_t *buf)
>
>
> static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
> - uint32_t lun, uint8_t *buf,
> - void *hba_private)
> + uint8_t *buf, void *hba_private)
> {
> SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
>
> if (scsi_block_is_passthrough(s, buf)) {
> - return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
> + return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag,
> hba_private);
> } else {
> - return scsi_req_alloc(&scsi_disk_dma_reqops, &s->qdev, tag, lun,
> + return scsi_req_alloc(&scsi_disk_dma_reqops, &s->qdev, tag,
> hba_private);
> }
> }
> diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
> index 84a1d5b..837f670 100644
> --- a/hw/scsi/scsi-generic.c
> +++ b/hw/scsi/scsi-generic.c
> @@ -449,12 +449,12 @@ const SCSIReqOps scsi_generic_req_ops = {
> .save_request = scsi_generic_save_request,
> };
>
> -static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t
> lun,
> +static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag,
> uint8_t *buf, void *hba_private)
> {
> SCSIRequest *req;
>
> - req = scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
> + req = scsi_req_alloc(&scsi_generic_req_ops, d, tag, hba_private);
> return req;
> }
>
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 8547ea0..dd71edc 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -528,7 +528,6 @@ bool virtio_scsi_handle_cmd_req_prepare(VirtIOSCSI *s,
> VirtIOSCSIReq *req)
> aio_context_release(s->ctx);
> }
> req->sreq = scsi_req_new(d, req->req.cmd.tag,
> - virtio_scsi_get_lun(req->req.cmd.lun),
> req->req.cdb, req);
>
> if (req->sreq->cmd.mode != SCSI_XFER_NONE
> diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
> index d3a92fb..873c830 100644
> --- a/hw/scsi/vmw_pvscsi.c
> +++ b/hw/scsi/vmw_pvscsi.c
> @@ -652,7 +652,7 @@ pvscsi_process_request_descriptor(PVSCSIState *s,
> r->sg.elemAddr = descr->dataAddr;
> }
>
> - r->sreq = scsi_req_new(d, descr->context, r->lun, descr->cdb, r);
> + r->sreq = scsi_req_new(d, descr->context, descr->cdb, r);
> if (r->sreq->cmd.mode == SCSI_XFER_FROM_DEV &&
> (descr->flags & PVSCSI_FLAG_CMD_DIR_TODEVICE)) {
> r->cmp.hostStatus = BTSTAT_BADMSG;
> diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
> index 5bfc72c..c2e9d50 100644
> --- a/hw/usb/dev-storage.c
> +++ b/hw/usb/dev-storage.c
> @@ -439,7 +439,7 @@ static void usb_msd_handle_data(USBDevice *dev, USBPacket
> *p)
> tag, cbw.flags, cbw.cmd_len, s->data_len);
> assert(le32_to_cpu(s->csw.residue) == 0);
> s->scsi_len = 0;
> - s->req = scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, NULL);
> + s->req = scsi_req_new(scsi_dev, tag, cbw.cmd, NULL);
> #ifdef DEBUG_MSD
> scsi_req_print(s->req);
> #endif
> diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c
> index 04fc515..dcb3773 100644
> --- a/hw/usb/dev-uas.c
> +++ b/hw/usb/dev-uas.c
> @@ -714,7 +714,6 @@ static void usb_uas_command(UASDevice *uas, uas_iu *iu)
> }
>
> req->req = scsi_req_new(req->dev, req->tag,
> - usb_uas_get_lun(req->lun),
> iu->command.cdb, req);
> if (uas->requestlog) {
> scsi_req_print(req->req);
> diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
> index 4e9bbd1..afb3f5d 100644
> --- a/include/hw/scsi/scsi.h
> +++ b/include/hw/scsi/scsi.h
> @@ -49,7 +49,6 @@ struct SCSIRequest {
> const SCSIReqOps *ops;
> uint32_t refcount;
> uint32_t tag;
> - uint32_t lun;
> uint32_t status;
> void *hba_private;
> size_t resid;
> @@ -87,7 +86,7 @@ typedef struct SCSIDeviceClass {
> void (*unrealize)(SCSIDevice *dev, Error **errp);
> int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf,
> void *hba_private);
> - SCSIRequest *(*alloc_req)(SCSIDevice *s, uint32_t tag, uint32_t lun,
> + SCSIRequest *(*alloc_req)(SCSIDevice *s, uint32_t tag,
> uint8_t *buf, void *hba_private);
> void (*unit_attention_reported)(SCSIDevice *s);
> } SCSIDeviceClass;
> @@ -247,8 +246,8 @@ int scsi_build_sense(uint8_t *in_buf, int in_len,
> uint8_t *buf, int len, bool fixed);
>
> SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
> - uint32_t tag, uint32_t lun, void *hba_private);
> -SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
> + uint32_t tag, void *hba_private);
> +SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag,
> uint8_t *buf, void *hba_private);
> int32_t scsi_req_enqueue(SCSIRequest *req);
> void scsi_req_free(SCSIRequest *req);
>
[Qemu-devel] [PATCH 06/17] megasas: fixup MFI_DCMD_LD_LIST_QUERY, Hannes Reinecke, 2014/10/29
[Qemu-devel] [PATCH 16/17] megasas: Rework frame queueing algorithm, Hannes Reinecke, 2014/10/29
[Qemu-devel] [PATCH 09/17] megasas: add MegaRAID SAS 2108 emulation, Hannes Reinecke, 2014/10/29
[Qemu-devel] [PATCH 12/17] megasas: Clear unit attention on initial reset, Hannes Reinecke, 2014/10/29
[Qemu-devel] [PATCH 03/17] scsi: Rename scsi_cdb_length() to scsi_xfer_length(), Hannes Reinecke, 2014/10/29