block/backup: implement .cancel job handler

Cancel in-flight io on target to not waste the time.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210205163720.887197-10-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-02-05 19:37:19 +03:00 committed by Eric Blake
parent d00dd63135
commit ff789bf5a9

View File

@ -35,6 +35,7 @@ typedef struct BackupBlockJob {
BlockJob common; BlockJob common;
BlockDriverState *backup_top; BlockDriverState *backup_top;
BlockDriverState *source_bs; BlockDriverState *source_bs;
BlockDriverState *target_bs;
BdrvDirtyBitmap *sync_bitmap; BdrvDirtyBitmap *sync_bitmap;
@ -329,6 +330,13 @@ static void coroutine_fn backup_set_speed(BlockJob *job, int64_t speed)
} }
} }
static void backup_cancel(Job *job)
{
BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
bdrv_cancel_in_flight(s->target_bs);
}
static const BlockJobDriver backup_job_driver = { static const BlockJobDriver backup_job_driver = {
.job_driver = { .job_driver = {
.instance_size = sizeof(BackupBlockJob), .instance_size = sizeof(BackupBlockJob),
@ -340,6 +348,7 @@ static const BlockJobDriver backup_job_driver = {
.abort = backup_abort, .abort = backup_abort,
.clean = backup_clean, .clean = backup_clean,
.pause = backup_pause, .pause = backup_pause,
.cancel = backup_cancel,
}, },
.set_speed = backup_set_speed, .set_speed = backup_set_speed,
}; };
@ -528,6 +537,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
job->backup_top = backup_top; job->backup_top = backup_top;
job->source_bs = bs; job->source_bs = bs;
job->target_bs = target;
job->on_source_error = on_source_error; job->on_source_error = on_source_error;
job->on_target_error = on_target_error; job->on_target_error = on_target_error;
job->sync_mode = sync_mode; job->sync_mode = sync_mode;