mirror of https://github.com/xemu-project/xemu.git
block: Add BdrvChildRole.get_parent_desc()
For meaningful error messages in the permission system, we need to get some human-readable description of the parent of a BdrvChild. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Acked-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
c6cc12bfa7
commit
b541155587
9
block.c
9
block.c
|
@ -707,6 +707,12 @@ int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *bdrv_child_get_parent_desc(BdrvChild *c)
|
||||||
|
{
|
||||||
|
BlockDriverState *parent = c->opaque;
|
||||||
|
return g_strdup(bdrv_get_device_or_node_name(parent));
|
||||||
|
}
|
||||||
|
|
||||||
static void bdrv_child_cb_drained_begin(BdrvChild *child)
|
static void bdrv_child_cb_drained_begin(BdrvChild *child)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = child->opaque;
|
BlockDriverState *bs = child->opaque;
|
||||||
|
@ -774,6 +780,7 @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options,
|
||||||
}
|
}
|
||||||
|
|
||||||
const BdrvChildRole child_file = {
|
const BdrvChildRole child_file = {
|
||||||
|
.get_parent_desc = bdrv_child_get_parent_desc,
|
||||||
.inherit_options = bdrv_inherited_options,
|
.inherit_options = bdrv_inherited_options,
|
||||||
.drained_begin = bdrv_child_cb_drained_begin,
|
.drained_begin = bdrv_child_cb_drained_begin,
|
||||||
.drained_end = bdrv_child_cb_drained_end,
|
.drained_end = bdrv_child_cb_drained_end,
|
||||||
|
@ -794,6 +801,7 @@ static void bdrv_inherited_fmt_options(int *child_flags, QDict *child_options,
|
||||||
}
|
}
|
||||||
|
|
||||||
const BdrvChildRole child_format = {
|
const BdrvChildRole child_format = {
|
||||||
|
.get_parent_desc = bdrv_child_get_parent_desc,
|
||||||
.inherit_options = bdrv_inherited_fmt_options,
|
.inherit_options = bdrv_inherited_fmt_options,
|
||||||
.drained_begin = bdrv_child_cb_drained_begin,
|
.drained_begin = bdrv_child_cb_drained_begin,
|
||||||
.drained_end = bdrv_child_cb_drained_end,
|
.drained_end = bdrv_child_cb_drained_end,
|
||||||
|
@ -824,6 +832,7 @@ static void bdrv_backing_options(int *child_flags, QDict *child_options,
|
||||||
}
|
}
|
||||||
|
|
||||||
const BdrvChildRole child_backing = {
|
const BdrvChildRole child_backing = {
|
||||||
|
.get_parent_desc = bdrv_child_get_parent_desc,
|
||||||
.inherit_options = bdrv_backing_options,
|
.inherit_options = bdrv_backing_options,
|
||||||
.drained_begin = bdrv_child_cb_drained_begin,
|
.drained_begin = bdrv_child_cb_drained_begin,
|
||||||
.drained_end = bdrv_child_cb_drained_end,
|
.drained_end = bdrv_child_cb_drained_end,
|
||||||
|
|
|
@ -80,6 +80,7 @@ static const AIOCBInfo block_backend_aiocb_info = {
|
||||||
|
|
||||||
static void drive_info_del(DriveInfo *dinfo);
|
static void drive_info_del(DriveInfo *dinfo);
|
||||||
static BlockBackend *bdrv_first_blk(BlockDriverState *bs);
|
static BlockBackend *bdrv_first_blk(BlockDriverState *bs);
|
||||||
|
static char *blk_get_attached_dev_id(BlockBackend *blk);
|
||||||
|
|
||||||
/* All BlockBackends */
|
/* All BlockBackends */
|
||||||
static QTAILQ_HEAD(, BlockBackend) block_backends =
|
static QTAILQ_HEAD(, BlockBackend) block_backends =
|
||||||
|
@ -102,6 +103,25 @@ static void blk_root_drained_end(BdrvChild *child);
|
||||||
static void blk_root_change_media(BdrvChild *child, bool load);
|
static void blk_root_change_media(BdrvChild *child, bool load);
|
||||||
static void blk_root_resize(BdrvChild *child);
|
static void blk_root_resize(BdrvChild *child);
|
||||||
|
|
||||||
|
static char *blk_root_get_parent_desc(BdrvChild *child)
|
||||||
|
{
|
||||||
|
BlockBackend *blk = child->opaque;
|
||||||
|
char *dev_id;
|
||||||
|
|
||||||
|
if (blk->name) {
|
||||||
|
return g_strdup(blk->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_id = blk_get_attached_dev_id(blk);
|
||||||
|
if (*dev_id) {
|
||||||
|
return dev_id;
|
||||||
|
} else {
|
||||||
|
/* TODO Callback into the BB owner for something more detailed */
|
||||||
|
g_free(dev_id);
|
||||||
|
return g_strdup("a block device");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const char *blk_root_get_name(BdrvChild *child)
|
static const char *blk_root_get_name(BdrvChild *child)
|
||||||
{
|
{
|
||||||
return blk_name(child->opaque);
|
return blk_name(child->opaque);
|
||||||
|
@ -113,6 +133,7 @@ static const BdrvChildRole child_root = {
|
||||||
.change_media = blk_root_change_media,
|
.change_media = blk_root_change_media,
|
||||||
.resize = blk_root_resize,
|
.resize = blk_root_resize,
|
||||||
.get_name = blk_root_get_name,
|
.get_name = blk_root_get_name,
|
||||||
|
.get_parent_desc = blk_root_get_parent_desc,
|
||||||
|
|
||||||
.drained_begin = blk_root_drained_begin,
|
.drained_begin = blk_root_drained_begin,
|
||||||
.drained_end = blk_root_drained_end,
|
.drained_end = blk_root_drained_end,
|
||||||
|
|
|
@ -452,6 +452,12 @@ struct BdrvChildRole {
|
||||||
* name), or NULL if the parent can't provide a better name. */
|
* name), or NULL if the parent can't provide a better name. */
|
||||||
const char* (*get_name)(BdrvChild *child);
|
const char* (*get_name)(BdrvChild *child);
|
||||||
|
|
||||||
|
/* Returns a malloced string that describes the parent of the child for a
|
||||||
|
* human reader. This could be a node-name, BlockBackend name, qdev ID or
|
||||||
|
* QOM path of the device owning the BlockBackend, job type and ID etc. The
|
||||||
|
* caller is responsible for freeing the memory. */
|
||||||
|
char* (*get_parent_desc)(BdrvChild *child);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this pair of functions is implemented, the parent doesn't issue new
|
* If this pair of functions is implemented, the parent doesn't issue new
|
||||||
* requests after returning from .drained_begin() until .drained_end() is
|
* requests after returning from .drained_begin() until .drained_end() is
|
||||||
|
|
Loading…
Reference in New Issue