Unless we can prove this to be safe for specific cases, the default should be to prohibit migration during BlockJobs.
In conjunction with "migration: disallow_migrate_add_blocker during migration", this should be sufficient to disallow the blockjob from starting in the event of an in-progress migration. Signed-off-by: John Snow <js...@redhat.com> --- blockjob.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/blockjob.c b/blockjob.c index 62bb906..b5849b3 100644 --- a/blockjob.c +++ b/blockjob.c @@ -35,12 +35,14 @@ #include "qmp-commands.h" #include "qemu/timer.h" #include "qapi-event.h" +#include "migration/migration.h" void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs, int64_t speed, BlockCompletionFunc *cb, void *opaque, Error **errp) { BlockJob *job; + int ret; if (bs->job) { error_setg(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs)); @@ -71,6 +73,14 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs, return NULL; } } + + /* Re-use the op-blocker as a migration blocker */ + ret = migrate_add_blocker(job->blocker, errp); + if (ret < 0) { + block_job_release(bs); + return NULL; + } + return job; } @@ -80,6 +90,7 @@ void block_job_release(BlockDriverState *bs) bs->job = NULL; bdrv_op_unblock_all(bs, job->blocker); + migrate_del_blocker(job->blocker); error_free(job->blocker); g_free(job); } -- 2.4.3