do_drive_backup() acquires the AioContext lock of the corresponding BlockDriverState. This is not a problem when it's called from qmp_drive_backup(), but drive_backup_prepare() also acquires the lock before calling it. The same things happens with do_blockdev_backup() and blockdev_backup_prepare().
This patch series merges do_drive_backup() with drive_backup_prepare() and do_blockdev_backup() with blockdev_backup_prepare(), and ensures they're only getting called from a transaction context. This way, there's a single code path for both transaction requests and qmp commands, as suggested by Kevin Wolf. We also take this opportunity to ensure we're honoring the context acquisition semantics required by bdrv_try_set_aio_context, as suggested by Max Reitz. --- Changelog: v3: - Rework the whole patch series to fix the issue by consolidating all operations in the transaction model. (thanks Kevin Wolf) v2: - Honor bdrv_try_set_aio_context() context acquisition requirements (thanks Max Reitz). - Release the context at drive_backup_prepare() instead of avoiding re-acquiring it at do_drive_baclup(). (thanks Max Reitz) - Convert a single patch into a two-patch series. --- Sergio Lopez (8): blockdev: merge drive_backup_prepare with do_drive_backup blockdev: fix coding style issues in drive_backup_prepare blockdev: place drive_backup_prepare with the other related transaction functions blockdev: change qmp_drive_backup to make use of transactions blockdev: merge blockdev_backup_prepare with do_blockdev_backup blockdev: place blockdev_backup_prepare with the other related transaction helpers blockdev: change qmp_blockdev_backup to make use of transactions blockdev: honor bdrv_try_set_aio_context() context requirements blockdev.c | 349 ++++++++++++++++++++++++++--------------------------- 1 file changed, 171 insertions(+), 178 deletions(-) -- 2.23.0