[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/10] block-backend: Remember if attached device is
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 06/10] block-backend: Remember if attached device is non-qdev |
Date: |
Fri, 7 Oct 2016 15:42:55 +0200 |
Almost all block devices are qdevified by now. This allows us to go back
from the BlockBackend to the DeviceState. xen_disk is the last device
that is missing. We'll remember in the BlockBackend if a xen_disk is
attached and can then disable any features that require going from a BB
to the DeviceState.
While at it, clearly mark the function used by xen_disk as legacy even
in its name, not just in TODO comments.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
block/block-backend.c | 28 ++++++++++++++++++++--------
hw/block/xen_disk.c | 2 +-
include/sysemu/block-backend.h | 4 ++--
3 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/block/block-backend.c b/block/block-backend.c
index 27ddacb..d97afa1 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -38,6 +38,7 @@ struct BlockBackend {
BlockBackendPublic public;
void *dev; /* attached device model, if any */
+ bool legacy_dev; /* true if dev is not a DeviceState */
/* TODO change to DeviceState when all users are qdevified */
const BlockDevOps *dev_ops;
void *dev_opaque;
@@ -506,32 +507,38 @@ void blk_insert_bs(BlockBackend *blk, BlockDriverState
*bs)
}
}
-/*
- * Attach device model @dev to @blk.
- * Return 0 on success, -EBUSY when a device model is attached already.
- */
-int blk_attach_dev(BlockBackend *blk, void *dev)
-/* TODO change to DeviceState *dev when all users are qdevified */
+static int blk_do_attach_dev(BlockBackend *blk, void *dev)
{
if (blk->dev) {
return -EBUSY;
}
blk_ref(blk);
blk->dev = dev;
+ blk->legacy_dev = false;
blk_iostatus_reset(blk);
return 0;
}
/*
* Attach device model @dev to @blk.
+ * Return 0 on success, -EBUSY when a device model is attached already.
+ */
+int blk_attach_dev(BlockBackend *blk, DeviceState *dev)
+{
+ return blk_do_attach_dev(blk, dev);
+}
+
+/*
+ * Attach device model @dev to @blk.
* @blk must not have a device model attached already.
* TODO qdevified devices don't use this, remove when devices are qdevified
*/
-void blk_attach_dev_nofail(BlockBackend *blk, void *dev)
+void blk_attach_dev_legacy(BlockBackend *blk, void *dev)
{
- if (blk_attach_dev(blk, dev) < 0) {
+ if (blk_do_attach_dev(blk, dev) < 0) {
abort();
}
+ blk->legacy_dev = true;
}
/*
@@ -585,6 +592,11 @@ BlockBackend *blk_by_dev(void *dev)
void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops,
void *opaque)
{
+ /* All drivers that use blk_set_dev_ops() are qdevified and we want to keep
+ * it that way, so we can assume blk->dev is a DeviceState if blk->dev_ops
+ * is set. */
+ assert(!blk->legacy_dev);
+
blk->dev_ops = ops;
blk->dev_opaque = opaque;
}
diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
index 5aa350a..1292a4b 100644
--- a/hw/block/xen_disk.c
+++ b/hw/block/xen_disk.c
@@ -1079,7 +1079,7 @@ static int blk_connect(struct XenDevice *xendev)
* so we can blk_unref() unconditionally */
blk_ref(blkdev->blk);
}
- blk_attach_dev_nofail(blkdev->blk, blkdev);
+ blk_attach_dev_legacy(blkdev->blk, blkdev);
blkdev->file_size = blk_getlength(blkdev->blk);
if (blkdev->file_size < 0) {
BlockDriverState *bs = blk_bs(blkdev->blk);
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index a7993af..b07159b 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -107,8 +107,8 @@ BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk);
void blk_iostatus_disable(BlockBackend *blk);
void blk_iostatus_reset(BlockBackend *blk);
void blk_iostatus_set_err(BlockBackend *blk, int error);
-int blk_attach_dev(BlockBackend *blk, void *dev);
-void blk_attach_dev_nofail(BlockBackend *blk, void *dev);
+int blk_attach_dev(BlockBackend *blk, DeviceState *dev);
+void blk_attach_dev_legacy(BlockBackend *blk, void *dev);
void blk_detach_dev(BlockBackend *blk, void *dev);
void *blk_get_attached_dev(BlockBackend *blk);
BlockBackend *blk_by_dev(void *dev);
--
1.8.3.1
- [Qemu-devel] [PULL 00/10] Block layer patches, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 01/10] block: use bdrv_add_before_write_notifier, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 04/10] block: Add bdrv_runtime_opts to query-command-line-options, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 05/10] block: Add node name to BLOCK_IO_ERROR event, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 03/10] block: use aio_bh_schedule_oneshot, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 02/10] async: add aio_bh_schedule_oneshot, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 07/10] block: Add qdev ID to DEVICE_TRAY_MOVED, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 08/10] scripts: Allow block module to not define BlockDriver, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 06/10] block-backend: Remember if attached device is non-qdev,
Kevin Wolf <=
- [Qemu-devel] [PULL 09/10] module: Don't load the same module if requested multiple times, Kevin Wolf, 2016/10/07
- [Qemu-devel] [PULL 10/10] dmg: Move libbz2 code to dmg-bz2.so, Kevin Wolf, 2016/10/07
- Re: [Qemu-devel] [PULL 00/10] Block layer patches, Peter Maydell, 2016/10/10