[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 04/24] scsi: introduce SCSIBusOps
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH v4 04/24] scsi: introduce SCSIBusOps |
Date: |
Mon, 23 May 2011 22:35:50 +0300 |
On Mon, May 23, 2011 at 7:08 PM, Paolo Bonzini <address@hidden> wrote:
> There are more operations than a SCSI bus can handle, besides completing
> commands. The current callback in fact is overloaded and can be called
> with two different meanings already. Another example, which this series
> will introduce, is cleaning up after a request is cancelled.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
> Cc: Christoph Hellwig <address@hidden>
> ---
> hw/esp.c | 6 +++++-
> hw/lsi53c895a.c | 6 +++++-
> hw/scsi-bus.c | 12 ++++++------
> hw/scsi-generic.c | 2 +-
> hw/scsi.h | 13 +++++++------
> hw/spapr_vscsi.c | 6 +++++-
> hw/usb-msd.c | 6 +++++-
> 7 files changed, 34 insertions(+), 17 deletions(-)
>
> diff --git a/hw/esp.c b/hw/esp.c
> index fa9d2a2..d8bba7a 100644
> --- a/hw/esp.c
> +++ b/hw/esp.c
> @@ -714,6 +714,10 @@ void esp_init(target_phys_addr_t espaddr, int it_shift,
> *dma_enable = qdev_get_gpio_in(dev, 1);
> }
>
> +static struct SCSIBusOps esp_scsi_ops = {
It looks like structs like this could be made 'const'.
> + .complete = esp_command_complete
> +};
> +
> static int esp_init1(SysBusDevice *dev)
> {
> ESPState *s = FROM_SYSBUS(ESPState, dev);
> @@ -728,7 +732,7 @@ static int esp_init1(SysBusDevice *dev)
>
> qdev_init_gpio_in(&dev->qdev, esp_gpio_demux, 2);
>
> - scsi_bus_new(&s->bus, &dev->qdev, 0, ESP_MAX_DEVS, esp_command_complete);
> + scsi_bus_new(&s->bus, &dev->qdev, 0, ESP_MAX_DEVS, &esp_scsi_ops);
> return scsi_bus_legacy_handle_cmdline(&s->bus);
> }
>
> diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
> index 2ce38a9..ccea6ad 100644
> --- a/hw/lsi53c895a.c
> +++ b/hw/lsi53c895a.c
> @@ -2205,6 +2205,10 @@ static int lsi_scsi_uninit(PCIDevice *d)
> return 0;
> }
>
> +static struct SCSIBusOps lsi_scsi_ops = {
> + .complete = lsi_command_complete
> +};
> +
> static int lsi_scsi_init(PCIDevice *dev)
> {
> LSIState *s = DO_UPCAST(LSIState, dev, dev);
> @@ -2241,7 +2245,7 @@ static int lsi_scsi_init(PCIDevice *dev)
> PCI_BASE_ADDRESS_SPACE_MEMORY, lsi_ram_mapfunc);
> QTAILQ_INIT(&s->queue);
>
> - scsi_bus_new(&s->bus, &dev->qdev, 1, LSI_MAX_DEVS, lsi_command_complete);
> + scsi_bus_new(&s->bus, &dev->qdev, 1, LSI_MAX_DEVS, &lsi_scsi_ops);
> if (!dev->qdev.hotplugged) {
> return scsi_bus_legacy_handle_cmdline(&s->bus);
> }
> diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
> index 191cbab..f21704f 100644
> --- a/hw/scsi-bus.c
> +++ b/hw/scsi-bus.c
> @@ -21,13 +21,13 @@ static int next_scsi_bus;
>
> /* Create a scsi bus, and attach devices to it. */
> void scsi_bus_new(SCSIBus *bus, DeviceState *host, int tcq, int ndev,
> - scsi_completionfn complete)
> + SCSIBusOps *ops)
> {
> qbus_create_inplace(&bus->qbus, &scsi_bus_info, host, NULL);
> bus->busnr = next_scsi_bus++;
> bus->tcq = tcq;
> bus->ndev = ndev;
> - bus->complete = complete;
> + bus->ops = ops;
> bus->qbus.allow_hotplug = 1;
> }
>
> @@ -503,7 +503,7 @@ static const char *scsi_command_name(uint8_t cmd)
> void scsi_req_data(SCSIRequest *req, int len)
> {
> trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
> - req->bus->complete(req->bus, SCSI_REASON_DATA, req->tag, len);
> + req->bus->ops->complete(req->bus, SCSI_REASON_DATA, req->tag, len);
> }
>
> void scsi_req_print(SCSIRequest *req)
> @@ -538,9 +538,9 @@ void scsi_req_complete(SCSIRequest *req)
> {
> assert(req->status != -1);
> scsi_req_dequeue(req);
> - req->bus->complete(req->bus, SCSI_REASON_DONE,
> - req->tag,
> - req->status);
> + req->bus->ops->complete(req->bus, SCSI_REASON_DONE,
> + req->tag,
> + req->status);
> }
>
> static char *scsibus_get_fw_dev_path(DeviceState *dev)
> diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
> index e4f1f30..f09458b 100644
> --- a/hw/scsi-generic.c
> +++ b/hw/scsi-generic.c
> @@ -335,7 +335,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t
> tag,
> s->senselen = 7;
> s->driver_status = SG_ERR_DRIVER_SENSE;
> bus = scsi_bus_from_device(d);
> - bus->complete(bus, SCSI_REASON_DONE, tag, CHECK_CONDITION);
> + bus->ops->complete(bus, SCSI_REASON_DONE, tag, CHECK_CONDITION);
> return 0;
> }
>
> diff --git a/hw/scsi.h b/hw/scsi.h
> index 7c09f32..20cf397 100644
> --- a/hw/scsi.h
> +++ b/hw/scsi.h
> @@ -16,10 +16,9 @@ enum scsi_reason {
> };
>
> typedef struct SCSIBus SCSIBus;
> +typedef struct SCSIBusOps SCSIBusOps;
> typedef struct SCSIDevice SCSIDevice;
> typedef struct SCSIDeviceInfo SCSIDeviceInfo;
> -typedef void (*scsi_completionfn)(SCSIBus *bus, int reason, uint32_t tag,
> - uint32_t arg);
>
> enum SCSIXferMode {
> SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */
> @@ -74,20 +73,22 @@ struct SCSIDeviceInfo {
> uint8_t *(*get_buf)(SCSIDevice *s, uint32_t tag);
> };
>
> -typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
> - int unit);
> +struct SCSIBusOps {
> + void (*complete)(SCSIBus *bus, int reason, uint32_t tag, uint32_t arg);
> +};
> +
> struct SCSIBus {
> BusState qbus;
> int busnr;
>
> int tcq, ndev;
> - scsi_completionfn complete;
> + SCSIBusOps *ops;
>
> SCSIDevice *devs[MAX_SCSI_DEVS];
> };
>
> void scsi_bus_new(SCSIBus *bus, DeviceState *host, int tcq, int ndev,
> - scsi_completionfn complete);
> + SCSIBusOps *ops);
> void scsi_qdev_register(SCSIDeviceInfo *info);
>
> static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
> diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c
> index 9928334..9f5c154 100644
> --- a/hw/spapr_vscsi.c
> +++ b/hw/spapr_vscsi.c
> @@ -907,6 +907,10 @@ static int vscsi_do_crq(struct VIOsPAPRDevice *dev,
> uint8_t *crq_data)
> return 0;
> }
>
> +static struct SCSIBusOps vscsi_scsi_ops = {
> + .complete = vscsi_command_complete
> +};
> +
> static int spapr_vscsi_init(VIOsPAPRDevice *dev)
> {
> VSCSIState *s = DO_UPCAST(VSCSIState, vdev, dev);
> @@ -923,7 +927,7 @@ static int spapr_vscsi_init(VIOsPAPRDevice *dev)
> dev->crq.SendFunc = vscsi_do_crq;
>
> scsi_bus_new(&s->bus, &dev->qdev, 1, VSCSI_REQ_LIMIT,
> - vscsi_command_complete);
> + &vscsi_scsi_ops);
> if (!dev->qdev.hotplugged) {
> scsi_bus_legacy_handle_cmdline(&s->bus);
> }
> diff --git a/hw/usb-msd.c b/hw/usb-msd.c
> index bd1c3a4..7a07a12 100644
> --- a/hw/usb-msd.c
> +++ b/hw/usb-msd.c
> @@ -487,6 +487,10 @@ static void usb_msd_password_cb(void *opaque, int err)
> qdev_unplug(&s->dev.qdev);
> }
>
> +static struct SCSIBusOps usb_msd_scsi_ops = {
> + .complete = usb_msd_command_complete
> +};
> +
> static int usb_msd_initfn(USBDevice *dev)
> {
> MSDState *s = DO_UPCAST(MSDState, dev, dev);
> @@ -516,7 +520,7 @@ static int usb_msd_initfn(USBDevice *dev)
> }
>
> usb_desc_init(dev);
> - scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, usb_msd_command_complete);
> + scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, &usb_msd_scsi_ops);
> s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable);
> if (!s->scsi_dev) {
> return -1;
> --
> 1.7.4.4
>
>
>
>
- [Qemu-devel] [PATCH v4 00/24] SCSI subsystem improvements, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 01/24] scsi: add tracing of scsi requests, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 02/24] scsi-generic: Remove bogus double complete, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 03/24] scsi: introduce scsi_req_data, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 04/24] scsi: introduce SCSIBusOps, Paolo Bonzini, 2011/05/23
- Re: [Qemu-devel] [PATCH v4 04/24] scsi: introduce SCSIBusOps,
Blue Swirl <=
- [Qemu-devel] [PATCH v4 05/24] scsi: reference-count requests, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 06/24] lsi: extract lsi_find_by_tag, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 08/24] scsi: commonize purging requests, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 07/24] scsi: Use 'SCSIRequest' directly, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 09/24] scsi: introduce scsi_req_abort, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 10/24] scsi: introduce scsi_req_cancel, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 11/24] scsi: use scsi_req_complete, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 12/24] scsi: Update sense code handling, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 14/24] scsi: introduce scsi_req_new, Paolo Bonzini, 2011/05/23
- [Qemu-devel] [PATCH v4 13/24] scsi: do not call send_command directly, Paolo Bonzini, 2011/05/23