diff options
author | Vladimir Sementsov-Ogievskiy | 2021-02-05 17:37:19 +0100 |
---|---|---|
committer | Eric Blake | 2021-02-12 19:17:08 +0100 |
commit | ff789bf5a93cede32a01e648dc010032791c84e1 (patch) | |
tree | 4add210aa773b975549e6b63ce484913bcf1174c | |
parent | iotests/264: add mirror-cancel test-case (diff) | |
download | qemu-ff789bf5a93cede32a01e648dc010032791c84e1.tar.gz qemu-ff789bf5a93cede32a01e648dc010032791c84e1.tar.xz qemu-ff789bf5a93cede32a01e648dc010032791c84e1.zip |
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>
-rw-r--r-- | block/backup.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/block/backup.c b/block/backup.c index cc525d5544..94e6dcd72e 100644 --- a/block/backup.c +++ b/block/backup.c @@ -35,6 +35,7 @@ typedef struct BackupBlockJob { BlockJob common; BlockDriverState *backup_top; BlockDriverState *source_bs; + BlockDriverState *target_bs; 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 = { .job_driver = { .instance_size = sizeof(BackupBlockJob), @@ -340,6 +348,7 @@ static const BlockJobDriver backup_job_driver = { .abort = backup_abort, .clean = backup_clean, .pause = backup_pause, + .cancel = backup_cancel, }, .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->source_bs = bs; + job->target_bs = target; job->on_source_error = on_source_error; job->on_target_error = on_target_error; job->sync_mode = sync_mode; |