qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v5 10/13] blockdev: Block device IO during drive


From: Max Reitz
Subject: Re: [Qemu-devel] [PATCH v5 10/13] blockdev: Block device IO during drive-backup transaction
Date: Sat, 23 May 2015 18:47:00 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

On 20.05.2015 08:16, Fam Zheng wrote:
Signed-off-by: Fam Zheng <address@hidden>
---
  blockdev.c | 9 ++++++++-
  1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/blockdev.c b/blockdev.c
index 923fc90..ae52d27 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1575,6 +1575,7 @@ typedef struct DriveBackupState {
      BlockDriverState *bs;
      AioContext *aio_context;
      BlockJob *job;
+    Error *blocker;
  } DriveBackupState;
static void drive_backup_prepare(BlkTransactionState *common, Error **errp)
@@ -1599,6 +1600,9 @@ static void drive_backup_prepare(BlkTransactionState 
*common, Error **errp)
      state->aio_context = bdrv_get_aio_context(bs);
      aio_context_acquire(state->aio_context);
+ state->bs = bs;
+    error_setg(&state->blocker, "drive-backup in progress");
+    bdrv_op_block(bs, BLOCK_OP_TYPE_DEVICE_IO, state->blocker);
      qmp_drive_backup(backup->device, backup->target,
                       backup->has_format, backup->format,
                       backup->sync,
@@ -1613,7 +1617,6 @@ static void drive_backup_prepare(BlkTransactionState 
*common, Error **errp)
          return;
      }
- state->bs = bs;
      state->job = state->bs->job;
  }

Okay, pulling that up works here, because drive_backup_abort() checks that bs->job is set, and that bs->job == state->job (which cannot be true if qmp_drive_backup() failed).

Reviewed-by: Max Reitz <address@hidden>

@@ -1632,6 +1635,10 @@ static void drive_backup_clean(BlkTransactionState 
*common)
  {
      DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
+ if (state->bs) {
+        bdrv_op_unblock(state->bs, BLOCK_OP_TYPE_DEVICE_IO, state->blocker);
+        error_free(state->blocker);
+    }
      if (state->aio_context) {
          aio_context_release(state->aio_context);
      }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]