[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 16/44] block: Add blockdev-backup to transaction
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 16/44] block: Add blockdev-backup to transaction |
Date: |
Mon, 12 Jan 2015 16:40:06 +0000 |
From: Fam Zheng <address@hidden>
Signed-off-by: Fam Zheng <address@hidden>
Reviewed-by: John Snow <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
Reviewed-by: Markus Armbruster <address@hidden>
Message-id: address@hidden
Signed-off-by: Max Reitz <address@hidden>
---
blockdev.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
qapi-schema.json | 2 ++
2 files changed, 81 insertions(+)
diff --git a/blockdev.c b/blockdev.c
index d6ccc5e..f2b3b25 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1559,6 +1559,79 @@ static void drive_backup_clean(BlkTransactionState
*common)
}
}
+typedef struct BlockdevBackupState {
+ BlkTransactionState common;
+ BlockDriverState *bs;
+ BlockJob *job;
+ AioContext *aio_context;
+} BlockdevBackupState;
+
+static void blockdev_backup_prepare(BlkTransactionState *common, Error **errp)
+{
+ BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common,
common);
+ BlockdevBackup *backup;
+ BlockDriverState *bs, *target;
+ Error *local_err = NULL;
+
+ assert(common->action->kind == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
+ backup = common->action->blockdev_backup;
+
+ bs = bdrv_find(backup->device);
+ if (!bs) {
+ error_set(errp, QERR_DEVICE_NOT_FOUND, backup->device);
+ return;
+ }
+
+ target = bdrv_find(backup->target);
+ if (!target) {
+ error_set(errp, QERR_DEVICE_NOT_FOUND, backup->target);
+ return;
+ }
+
+ /* AioContext is released in .clean() */
+ state->aio_context = bdrv_get_aio_context(bs);
+ if (state->aio_context != bdrv_get_aio_context(target)) {
+ state->aio_context = NULL;
+ error_setg(errp, "Backup between two IO threads is not implemented");
+ return;
+ }
+ aio_context_acquire(state->aio_context);
+
+ qmp_blockdev_backup(backup->device, backup->target,
+ backup->sync,
+ backup->has_speed, backup->speed,
+ backup->has_on_source_error, backup->on_source_error,
+ backup->has_on_target_error, backup->on_target_error,
+ &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ state->bs = bs;
+ state->job = state->bs->job;
+}
+
+static void blockdev_backup_abort(BlkTransactionState *common)
+{
+ BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common,
common);
+ BlockDriverState *bs = state->bs;
+
+ /* Only cancel if it's the job we started */
+ if (bs && bs->job && bs->job == state->job) {
+ block_job_cancel_sync(bs->job);
+ }
+}
+
+static void blockdev_backup_clean(BlkTransactionState *common)
+{
+ BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common,
common);
+
+ if (state->aio_context) {
+ aio_context_release(state->aio_context);
+ }
+}
+
static void abort_prepare(BlkTransactionState *common, Error **errp)
{
error_setg(errp, "Transaction aborted using Abort action");
@@ -1582,6 +1655,12 @@ static const BdrvActionOps actions[] = {
.abort = drive_backup_abort,
.clean = drive_backup_clean,
},
+ [TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP] = {
+ .instance_size = sizeof(BlockdevBackupState),
+ .prepare = blockdev_backup_prepare,
+ .abort = blockdev_backup_abort,
+ .clean = blockdev_backup_clean,
+ },
[TRANSACTION_ACTION_KIND_ABORT] = {
.instance_size = sizeof(BlkTransactionState),
.prepare = abort_prepare,
diff --git a/qapi-schema.json b/qapi-schema.json
index 47d99cf..fbfc52f 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1260,11 +1260,13 @@
# drive-backup since 1.6
# abort since 1.6
# blockdev-snapshot-internal-sync since 1.7
+# blockdev-backup since 2.3
##
{ 'union': 'TransactionAction',
'data': {
'blockdev-snapshot-sync': 'BlockdevSnapshot',
'drive-backup': 'DriveBackup',
+ 'blockdev-backup': 'BlockdevBackup',
'abort': 'Abort',
'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternal'
} }
--
2.1.0
- [Qemu-devel] [PULL v2 44/44] NVMe: Set correct VS Value for 1.1 Compliant Controllers, (continued)
- [Qemu-devel] [PULL v2 44/44] NVMe: Set correct VS Value for 1.1 Compliant Controllers, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 43/44] MAINTAINERS: Add migration/block* to block subsystem, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 27/44] .gitignore: Ignore generated "common.env", Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 01/44] qemu-iotests: Remove 091 from quick group, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 28/44] qemu-iotests: Replace "/bin/true" with "true", Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 15/44] qmp: Add command 'blockdev-backup', Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 03/44] block: mark AioContext as recursive, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 02/44] qemu-iotests: Speed up make check-block, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 30/44] qemu-iotests: Add supported os parameter for python tests, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 04/44] block: do not allocate an iovec per read of a growable/zero_after_eof BDS, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 16/44] block: Add blockdev-backup to transaction,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 17/44] qemu-iotests: Test blockdev-backup in 055, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 14/44] qapi: Comment version info in TransactionAction, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 12/44] qapi: Fix document for BlockStats.node-name, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 19/44] migration/block: fix pending() return value, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 05/44] block: replace g_new0 with g_new for bottom half allocation., Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 11/44] iotests: Add test for relative backing file names, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 06/44] checkpatch: Brace handling on multi-line condition, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 18/44] iotests: Filter out "I/O thread spun..." warning, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 29/44] qemu-iotests: Add "_supported_os Linux" to 058, Stefan Hajnoczi, 2015/01/12
- [Qemu-devel] [PULL v2 08/44] block: JSON filenames and relative backing files, Stefan Hajnoczi, 2015/01/12