Skip to content

Commit

Permalink
stream: Allow users to request only format driver names in backing fi…
Browse files Browse the repository at this point in the history
…le format

Introduce a new flag 'backing-mask-protocol' for the block-stream 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: <bbee9a0a59748a8893289bf8249f568f0d587e62.1701796348.git.pkrempa@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
pipo authored and kevmw committed Jan 26, 2024
1 parent 4b028cb commit 72098a3
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion block/monitor/block-hmp-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
const char *base = qdict_get_try_str(qdict, "base");
int64_t speed = qdict_get_try_int(qdict, "speed", 0);

qmp_block_stream(device, device, base, NULL, NULL, NULL,
qmp_block_stream(device, device, base, NULL, NULL, false, false, NULL,
qdict_haskey(qdict, "speed"), speed,
true, BLOCKDEV_ON_ERROR_REPORT, NULL,
false, false, false, false, &error);
Expand Down
10 changes: 9 additions & 1 deletion block/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ typedef struct StreamBlockJob {
BlockDriverState *target_bs;
BlockdevOnError on_error;
char *backing_file_str;
bool backing_mask_protocol;
bool bs_read_only;
} StreamBlockJob;

Expand Down Expand Up @@ -95,7 +96,12 @@ static int stream_prepare(Job *job)
if (unfiltered_base) {
base_id = s->backing_file_str ?: unfiltered_base->filename;
if (unfiltered_base->drv) {
base_fmt = unfiltered_base->drv->format_name;
if (s->backing_mask_protocol &&
unfiltered_base->drv->protocol_name) {
base_fmt = "raw";
} else {
base_fmt = unfiltered_base->drv->format_name;
}
}
}

Expand Down Expand Up @@ -247,6 +253,7 @@ static const BlockJobDriver stream_job_driver = {

void stream_start(const char *job_id, BlockDriverState *bs,
BlockDriverState *base, const char *backing_file_str,
bool backing_mask_protocol,
BlockDriverState *bottom,
int creation_flags, int64_t speed,
BlockdevOnError on_error,
Expand Down Expand Up @@ -398,6 +405,7 @@ void stream_start(const char *job_id, BlockDriverState *bs,
s->base_overlay = base_overlay;
s->above_base = above_base;
s->backing_file_str = g_strdup(backing_file_str);
s->backing_mask_protocol = backing_mask_protocol;
s->cor_filter_bs = cor_filter_bs;
s->target_bs = bs;
s->bs_read_only = bs_read_only;
Expand Down
7 changes: 7 additions & 0 deletions blockdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2278,6 +2278,8 @@ void qmp_block_stream(const char *job_id, const char *device,
const char *base,
const char *base_node,
const char *backing_file,
bool has_backing_mask_protocol,
bool backing_mask_protocol,
const char *bottom,
bool has_speed, int64_t speed,
bool has_on_error, BlockdevOnError on_error,
Expand Down Expand Up @@ -2313,6 +2315,10 @@ void qmp_block_stream(const char *job_id, const char *device,
return;
}

if (!has_backing_mask_protocol) {
backing_mask_protocol = false;
}

if (!has_on_error) {
on_error = BLOCKDEV_ON_ERROR_REPORT;
}
Expand Down Expand Up @@ -2400,6 +2406,7 @@ void qmp_block_stream(const char *job_id, const char *device,
}

stream_start(job_id, bs, base_bs, backing_file,
backing_mask_protocol,
bottom_bs, job_flags, has_speed ? speed : 0, on_error,
filter_node_name, &local_err);
if (local_err) {
Expand Down
3 changes: 3 additions & 0 deletions include/block/block_int-global-state.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
* flatten the whole backing file chain onto @bs.
* @backing_file_str: The file name that will be written to @bs as the
* the new backing file if the job completes. Ignored if @base is %NULL.
* @backing_mask_protocol: Replace potential protocol name with 'raw' in
* 'backing file format' header
* @creation_flags: Flags that control the behavior of the Job lifetime.
* See @BlockJobCreateFlags
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
Expand All @@ -64,6 +66,7 @@
*/
void stream_start(const char *job_id, BlockDriverState *bs,
BlockDriverState *base, const char *backing_file_str,
bool backing_mask_protocol,
BlockDriverState *bottom,
int creation_flags, int64_t speed,
BlockdevOnError on_error,
Expand Down
9 changes: 8 additions & 1 deletion qapi/block-core.json
Original file line number Diff line number Diff line change
Expand Up @@ -2826,6 +2826,11 @@
# Care should be taken when specifying the string, to specify a
# valid filename or protocol. (Since 2.1)
#
# @backing-mask-protocol: If true, replace any protocol mentioned in the
# 'backing file format' with 'raw', rather than storing the protocol
# name as the backing format. Can be used even when no image header
# will be updated (default false; since 9.0).
#
# @speed: the maximum speed, in bytes per second
#
# @on-error: the action to take on an error (default report). 'stop'
Expand Down Expand Up @@ -2864,7 +2869,9 @@
##
{ 'command': 'block-stream',
'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',
'*base-node': 'str', '*backing-file': 'str', '*bottom': 'str',
'*base-node': 'str', '*backing-file': 'str',
'*backing-mask-protocol': 'bool',
'*bottom': 'str',
'*speed': 'int', '*on-error': 'BlockdevOnError',
'*filter-node-name': 'str',
'*auto-finalize': 'bool', '*auto-dismiss': 'bool' },
Expand Down

0 comments on commit 72098a3

Please sign in to comment.