block: let blk_add/remove_aio_context_notifier() tolerate BDS changes
commitd03654eacdf35f436fbe78ca46cea215d5165ab5
authorStefan Hajnoczi <stefanha@redhat.com>
Tue, 6 Mar 2018 20:48:18 +0000 (6 20:48 +0000)
committerEric Blake <eblake@redhat.com>
Tue, 13 Mar 2018 20:38:55 +0000 (13 15:38 -0500)
tree0641a1398fb1b43f9a2e54fbbef07d6080d56568
parent65529782f8fec531fd114cc0f58399e88202153c
block: let blk_add/remove_aio_context_notifier() tolerate BDS changes

Commit 2019ba0a0197 ("block: Add AioContextNotifier functions to BB")
added blk_add/remove_aio_context_notifier() and implemented them by
passing through the bdrv_*() equivalent.

This doesn't work across bdrv_append(), which detaches child->bs and
re-attaches it to a new BlockDriverState.  When
blk_remove_aio_context_notifier() is called we will access the new BDS
instead of the one where the notifier was added!

>From the point of view of the blk_*() API user, changes to the root BDS
should be transparent.

This patch maintains a list of AioContext notifiers in BlockBackend and
adds/removes them from the BlockDriverState as needed.

Reported-by: Stefano Panella <spanella@gmail.com>
Cc: Max Reitz <mreitz@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20180306204819.11266-2-stefanha@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
block/block-backend.c
block/trace-events