[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for sc
From: |
Hu Tao |
Subject: |
Re: [Qemu-devel] [PATCH qom-next] scsi: Improve error propagation for scsi_bus_legacy_handle_cmdline() |
Date: |
Mon, 22 Jul 2013 17:16:46 +0800 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Sun, Jul 21, 2013 at 12:30:54PM +0200, Andreas Färber wrote:
> Let scsi_bus_legacy_add_drive() and scsi_bus_legacy_handle_cmdline()
> return an Error**. Prepare qdev initfns for QOM realize error model.
>
> Signed-off-by: Andreas Färber <address@hidden>
> ---
> hw/pci/pci-hotplug-old.c | 2 +-
> hw/scsi/esp-pci.c | 7 ++++++-
> hw/scsi/esp.c | 6 ++++--
> hw/scsi/lsi53c895a.c | 7 ++++++-
> hw/scsi/megasas.c | 7 ++++++-
> hw/scsi/scsi-bus.c | 22 +++++++++++++++-------
> hw/scsi/spapr_vscsi.c | 7 ++++++-
> hw/scsi/virtio-scsi.c | 7 ++++++-
> hw/usb/dev-storage.c | 4 +++-
> include/hw/scsi/scsi.h | 4 ++--
> 10 files changed, 55 insertions(+), 18 deletions(-)
>
> diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c
> index 8077289..619fe47 100644
> --- a/hw/pci/pci-hotplug-old.c
> +++ b/hw/pci/pci-hotplug-old.c
> @@ -127,7 +127,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState
> *adapter,
> dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
> dinfo->bus = scsibus->busnr;
> scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo->bdrv, dinfo->unit,
> - false, -1, NULL);
> + false, -1, NULL, NULL);
> if (!scsidev) {
> return -1;
> }
> diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
> index 6cdfd53..2ac21d4 100644
> --- a/hw/scsi/esp-pci.c
> +++ b/hw/scsi/esp-pci.c
> @@ -346,6 +346,7 @@ static int esp_pci_scsi_init(PCIDevice *dev)
> DeviceState *d = DEVICE(dev);
> ESPState *s = &pci->esp;
> uint8_t *pci_conf;
> + Error *err = NULL;
>
> pci_conf = dev->config;
>
> @@ -364,7 +365,11 @@ static int esp_pci_scsi_init(PCIDevice *dev)
>
> scsi_bus_new(&s->bus, d, &esp_pci_scsi_info, NULL);
> if (!d->hotplugged) {
> - return scsi_bus_legacy_handle_cmdline(&s->bus);
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_free(err);
> + return -1;
> + }
> }
> return 0;
> }
> diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
> index c24b632..94639b8 100644
> --- a/hw/scsi/esp.c
> +++ b/hw/scsi/esp.c
> @@ -676,6 +676,7 @@ static void sysbus_esp_realize(DeviceState *dev, Error
> **errp)
> SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> SysBusESPState *sysbus = ESP(dev);
> ESPState *s = &sysbus->esp;
> + Error *err = NULL;
>
> sysbus_init_irq(sbd, &s->irq);
> assert(sysbus->it_shift != -1);
> @@ -688,8 +689,9 @@ static void sysbus_esp_realize(DeviceState *dev, Error
> **errp)
> qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2);
>
> scsi_bus_new(&s->bus, dev, &esp_scsi_info, NULL);
> - if (scsi_bus_legacy_handle_cmdline(&s->bus) < 0) {
> - error_setg(errp, "Handling legacy SCSI command line failed");
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_propagate(errp, err);
> return;
> }
> }
> diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
> index e11224f..776e31a 100644
> --- a/hw/scsi/lsi53c895a.c
> +++ b/hw/scsi/lsi53c895a.c
> @@ -2096,6 +2096,7 @@ static int lsi_scsi_init(PCIDevice *dev)
> LSIState *s = LSI53C895A(dev);
> DeviceState *d = DEVICE(dev);
> uint8_t *pci_conf;
> + Error *err = NULL;
>
> pci_conf = dev->config;
>
> @@ -2118,7 +2119,11 @@ static int lsi_scsi_init(PCIDevice *dev)
>
> scsi_bus_new(&s->bus, d, &lsi_scsi_info, NULL);
> if (!d->hotplugged) {
> - return scsi_bus_legacy_handle_cmdline(&s->bus);
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_free(err);
> + return -1;
> + }
> }
> return 0;
> }
> diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
> index 2ae4346..eb52164 100644
> --- a/hw/scsi/megasas.c
> +++ b/hw/scsi/megasas.c
> @@ -2102,6 +2102,7 @@ static int megasas_scsi_init(PCIDevice *dev)
> MegasasState *s = MEGASAS(dev);
> uint8_t *pci_conf;
> int i, bar_type;
> + Error *err = NULL;
>
> pci_conf = dev->config;
>
> @@ -2172,7 +2173,11 @@ static int megasas_scsi_init(PCIDevice *dev)
>
> scsi_bus_new(&s->bus, DEVICE(dev), &megasas_scsi_info, NULL);
> if (!d->hotplugged) {
> - return scsi_bus_legacy_handle_cmdline(&s->bus);
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_free(err);
> + return -1;
> + }
> }
> return 0;
> }
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index a92b7c1..b5a863a 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -209,10 +209,11 @@ static int scsi_qdev_exit(DeviceState *qdev)
> /* handle legacy '-drive if=scsi,...' cmd line args */
> SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
> int unit, bool removable, int
> bootindex,
> - const char *serial)
> + const char *serial, Error **errp)
> {
> const char *driver;
> DeviceState *dev;
> + Error *err = NULL;
>
> driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
> dev = qdev_create(&bus->qbus, driver);
> @@ -227,19 +228,25 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus,
> BlockDriverState *bdrv,
> qdev_prop_set_string(dev, "serial", serial);
> }
> if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
> + error_setg(errp, "Setting drive property failed");
> qdev_free(dev);
> return NULL;
> }
> - if (qdev_init(dev) < 0)
> + object_property_set_bool(OBJECT(dev), true, "realized", &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_propagate(errp, err);
> + qdev_free(dev);
> return NULL;
> + }
> return SCSI_DEVICE(dev);
> }
>
> -int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
> +void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp)
> {
> Location loc;
> DriveInfo *dinfo;
> - int res = 0, unit;
> + int unit;
> + Error *err = NULL;
>
> loc_push_none(&loc);
> for (unit = 0; unit <= bus->info->max_target; unit++) {
> @@ -248,13 +255,14 @@ int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
> continue;
> }
> qemu_opts_loc_restore(dinfo->opts);
> - if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1,
> NULL)) {
> - res = -1;
> + scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1, NULL,
> + &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_propagate(errp, err);
> break;
> }
> }
> loc_pop(&loc);
> - return res;
> }
>
> static int32_t scsi_invalid_field(SCSIRequest *req, uint8_t *buf)
> diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
> index e8978bf..55b44b9 100644
> --- a/hw/scsi/spapr_vscsi.c
> +++ b/hw/scsi/spapr_vscsi.c
> @@ -912,12 +912,17 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
> static int spapr_vscsi_init(VIOsPAPRDevice *dev)
> {
> VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
> + Error *err = NULL;
>
> dev->crq.SendFunc = vscsi_do_crq;
>
> scsi_bus_new(&s->bus, &dev->qdev, &vscsi_scsi_info, NULL);
> if (!dev->qdev.hotplugged) {
> - scsi_bus_legacy_handle_cmdline(&s->bus);
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_free(err);
> + return -1;
> + }
> }
>
> return 0;
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 712f0ad..42cb73b 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -619,6 +619,7 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
> VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
> VirtIOSCSI *s = VIRTIO_SCSI(vdev);
> static int virtio_scsi_id;
> + Error *err = NULL;
> int ret;
>
> ret = virtio_scsi_common_init(vs);
> @@ -629,7 +630,11 @@ static int virtio_scsi_device_init(VirtIODevice *vdev)
> scsi_bus_new(&s->bus, qdev, &virtio_scsi_scsi_info, vdev->bus_name);
>
> if (!qdev->hotplugged) {
> - scsi_bus_legacy_handle_cmdline(&s->bus);
> + scsi_bus_legacy_handle_cmdline(&s->bus, &err);
> + if (err != NULL) {
if (error_is_set(&err))
> + error_free(err);
> + return -1;
> + }
> }
>
> register_savevm(qdev, "virtio-scsi", virtio_scsi_id++, 1,
> diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
> index fe914ab..1954811 100644
> --- a/hw/usb/dev-storage.c
> +++ b/hw/usb/dev-storage.c
> @@ -595,6 +595,7 @@ static int usb_msd_initfn_storage(USBDevice *dev)
> MSDState *s = DO_UPCAST(MSDState, dev, dev);
> BlockDriverState *bs = s->conf.bs;
> SCSIDevice *scsi_dev;
> + Error *err = NULL;
>
> if (!bs) {
> error_report("drive property not set");
> @@ -619,7 +620,8 @@ static int usb_msd_initfn_storage(USBDevice *dev)
> usb_desc_init(dev);
> scsi_bus_new(&s->bus, &s->dev.qdev, &usb_msd_scsi_info_storage, NULL);
> scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable,
> - s->conf.bootindex, dev->serial);
> + s->conf.bootindex, dev->serial,
> + &err);
> if (!scsi_dev) {
> return -1;
> }
> diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
> index 9786e00..8786531 100644
> --- a/include/hw/scsi/scsi.h
> +++ b/include/hw/scsi/scsi.h
> @@ -162,8 +162,8 @@ static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
>
> SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
> int unit, bool removable, int
> bootindex,
> - const char *serial);
> -int scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
> + const char *serial, Error **errp);
> +void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp);
>
> /*
> * Predefined sense codes
> --
> 1.8.1.4
>
>
- [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more, (continued)
- [Qemu-devel] [PATCH v2 14/26] ahci: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 10/26] pflash-cfi01: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 13/26] pflash_cfi02: use realize for pflash_cfi02, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 15/26] ahci: use realize for ahci, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 16/26] fwcfg: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 18/26] scsi esp: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 19/26] scsi esp: use realize for scsi esp, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 17/26] fwcfg: use realize for fwcfg, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 21/26] hpet: use realize for hpet, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 23/26] kvmclock: use realize for kvmclock, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 20/26] hpet: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 22/26] kvmclock: QOM'ify some more, Hu Tao, 2013/07/01
- [Qemu-devel] [PATCH v2 26/26] isa bus: remove isabus_bridge_init since it does nothing, Hu Tao, 2013/07/01