We need it for further blockdev-replace functionality.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
block/export/export.c | 18 ++++++++++++++++++
include/sysemu/block-backend-global-state.h | 1 +
2 files changed, 19 insertions(+)
diff --git a/block/export/export.c b/block/export/export.c
index 6d51ae8ed7..57beae7982 100644
--- a/block/export/export.c
+++ b/block/export/export.c
@@ -355,3 +355,21 @@ BlockExportInfoList *qmp_query_block_exports(Error **errp)
return head;
}
+
+BlockBackend *blk_by_export_id(const char *id, Error **errp)
+{
+ BlockExport *exp;
+
+ exp = blk_exp_find(id);
+ if (exp == NULL) {
+ error_setg(errp, "Export '%s' not found", id);
+ return NULL;
+ }
+
+ if (!exp->blk) {
+ error_setg(errp, "Export '%s' is empty", id);
+ return NULL;
+ }
+
+ return exp->blk;
+}
diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/block-backend-global-state.h
index ccb35546a1..410d0cc5c7 100644
--- a/include/sysemu/block-backend-global-state.h
+++ b/include/sysemu/block-backend-global-state.h
@@ -74,6 +74,7 @@ void blk_detach_dev(BlockBackend *blk, DeviceState *dev);
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 blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque);
void blk_activate(BlockBackend *blk, Error **errp);
--
2.34.1
Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes:
> We need it for further blockdev-replace functionality.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
> block/export/export.c | 18 ++++++++++++++++++
> include/sysemu/block-backend-global-state.h | 1 +
> 2 files changed, 19 insertions(+)
>
> diff --git a/block/export/export.c b/block/export/export.c
> index 6d51ae8ed7..57beae7982 100644
> --- a/block/export/export.c
> +++ b/block/export/export.c
> @@ -355,3 +355,21 @@ BlockExportInfoList *qmp_query_block_exports(Error **errp)
>
> return head;
> }
> +
> +BlockBackend *blk_by_export_id(const char *id, Error **errp)
> +{
> + BlockExport *exp;
> +
> + exp = blk_exp_find(id);
> + if (exp == NULL) {
> + error_setg(errp, "Export '%s' not found", id);
> + return NULL;
> + }
> +
> + if (!exp->blk) {
> + error_setg(errp, "Export '%s' is empty", id);
Can this happen?
> + return NULL;
> + }
> +
> + return exp->blk;
> +}
> diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/block-backend-global-state.h
> index ccb35546a1..410d0cc5c7 100644
> --- a/include/sysemu/block-backend-global-state.h
> +++ b/include/sysemu/block-backend-global-state.h
> @@ -74,6 +74,7 @@ void blk_detach_dev(BlockBackend *blk, DeviceState *dev);
> 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 blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque);
>
> void blk_activate(BlockBackend *blk, Error **errp);
On 18.07.24 14:48, Markus Armbruster wrote:
> Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes:
>
>> We need it for further blockdev-replace functionality.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>> ---
>> block/export/export.c | 18 ++++++++++++++++++
>> include/sysemu/block-backend-global-state.h | 1 +
>> 2 files changed, 19 insertions(+)
>>
>> diff --git a/block/export/export.c b/block/export/export.c
>> index 6d51ae8ed7..57beae7982 100644
>> --- a/block/export/export.c
>> +++ b/block/export/export.c
>> @@ -355,3 +355,21 @@ BlockExportInfoList *qmp_query_block_exports(Error **errp)
>>
>> return head;
>> }
>> +
>> +BlockBackend *blk_by_export_id(const char *id, Error **errp)
>> +{
>> + BlockExport *exp;
>> +
>> + exp = blk_exp_find(id);
>> + if (exp == NULL) {
>> + error_setg(errp, "Export '%s' not found", id);
>> + return NULL;
>> + }
>> +
>> + if (!exp->blk) {
>> + error_setg(errp, "Export '%s' is empty", id);
>
> Can this happen?
>
Hmm, looking at the code in blk_exp_add:
assert(exp->blk != NULL);
QLIST_INSERT_HEAD(&block_exports, exp, next);
return exp;
seems not. And I can't find anything changing exp->blk except for blk_exp_add().
Will switch to assertion.
>> + return NULL;
>> + }
>> +
>> + return exp->blk;
>> +}
>> diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/block-backend-global-state.h
>> index ccb35546a1..410d0cc5c7 100644
>> --- a/include/sysemu/block-backend-global-state.h
>> +++ b/include/sysemu/block-backend-global-state.h
>> @@ -74,6 +74,7 @@ void blk_detach_dev(BlockBackend *blk, DeviceState *dev);
>> 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 blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque);
>>
>> void blk_activate(BlockBackend *blk, Error **errp);
>
--
Best regards,
Vladimir
© 2016 - 2025 Red Hat, Inc.