[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v15 09/13] stream: rework backing-file changing
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v15 09/13] stream: rework backing-file changing |
Date: |
Wed, 16 Dec 2020 09:16:59 +0300 |
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Stream in stream_prepare calls bdrv_change_backing_file() to change
backing-file in the metadata of bs.
It may use either backing-file parameter given by user or just take
filename of base on job start.
Backing file format is determined by base on job finish.
There are some problems with this design, we solve only two by this
patch:
1. Consider scenario with backing-file unset. Current concept of stream
supports changing of the base during the job (we don't freeze link to
the base). So, we should not save base filename at job start,
- let's determine name of the base on job finish.
2. Using direct base to determine filename and format is not very good:
base node may be a filter, so its filename may be JSON, and format_name
is not good for storing into qcow2 metadata as backing file format.
- let's use unfiltered_base
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
[vsementsov: change commit subject, change logic in stream_prepare]
---
block/stream.c | 9 +++++----
blockdev.c | 8 +-------
2 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/block/stream.c b/block/stream.c
index 6e281c71ac..6a525a5edf 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -65,6 +65,7 @@ static int stream_prepare(Job *job)
BlockDriverState *bs = blk_bs(bjob->blk);
BlockDriverState *unfiltered_bs = bdrv_skip_filters(bs);
BlockDriverState *base = bdrv_filter_or_cow_bs(s->above_base);
+ BlockDriverState *unfiltered_base = bdrv_skip_filters(base);
Error *local_err = NULL;
int ret = 0;
@@ -73,10 +74,10 @@ static int stream_prepare(Job *job)
if (bdrv_cow_child(unfiltered_bs)) {
const char *base_id = NULL, *base_fmt = NULL;
- if (base) {
- base_id = s->backing_file_str;
- if (base->drv) {
- base_fmt = base->drv->format_name;
+ if (unfiltered_base) {
+ base_id = s->backing_file_str ?: unfiltered_base->filename;
+ if (unfiltered_base->drv) {
+ base_fmt = unfiltered_base->drv->format_name;
}
}
bdrv_set_backing_hd(unfiltered_bs, base, &local_err);
diff --git a/blockdev.c b/blockdev.c
index c290cb1dca..b58f36fc31 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2510,7 +2510,6 @@ void qmp_block_stream(bool has_job_id, const char
*job_id, const char *device,
BlockDriverState *base_bs = NULL;
AioContext *aio_context;
Error *local_err = NULL;
- const char *base_name = NULL;
int job_flags = JOB_DEFAULT;
if (!has_on_error) {
@@ -2538,7 +2537,6 @@ void qmp_block_stream(bool has_job_id, const char
*job_id, const char *device,
goto out;
}
assert(bdrv_get_aio_context(base_bs) == aio_context);
- base_name = base;
}
if (has_base_node) {
@@ -2553,7 +2551,6 @@ void qmp_block_stream(bool has_job_id, const char
*job_id, const char *device,
}
assert(bdrv_get_aio_context(base_bs) == aio_context);
bdrv_refresh_filename(base_bs);
- base_name = base_bs->filename;
}
/* Check for op blockers in the whole chain between bs and base */
@@ -2573,9 +2570,6 @@ void qmp_block_stream(bool has_job_id, const char
*job_id, const char *device,
goto out;
}
- /* backing_file string overrides base bs filename */
- base_name = has_backing_file ? backing_file : base_name;
-
if (has_auto_finalize && !auto_finalize) {
job_flags |= JOB_MANUAL_FINALIZE;
}
@@ -2583,7 +2577,7 @@ void qmp_block_stream(bool has_job_id, const char
*job_id, const char *device,
job_flags |= JOB_MANUAL_DISMISS;
}
- stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
+ stream_start(has_job_id ? job_id : NULL, bs, base_bs, backing_file,
job_flags, has_speed ? speed : 0, on_error,
filter_node_name, &local_err);
if (local_err) {
--
2.25.4
- [PATCH v15 00/13] Apply COR-filter to the block-stream permanently, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 02/13] block: add API function to insert a node, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 01/13] copy-on-read: support preadv/pwritev_part functions, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 04/13] qapi: add filter-node-name to block-stream, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 05/13] qapi: copy-on-read filter: add 'bottom' option, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 03/13] copy-on-read: add filter drop function, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 06/13] iotests: add #310 to test bottom node in COR driver, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 08/13] copy-on-read: skip non-guest reads if no copy needed, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 09/13] stream: rework backing-file changing,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v15 10/13] qapi: block-stream: add "bottom" argument, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 11/13] iotests: 30: prepare to COR filter insertion by stream job, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 07/13] block: include supported_read_flags into BDS structure, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 12/13] block/stream: add s->target_bs, Vladimir Sementsov-Ogievskiy, 2020/12/16
- [PATCH v15 13/13] block: apply COR-filter to block-stream jobs, Vladimir Sementsov-Ogievskiy, 2020/12/16