From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MrGhK-0006YV-8R for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:18 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MrGhF-0006UP-CR for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:17 -0400 Received: from [199.232.76.173] (port=56058 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MrGhE-0006TN-2K for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:11628) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MrGhD-0004fO-4c for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:11 -0400 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8PJhAv7032671 for ; Fri, 25 Sep 2009 15:43:10 -0400 From: Gerd Hoffmann Date: Fri, 25 Sep 2009 21:42:46 +0200 Message-Id: <1253907769-1067-22-git-send-email-kraxel@redhat.com> In-Reply-To: <1253907769-1067-1-git-send-email-kraxel@redhat.com> References: <1253907769-1067-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 21/24] drive cleanup fixes. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Changes: * drive_uninit() wants a DriveInfo now. * drive_uninit() also calls bdrv_delete(), so callers don't need to do that. * drive_uninit() calls are moved over to the ->exit() callbacks, destroy_bdrvs() is zapped. * setting bdrv->private is not needed any more as the only user (destroy_bdrvs) is gone. * usb-storage needs no drive_uninit, scsi-disk will handle that. Signed-off-by: Gerd Hoffmann --- hw/device-hotplug.c | 18 ------------------ hw/pci-hotplug.c | 3 --- hw/scsi-disk.c | 8 ++++++++ hw/scsi-generic.c | 2 ++ hw/usb-msd.c | 8 -------- hw/virtio-blk.c | 1 - hw/virtio-pci.c | 9 +++++++++ sysemu.h | 3 +-- vl.c | 16 +++++----------- 9 files changed, 25 insertions(+), 43 deletions(-) diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 69779ca..c0cfd31 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -62,21 +62,3 @@ void destroy_nic(dev_match_fn *match_fn, void *arg) } } } - -void destroy_bdrvs(dev_match_fn *match_fn, void *arg) -{ - DriveInfo *dinfo; - struct BlockDriverState *bs; - - QTAILQ_FOREACH(dinfo, &drives, next) { - bs = dinfo->bdrv; - if (bs) { - if (bs->private && match_fn(bs->private, arg)) { - drive_uninit(bs); - bdrv_delete(bs); - } - } - } -} - - diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index ac3d1ae..6a08555 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -230,9 +230,6 @@ void pci_device_hot_remove_success(PCIDevice *d) class_code = d->config_read(d, PCI_CLASS_DEVICE+1, 1); switch(class_code) { - case PCI_BASE_CLASS_STORAGE: - destroy_bdrvs(pci_match_fn, d); - break; case PCI_BASE_CLASS_NETWORK: destroy_nic(pci_match_fn, d); break; diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 0f029f8..3940726 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -936,6 +936,13 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, } } +static void scsi_destroy(SCSIDevice *dev) +{ + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); + + drive_uninit(s->dinfo); +} + static int scsi_disk_initfn(SCSIDevice *dev) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); @@ -969,6 +976,7 @@ static SCSIDeviceInfo scsi_disk_info = { .qdev.desc = "virtual scsi disk or cdrom", .qdev.size = sizeof(SCSIDiskState), .init = scsi_disk_initfn, + .destroy = scsi_destroy, .send_command = scsi_send_command, .read_data = scsi_read_data, .write_data = scsi_write_data, diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index 86d1e54..6a89989 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -668,6 +668,8 @@ static void scsi_destroy(SCSIDevice *d) qemu_free(r); r = n; } + + drive_uninit(s->dinfo); } static int scsi_generic_initfn(SCSIDevice *dev) diff --git a/hw/usb-msd.c b/hw/usb-msd.c index a19b31d..e090014 100644 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@ -508,13 +508,6 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p) return ret; } -static void usb_msd_handle_destroy(USBDevice *dev) -{ - MSDState *s = (MSDState *)dev; - - drive_uninit(s->dinfo->bdrv); -} - static int usb_msd_initfn(USBDevice *dev) { MSDState *s = DO_UPCAST(MSDState, dev, dev); @@ -599,7 +592,6 @@ static struct USBDeviceInfo msd_info = { .handle_reset = usb_msd_handle_reset, .handle_control = usb_msd_handle_control, .handle_data = usb_msd_handle_data, - .handle_destroy = usb_msd_handle_destroy, .qdev.props = (Property[]) { DEFINE_PROP_DRIVE("drive", MSDState, dinfo), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 2d6d71a..2630b99 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -504,7 +504,6 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, DriveInfo *dinfo) strncpy(s->serial_str, ps, sizeof(s->serial_str)); else snprintf(s->serial_str, sizeof(s->serial_str), "0"); - s->bs->private = dev; bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs); bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index c6fbaac..7b86bfc 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -458,6 +458,14 @@ static int virtio_blk_init_pci(PCIDevice *pci_dev) return 0; } +static int virtio_blk_exit_pci(PCIDevice *pci_dev) +{ + VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + + drive_uninit(proxy->dinfo); + return 0; +} + static int virtio_console_init_pci(PCIDevice *pci_dev) { VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); @@ -519,6 +527,7 @@ static PCIDeviceInfo virtio_info[] = { .qdev.name = "virtio-blk-pci", .qdev.size = sizeof(VirtIOPCIProxy), .init = virtio_blk_init_pci, + .exit = virtio_blk_exit_pci, .qdev.props = (Property[]) { DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0), DEFINE_PROP_DRIVE("drive", VirtIOPCIProxy, dinfo), diff --git a/sysemu.h b/sysemu.h index 0ebbb03..3f0d3bf 100644 --- a/sysemu.h +++ b/sysemu.h @@ -188,7 +188,7 @@ extern QTAILQ_HEAD(driveoptlist, DriveOpt) driveopts; extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); extern DriveInfo *drive_get_by_id(const char *id); extern int drive_get_max_bus(BlockInterfaceType type); -extern void drive_uninit(BlockDriverState *bdrv); +extern void drive_uninit(DriveInfo *dinfo); extern const char *drive_get_serial(BlockDriverState *bdrv); extern BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv); @@ -203,7 +203,6 @@ typedef int (dev_match_fn)(void *dev_private, void *arg); DriveInfo *add_init_drive(const char *opts); void destroy_nic(dev_match_fn *match_fn, void *arg); -void destroy_bdrvs(dev_match_fn *match_fn, void *arg); /* pci-hotplug */ void pci_device_hot_add(Monitor *mon, const QDict *qdict); diff --git a/vl.c b/vl.c index 7df9328..3f4bb22 100644 --- a/vl.c +++ b/vl.c @@ -1875,18 +1875,12 @@ static void bdrv_format_print(void *opaque, const char *name) fprintf(stderr, " %s", name); } -void drive_uninit(BlockDriverState *bdrv) +void drive_uninit(DriveInfo *dinfo) { - DriveInfo *dinfo; - - QTAILQ_FOREACH(dinfo, &drives, next) { - if (dinfo->bdrv != bdrv) - continue; - qemu_opts_del(dinfo->opts); - QTAILQ_REMOVE(&drives, dinfo, next); - qemu_free(dinfo); - break; - } + qemu_opts_del(dinfo->opts); + bdrv_delete(dinfo->bdrv); + QTAILQ_REMOVE(&drives, dinfo, next); + qemu_free(dinfo); } DriveInfo *drive_init(QemuOpts *opts, void *opaque, -- 1.6.2.5