Skip to content

Commit

Permalink
block: Add "drained begin/end" for transactional backup
Browse files Browse the repository at this point in the history
This ensures the atomicity of the transaction by avoiding processing of
external requests such as those from ioeventfd.

Move the assignment to state->bs up right after bdrv_drained_begin, so
that we can use it in the clean callback. The abort callback will still
check bs->job and state->job, so it's OK.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
Fam Zheng authored and kevmw committed Oct 23, 2015
1 parent da763e8 commit 1fdd4b7
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion blockdev.c
Expand Up @@ -1684,9 +1684,16 @@ static void drive_backup_prepare(BlkTransactionState *common, Error **errp)
return;
}

if (!blk_is_available(blk)) {
error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, backup->device);
return;
}

/* AioContext is released in .clean() */
state->aio_context = blk_get_aio_context(blk);
aio_context_acquire(state->aio_context);
bdrv_drained_begin(blk_bs(blk));
state->bs = blk_bs(blk);

qmp_drive_backup(backup->device, backup->target,
backup->has_format, backup->format,
Expand All @@ -1702,7 +1709,6 @@ static void drive_backup_prepare(BlkTransactionState *common, Error **errp)
return;
}

state->bs = blk_bs(blk);
state->job = state->bs->job;
}

Expand All @@ -1722,6 +1728,7 @@ static void drive_backup_clean(BlkTransactionState *common)
DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);

if (state->aio_context) {
bdrv_drained_end(state->bs);
aio_context_release(state->aio_context);
}
}
Expand Down

0 comments on commit 1fdd4b7

Please sign in to comment.