Now we have blockdev-replace QMP command, which depend on a possibility to select any block parent (block node, block export, or qdev) by one unique name. The command fails, if name is ambiguous (i.e., match several parents of different types). In future we want to rid of this ambiguity.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- block.c | 12 ++++++++++++ block/export/export.c | 13 +++++++++++++ docs/about/deprecated.rst | 10 ++++++++++ include/block/block-global-state.h | 1 + include/system/block-backend-global-state.h | 2 ++ stubs/blk-by-qdev-id.c | 5 +++++ stubs/blk-exp-find-by-blk.c | 4 ++++ system/qdev-monitor.c | 16 ++++++++++++++++ 8 files changed, 63 insertions(+) diff --git a/block.c b/block.c index 8254d57212..5eae8b8623 100644 --- a/block.c +++ b/block.c @@ -1649,6 +1649,9 @@ static void bdrv_assign_node_name(BlockDriverState *bs, goto out; } + warn_device_exists(node_name); + warn_block_export_exists(node_name); + /* copy node name into the bs and insert it into the graph list */ pstrcpy(bs->node_name, sizeof(bs->node_name), node_name); QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list); @@ -6233,6 +6236,15 @@ BlockDriverState *bdrv_find_node(const char *node_name) return NULL; } +void warn_block_node_exists(const char *node_name) +{ + if (bdrv_find_node(node_name)) { + warn_report("block node already exist with name '%s'. " + "Ambigous identifiers are deprecated. " + "In future that would be an error.", node_name); + } +} + /* Put this QMP function here so it can access the static graph_bdrv_states. */ BlockDeviceInfoList *bdrv_named_nodes_list(bool flat, Error **errp) diff --git a/block/export/export.c b/block/export/export.c index 9169b43e13..e65d1bec8e 100644 --- a/block/export/export.c +++ b/block/export/export.c @@ -23,6 +23,7 @@ #include "qapi/qapi-commands-block-export.h" #include "qapi/qapi-events-block-export.h" #include "qemu/id.h" +#include "qemu/error-report.h" #ifdef CONFIG_VHOST_USER_BLK_SERVER #include "vhost-user-blk-server.h" #endif @@ -108,6 +109,9 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp) return NULL; } + warn_device_exists(export->id); + warn_block_node_exists(export->id); + drv = blk_exp_find_driver(export->type); if (!drv) { error_setg(errp, "No driver found for the requested export type"); @@ -384,6 +388,15 @@ BlockExportInfoList *qmp_query_block_exports(Error **errp) return head; } +void warn_block_export_exists(const char *id) +{ + if (blk_exp_find(id)) { + warn_report("block-export already exist with name '%s'. " + "Ambigous identifiers are deprecated. " + "In future that would be an error.", id); + } +} + BlockBackend *blk_by_export_id(const char *id, Error **errp) { BlockExport *exp; diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 88efa3aa80..18bb1eeafc 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -551,3 +551,13 @@ command documentation for details on the ``fdset`` usage. The ``zero-blocks`` capability was part of the block migration which doesn't exist anymore since it was removed in QEMU v9.1. + +Identifiers +----------- + +Possibility to intersect qdev ids/paths, block node names, and block +export names namespaces is deprecated. In future that would be +abandoned and all block exports, block nodes and devices will have +unique names. Now, reusing the name for another type of object (for +example, creating block-node with node-name equal to existing qdev +id) produce a warning. diff --git a/include/block/block-global-state.h b/include/block/block-global-state.h index ed89999f0f..ea50478fc4 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -207,6 +207,7 @@ void bdrv_aio_cancel(BlockAIOCB *acb); int bdrv_has_zero_init_1(BlockDriverState *bs); int coroutine_mixed_fn GRAPH_RDLOCK bdrv_has_zero_init(BlockDriverState *bs); BlockDriverState *bdrv_find_node(const char *node_name); +void warn_block_node_exists(const char *node_name); BlockDeviceInfoList *bdrv_named_nodes_list(bool flat, Error **errp); XDbgBlockGraph * GRAPH_RDLOCK bdrv_get_xdbg_block_graph(Error **errp); BlockDriverState *bdrv_lookup_bs(const char *device, diff --git a/include/system/block-backend-global-state.h b/include/system/block-backend-global-state.h index f23b9f1518..69e6aee618 100644 --- a/include/system/block-backend-global-state.h +++ b/include/system/block-backend-global-state.h @@ -73,6 +73,8 @@ DeviceState *blk_get_attached_dev(BlockBackend *blk); BlockBackend *blk_by_dev(void *dev); BlockBackend *blk_by_qdev_id(const char *id, Error **errp); BlockBackend *blk_by_export_id(const char *id, Error **errp); +void warn_block_export_exists(const char *id); +void warn_device_exists(const char *id); void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque); int blk_make_zero(BlockBackend *blk, BdrvRequestFlags flags); diff --git a/stubs/blk-by-qdev-id.c b/stubs/blk-by-qdev-id.c index 66ead77f4d..c83a2dde0d 100644 --- a/stubs/blk-by-qdev-id.c +++ b/stubs/blk-by-qdev-id.c @@ -11,3 +11,8 @@ BlockBackend *blk_by_qdev_id(const char *id, Error **errp) error_setg(errp, "Parameter 'parent-type' does not accept value 'qdev'"); return NULL; } + +void warn_device_exists(const char *id) +{ + /* do nothing */ +} diff --git a/stubs/blk-exp-find-by-blk.c b/stubs/blk-exp-find-by-blk.c index 20f7ff1bdd..a98c4572fc 100644 --- a/stubs/blk-exp-find-by-blk.c +++ b/stubs/blk-exp-find-by-blk.c @@ -7,3 +7,7 @@ BlockExport *blk_exp_find_by_blk(BlockBackend *blk) return NULL; } +void warn_block_export_exists(const char *id) +{ + /* do nothing */ +} diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index be18902bb2..67b9da952d 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -605,6 +605,8 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp) OBJECT(dev), NULL); if (prop) { dev->id = id; + warn_block_export_exists(id); + warn_block_node_exists(id); } else { error_setg(errp, "Duplicate device ID '%s'", id); g_free(id); @@ -903,6 +905,20 @@ static DeviceState *find_device_state(const char *id, bool use_generic_error, return dev; } +void warn_device_exists(const char *id) +{ + Object *obj = object_resolve_path_at(qdev_get_peripheral(), id); + + if (obj) { + DeviceState *dev = (DeviceState *)object_dynamic_cast(obj, TYPE_DEVICE); + + warn_report("%s '%s' already exist. " + "Ambigous identifiers are deprecated. " + "In future that would be an error.", + dev ? "Device" : "Object", id); + } +} + void qdev_unplug(DeviceState *dev, Error **errp) { HotplugHandler *hotplug_ctrl; -- 2.52.0
