On 29.05.19 17:46, Vladimir Sementsov-Ogievskiy wrote:
> Upcoming backup-top filter wants to operate like usual implicit filter
> node with fall-through to backing child. But also needs additional
> target child, let's support that.
>
> On the other hand, after backup completion (before job dismiss) filter
> is still attached to job blk, but don't have any children. Support this
> too.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
> block.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/block.c b/block.c
> index 57216f4115..3f4de3ae32 100644
> --- a/block.c
> +++ b/block.c
> @@ -6200,9 +6200,20 @@ void bdrv_refresh_filename(BlockDriverState *bs)
> }
>
> if (bs->implicit) {
> - /* For implicit nodes, just copy everything from the single child */
> + /*
> + * For implicit nodes, just copy everything from the single child or
> + * from backing, if there are several children.
> + * If there are no children for some reason (filter is still attached
> + * to block-job blk, but already removed from backing chain of device)
> + * do nothing.
> + */
> child = QLIST_FIRST(&bs->children);
> - assert(QLIST_NEXT(child, next) == NULL);
> + if (!child) {
> + return;
> + } else if (QLIST_NEXT(child, next)) {
> + assert(bs->backing);
> + child = bs->backing;
> + }
>
> pstrcpy(bs->exact_filename, sizeof(bs->exact_filename),
> child->bs->exact_filename);
Reviewed-by: Max Reitz <mreitz@redhat.com>
(To be changed to bdrv_filtered_rw_bs(), of course)