On Fri, 09/07 18:15, Kevin Wolf wrote:
> When starting an active commit job, other callbacks can run before
> mirror_start_job() calls bdrv_ref() where needed and cause the nodes to
> go away. Add another pair of bdrv_ref/unref() around it to protect
> against this case.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/mirror.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 6cc10df5c9..c42999eadf 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -1679,6 +1679,11 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
>
> orig_base_flags = bdrv_get_flags(base);
>
> + /* bdrv_reopen() drains, which might make the BDSes go away before a
> + * reference is taken in mirror_start_job(). */
> + bdrv_ref(bs);
> + bdrv_ref(base);
> +
> if (bdrv_reopen(base, bs->open_flags, errp)) {
Doesn't it need bdrv_unref's in this branch?
> return;
> }
> @@ -1689,6 +1694,10 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
> &commit_active_job_driver, false, base, auto_complete,
> filter_node_name, false, MIRROR_COPY_MODE_BACKGROUND,
> &local_err);
> +
> + bdrv_unref(bs);
> + bdrv_unref(base);
> +
> if (local_err) {
> error_propagate(errp, local_err);
> goto error_restore_flags;
> --
> 2.13.6
>