From patchwork Wed Aug 3 13:07:40 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Markus Armbruster X-Patchwork-Id: 108196 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6E265B71C5 for ; Wed, 3 Aug 2011 23:46:32 +1000 (EST) Received: from localhost ([::1]:48424 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QobCj-0003cF-AE for incoming@patchwork.ozlabs.org; Wed, 03 Aug 2011 09:09:45 -0400 Received: from eggs.gnu.org ([140.186.70.92]:47261) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QobBW-0000Cz-Fy for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:08:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QobBU-00018c-Tz for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:08:30 -0400 Received: from oxygen.pond.sub.org ([78.46.104.156]:52205) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QobBU-000186-IQ for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:08:28 -0400 Received: from blackfin.pond.sub.org (p5B32D904.dip.t-dialin.net [91.50.217.4]) by oxygen.pond.sub.org (Postfix) with ESMTPA id 38C50A2C89; Wed, 3 Aug 2011 15:08:24 +0200 (CEST) Received: by blackfin.pond.sub.org (Postfix, from userid 500) id 56E7D60013; Wed, 3 Aug 2011 15:08:24 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Wed, 3 Aug 2011 15:07:40 +0200 Message-Id: <1312376904-16115-2-git-send-email-armbru@redhat.com> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1312376904-16115-1-git-send-email-armbru@redhat.com> References: <1312376904-16115-1-git-send-email-armbru@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 78.46.104.156 Cc: kwolf@redhat.com, quintela@redhat.com, stefano.stabellini@eu.citrix.com, lcapitulino@redhat.com, hare@suse.de, amit.shah@redhat.com, hch@lst.de Subject: [Qemu-devel] [PATCH v2 01/45] block: Attach non-qdev devices as well X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org For now, this just protects against programming errors like having the same drive back multiple non-qdev devices, or untimely bdrv_delete(). Later commits will add other interesting uses. While there, rename BlockDriverState member peer to dev, bdrv_attach() to bdrv_attach_dev(), bdrv_detach() to bdrv_detach_dev(), and bdrv_get_attached() to bdrv_get_attached_dev(). Signed-off-by: Markus Armbruster --- block.c | 29 ++++++++++++++++++++--------- block.h | 7 ++++--- block_int.h | 3 ++- blockdev.c | 5 ++--- hw/ide/core.c | 1 + hw/ide/piix.c | 4 ++-- hw/onenand.c | 4 +++- hw/pflash_cfi01.c | 1 + hw/pflash_cfi02.c | 1 + hw/qdev-properties.c | 6 +++--- hw/sd.c | 1 + hw/usb-msd.c | 2 +- hw/xen_disk.c | 1 + 13 files changed, 42 insertions(+), 23 deletions(-) diff --git a/block.c b/block.c index 4826fd8..10a39f1 100644 --- a/block.c +++ b/block.c @@ -728,7 +728,7 @@ void bdrv_make_anon(BlockDriverState *bs) void bdrv_delete(BlockDriverState *bs) { - assert(!bs->peer); + assert(!bs->dev); /* remove from list, if necessary */ bdrv_make_anon(bs); @@ -742,26 +742,37 @@ void bdrv_delete(BlockDriverState *bs) qemu_free(bs); } -int bdrv_attach(BlockDriverState *bs, DeviceState *qdev) +int bdrv_attach_dev(BlockDriverState *bs, void *dev) +/* TODO change to DeviceState *dev when all users are qdevified */ { - if (bs->peer) { + if (bs->dev) { return -EBUSY; } - bs->peer = qdev; + bs->dev = dev; return 0; } -void bdrv_detach(BlockDriverState *bs, DeviceState *qdev) +/* TODO qdevified devices don't use this, remove when devices are qdevified */ +void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev) { - assert(bs->peer == qdev); - bs->peer = NULL; + if (bdrv_attach_dev(bs, dev) < 0) { + abort(); + } +} + +void bdrv_detach_dev(BlockDriverState *bs, void *dev) +/* TODO change to DeviceState *dev when all users are qdevified */ +{ + assert(bs->dev == dev); + bs->dev = NULL; bs->change_cb = NULL; bs->change_opaque = NULL; } -DeviceState *bdrv_get_attached(BlockDriverState *bs) +/* TODO change to return DeviceState * when all users are qdevified */ +void *bdrv_get_attached_dev(BlockDriverState *bs) { - return bs->peer; + return bs->dev; } /* diff --git a/block.h b/block.h index a3bfaaf..a82b0cd 100644 --- a/block.h +++ b/block.h @@ -73,9 +73,10 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); int bdrv_open(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv); void bdrv_close(BlockDriverState *bs); -int bdrv_attach(BlockDriverState *bs, DeviceState *qdev); -void bdrv_detach(BlockDriverState *bs, DeviceState *qdev); -DeviceState *bdrv_get_attached(BlockDriverState *bs); +int bdrv_attach_dev(BlockDriverState *bs, void *dev); +void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev); +void bdrv_detach_dev(BlockDriverState *bs, void *dev); +void *bdrv_get_attached_dev(BlockDriverState *bs); int bdrv_read(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors); int bdrv_write(BlockDriverState *bs, int64_t sector_num, diff --git a/block_int.h b/block_int.h index f6d02b3..cf7b7e7 100644 --- a/block_int.h +++ b/block_int.h @@ -167,7 +167,8 @@ struct BlockDriverState { BlockDriver *drv; /* NULL means no media */ void *opaque; - DeviceState *peer; + void *dev; /* attached device model, if any */ + /* TODO change to DeviceState when all users are qdevified */ char filename[1024]; char backing_file[1024]; /* if non zero, the image is a diff of diff --git a/blockdev.c b/blockdev.c index a25367a..40f061a 100644 --- a/blockdev.c +++ b/blockdev.c @@ -14,7 +14,6 @@ #include "qemu-option.h" #include "qemu-config.h" #include "sysemu.h" -#include "hw/qdev.h" #include "block_int.h" static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives); @@ -747,12 +746,12 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) bdrv_flush(bs); bdrv_close(bs); - /* if we have a device associated with this BlockDriverState (bs->peer) + /* if we have a device attached to this BlockDriverState * then we need to make the drive anonymous until the device * can be removed. If this is a drive with no device backing * then we can just get rid of the block driver state right here. */ - if (bs->peer) { + if (bdrv_get_attached_dev(bs)) { bdrv_make_anon(bs); } else { drive_uninit(drive_get_by_blockdev(bs)); diff --git a/hw/ide/core.c b/hw/ide/core.c index d145b19..bcef8bc 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1865,6 +1865,7 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0, error_report("Can't set up IDE drive %s", dinfo->id); exit(1); } + bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]); } else { ide_reset(&bus->ifs[i]); } diff --git a/hw/ide/piix.c b/hw/ide/piix.c index f527dbd..00fb683 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -162,9 +162,9 @@ static int pci_piix3_xen_ide_unplug(DeviceState *dev) for (; i < 3; i++) { di = drive_get_by_index(IF_IDE, i); if (di != NULL && di->bdrv != NULL && !di->bdrv->removable) { - DeviceState *ds = bdrv_get_attached(di->bdrv); + DeviceState *ds = bdrv_get_attached_dev(di->bdrv); if (ds) { - bdrv_detach(di->bdrv, ds); + bdrv_detach_dev(di->bdrv, ds); } bdrv_close(di->bdrv); pci_ide->bus[di->bus].ifs[di->unit].bs = NULL; diff --git a/hw/onenand.c b/hw/onenand.c index b0cbebc..f2a5f5d 100644 --- a/hw/onenand.c +++ b/hw/onenand.c @@ -717,7 +717,9 @@ void *onenand_init(BlockDriverState *bdrv, s->iomemtype = cpu_register_io_memory(onenand_readfn, onenand_writefn, s, DEVICE_NATIVE_ENDIAN); s->bdrv = bdrv; - if (!s->bdrv) { + if (s->bdrv) { + bdrv_attach_dev_nofail(s->bdrv, s); + } else { s->image = memset(qemu_malloc(size + (size >> 5)), 0xff, size + (size >> 5)); } diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index 90fdc84..285e385 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -620,6 +620,7 @@ pflash_t *pflash_cfi01_register(target_phys_addr_t base, ram_addr_t off, qemu_free(pfl); return NULL; } + bdrv_attach_dev_nofail(pfl->bs, pfl); } #if 0 /* XXX: there should be a bit to set up read-only, * the same way the hardware does (with WP pin). diff --git a/hw/pflash_cfi02.c b/hw/pflash_cfi02.c index 725cd1e..059824d 100644 --- a/hw/pflash_cfi02.c +++ b/hw/pflash_cfi02.c @@ -643,6 +643,7 @@ pflash_t *pflash_cfi02_register(target_phys_addr_t base, ram_addr_t off, qemu_free(pfl); return NULL; } + bdrv_attach_dev_nofail(pfl->bs, pfl); } #if 0 /* XXX: there should be a bit to set up read-only, * the same way the hardware does (with WP pin). diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index eff2d24..f06b317 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -312,7 +312,7 @@ static int parse_drive(DeviceState *dev, Property *prop, const char *str) bs = bdrv_find(str); if (bs == NULL) return -ENOENT; - if (bdrv_attach(bs, dev) < 0) + if (bdrv_attach_dev(bs, dev) < 0) return -EEXIST; *ptr = bs; return 0; @@ -323,7 +323,7 @@ static void free_drive(DeviceState *dev, Property *prop) BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop); if (*ptr) { - bdrv_detach(*ptr, dev); + bdrv_detach_dev(*ptr, dev); blockdev_auto_del(*ptr); } } @@ -678,7 +678,7 @@ int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *va { int res; - res = bdrv_attach(value, dev); + res = bdrv_attach_dev(value, dev); if (res < 0) { error_report("Can't attach drive %s to %s.%s: %s", bdrv_get_device_name(value), diff --git a/hw/sd.c b/hw/sd.c index c2c80ab..8d42ee2 100644 --- a/hw/sd.c +++ b/hw/sd.c @@ -449,6 +449,7 @@ SDState *sd_init(BlockDriverState *bs, int is_spi) sd->enable = 1; sd_reset(sd, bs); if (sd->bdrv) { + bdrv_attach_dev_nofail(sd->bdrv, sd); bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd); } return sd; diff --git a/hw/usb-msd.c b/hw/usb-msd.c index cdeac58..3edc25c 100644 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@ -523,7 +523,7 @@ static int usb_msd_initfn(USBDevice *dev) * * The hack is probably a bad idea. */ - bdrv_detach(bs, &s->dev.qdev); + bdrv_detach_dev(bs, &s->dev.qdev); s->conf.bs = NULL; if (!s->serial) { diff --git a/hw/xen_disk.c b/hw/xen_disk.c index add815f..89fe824 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -692,6 +692,7 @@ static int blk_init(struct XenDevice *xendev) xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n"); blkdev->bs = blkdev->dinfo->bdrv; } + bdrv_attach_dev_nofail(blkdev->bs, blkdev); blkdev->file_blk = BLOCK_SIZE; blkdev->file_size = bdrv_getlength(blkdev->bs); if (blkdev->file_size < 0) {