@@ -2089,7 +2089,7 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
}
/* bs_new must be unattached and shouldn't have anything fancy enabled */
- assert(!bs_new->blk);
+ assert(!blk_is_attached(bs_new->blk));
assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
assert(bs_new->job == NULL);
assert(bs_new->io_limits_enabled == false);
@@ -2106,7 +2106,7 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
bdrv_move_feature_fields(bs_new, &tmp);
/* bs_new must remain unattached */
- assert(!bs_new->blk);
+ assert(!blk_is_attached(bs_new->blk));
/* Check a few fields that should remain attached to the device */
assert(bs_new->job == NULL);
@@ -368,6 +368,15 @@ void blk_enable_attach_dev(BlockBackend *blk)
}
/*
+ * Return true if a device model is attached to @blk already,
+ * otherwise, return false.
+ */
+bool blk_is_attached(BlockBackend *blk)
+{
+ return blk != NULL && blk->dev != NULL && blk->dev != (void *)-1;
+}
+
+/*
* Set @blk's device model callbacks to @ops.
* @opaque is the opaque argument to pass to the callbacks.
* This is for use by device models.
@@ -82,6 +82,7 @@ void blk_detach_dev(BlockBackend *blk, void *dev);
void *blk_get_attached_dev(BlockBackend *blk);
int blk_disable_attach_dev(BlockBackend *blk);
void blk_enable_attach_dev(BlockBackend *blk);
+bool blk_is_attached(BlockBackend *blk);
void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque);
int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
int nb_sectors);
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> --- block.c | 4 ++-- block/block-backend.c | 9 +++++++++ include/sysemu/block-backend.h | 1 + 3 files changed, 12 insertions(+), 2 deletions(-)