mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
commit: Allow users to request only format driver names in backing file format
Introduce a new flag 'backing-mask-protocol' for the block-commit QMP command which instructs the internals to use 'raw' instead of the protocol driver in case when a image is used without a dummy 'raw' wrapper. The flag is designed such that it can be always asserted by management tools even when there isn't any update to backing files. The flag will be used by libvirt so that the backing images still reference the proper format even when libvirt will stop using the dummy raw driver (raw driver with no other config). Libvirt needs this so that the images stay compatible with older libvirt versions which didn't expect that a protocol driver name can appear in the backing file format field. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-ID: <2cb46e37093ce793ea1604abc8bbb90f4c8e434b.1701796348.git.pkrempa@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
014b99a8e4
commit
4b028cbe75
8 changed files with 58 additions and 12 deletions
37
block.c
37
block.c
|
@ -1309,11 +1309,14 @@ static void bdrv_backing_detach(BdrvChild *c)
|
|||
}
|
||||
|
||||
static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base,
|
||||
const char *filename, Error **errp)
|
||||
const char *filename,
|
||||
bool backing_mask_protocol,
|
||||
Error **errp)
|
||||
{
|
||||
BlockDriverState *parent = c->opaque;
|
||||
bool read_only = bdrv_is_read_only(parent);
|
||||
int ret;
|
||||
const char *format_name;
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
if (read_only) {
|
||||
|
@ -1323,9 +1326,23 @@ static int bdrv_backing_update_filename(BdrvChild *c, BlockDriverState *base,
|
|||
}
|
||||
}
|
||||
|
||||
ret = bdrv_change_backing_file(parent, filename,
|
||||
base->drv ? base->drv->format_name : "",
|
||||
false);
|
||||
if (base->drv) {
|
||||
/*
|
||||
* If the new base image doesn't have a format driver layer, which we
|
||||
* detect by the fact that @base is a protocol driver, we record
|
||||
* 'raw' as the format instead of putting the protocol name as the
|
||||
* backing format
|
||||
*/
|
||||
if (backing_mask_protocol && base->drv->protocol_name) {
|
||||
format_name = "raw";
|
||||
} else {
|
||||
format_name = base->drv->format_name;
|
||||
}
|
||||
} else {
|
||||
format_name = "";
|
||||
}
|
||||
|
||||
ret = bdrv_change_backing_file(parent, filename, format_name, false);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Could not update backing file link");
|
||||
}
|
||||
|
@ -1479,10 +1496,14 @@ static void GRAPH_WRLOCK bdrv_child_cb_detach(BdrvChild *child)
|
|||
}
|
||||
|
||||
static int bdrv_child_cb_update_filename(BdrvChild *c, BlockDriverState *base,
|
||||
const char *filename, Error **errp)
|
||||
const char *filename,
|
||||
bool backing_mask_protocol,
|
||||
Error **errp)
|
||||
{
|
||||
if (c->role & BDRV_CHILD_COW) {
|
||||
return bdrv_backing_update_filename(c, base, filename, errp);
|
||||
return bdrv_backing_update_filename(c, base, filename,
|
||||
backing_mask_protocol,
|
||||
errp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -5803,7 +5824,8 @@ void bdrv_unfreeze_backing_chain(BlockDriverState *bs, BlockDriverState *base)
|
|||
*
|
||||
*/
|
||||
int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
|
||||
const char *backing_file_str)
|
||||
const char *backing_file_str,
|
||||
bool backing_mask_protocol)
|
||||
{
|
||||
BlockDriverState *explicit_top = top;
|
||||
bool update_inherits_from;
|
||||
|
@ -5869,6 +5891,7 @@ int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
|
|||
|
||||
if (c->klass->update_filename) {
|
||||
ret = c->klass->update_filename(c, base, backing_file_str,
|
||||
backing_mask_protocol,
|
||||
&local_err);
|
||||
if (ret < 0) {
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue