On 11/09/2017 02:43 PM, Max Reitz wrote: > Draining a BDS may lead to graph modifications, which in turn may result > in it and other BDS being stripped of their current references. If > bdrv_drain_all_begin() and bdrv_drain_all_end() do not keep strong > references themselves, the BDS they are trying to drain (or undrain) may > disappear right under their feet -- or, more specifically, under the > feet of BDRV_POLL_WHILE() in bdrv_drain_recurse(). > > This fixes an occasional hang of iotest 194. > > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block/io.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 44 insertions(+), 3 deletions(-)
> + > + /* Keep a strong reference to all root BDS and copy them into > + * an own list because draining them may lead to graph 'an own' sounds awkward; maybe 'copy them into a local list' > + * modifications. */ > + bdrv_ref(bs); > + bs_list = g_slist_prepend(bs_list, bs); > } > void bdrv_drain_all_end(void) > { > BlockDriverState *bs; > BdrvNextIterator it; > + GSList *bs_list = NULL, *bs_list_entry; > + > + /* Must be called from the main loop */ > + assert(qemu_get_current_aio_context() == qemu_get_aio_context()); > > + /* Keep a strong reference to all root BDS and copy them into an > + * own list because draining them may lead to graph modifications. And again. With that tweak, Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature