On 06.05.19 17:34, Vladimir Sementsov-Ogievskiy wrote: > From: Andrey Shinkevich <[email protected]> > > The bottom node is the intermediate block device that has the base as its > backing image. It is used instead of the base node while a block stream > job is running to avoid dependency on the base that may change due to the > parallel jobs. The change may take place due to a filter node as well that > is inserted between the base and the intermediate bottom node. It occurs > when the base node is the top one for another commit or stream job. > After the introduction of the bottom node, don't freeze its backing child, > that's the base, anymore. > > Suggested-by: Vladimir Sementsov-Ogievskiy <[email protected]> > Signed-off-by: Andrey Shinkevich <[email protected]> > Reviewed-by: Vladimir Sementsov-Ogievskiy <[email protected]> > Reviewed-by: Alberto Garcia <[email protected]> > --- > block/stream.c | 49 +++++++++++++++++++++--------------------- > tests/qemu-iotests/245 | 4 ++-- > 2 files changed, 27 insertions(+), 26 deletions(-) > > diff --git a/block/stream.c b/block/stream.c > index 65b13b27e0..fc97c89f81 100644 > --- a/block/stream.c > +++ b/block/stream.c
[...]
> @@ -248,26 +250,25 @@ void stream_start(const char *job_id, BlockDriverState
> *bs,
> * already have our own plans. Also don't allow resize as the image size
> is
> * queried only at the job start and then cached. */
> s = block_job_create(job_id, &stream_job_driver, NULL, bs,
> - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED
> |
> - BLK_PERM_GRAPH_MOD,
> - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED
> |
> - BLK_PERM_WRITE,
> + basic_flags | BLK_PERM_GRAPH_MOD,
> + basic_flags | BLK_PERM_WRITE,
> speed, creation_flags, NULL, NULL, errp);
> if (!s) {
> goto fail;
> }
>
> - /* Block all intermediate nodes between bs and base, because they will
> - * disappear from the chain after this operation. The streaming job reads
> - * every block only once, assuming that it doesn't change, so block
> writes
> - * and resizes. */
> - for (iter = backing_bs(bs); iter && iter != base; iter =
> backing_bs(iter)) {
> - block_job_add_bdrv(&s->common, "intermediate node", iter, 0,
> - BLK_PERM_CONSISTENT_READ |
> BLK_PERM_WRITE_UNCHANGED,
> - &error_abort);
> + /*
> + * Block all intermediate nodes between bs and bottom (inclusive),
> because
> + * they will disappear from the chain after this operation. The streaming
> + * job reads every block only once, assuming that it doesn't change, so
> + * forbid writes and resizes.
> + */
> + for (iter = bs; iter != bottom; iter = backing_bs(iter)) {
> + block_job_add_bdrv(&s->common, "intermediate node", backing_bs(iter),
> + 0, basic_flags, &error_abort);
I don’t understand this change. Isn’t it doing exactly the same as before?
(If so, I just find it harder to read because every iteration isn’t
about @iter but backing_bs(iter).)
The rest looks good to me.
Max
> }
>
> - s->base = base;
> + s->bottom = bottom;
> s->backing_file_str = g_strdup(backing_file_str);
> s->bs_read_only = bs_read_only;
> s->chain_frozen = true;
signature.asc
Description: OpenPGP digital signature
