qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH V2 4/4] block: Optionally block drivers to optionall


From: Benoît Canet
Subject: [Qemu-devel] [PATCH V2 4/4] block: Optionally block drivers to optionally reopen images after snapshot creation.
Date: Mon, 28 Jan 2013 18:04:40 +0100

Protocols like quorum will be able to queue multiple reopens.

Signed-off-by: Benoit Canet <address@hidden>
---
 block.c                   |   25 +++++++++++++++++++++++++
 blockdev.c                |    5 +++--
 include/block/block.h     |    2 ++
 include/block/block_int.h |    3 +++
 4 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/block.c b/block.c
index 843583f..e46a106 100644
--- a/block.c
+++ b/block.c
@@ -4652,3 +4652,28 @@ void bdrv_ext_snapshot_img_create(BlockDriverState 
*old_bs,
                                                     options, img_size,
                                                     flags, errp);
 }
+
+int bdrv_ext_snapshot_reopen(BlockDriverState *bs, int bdrv_flags,
+                             Error **errp)
+{
+    Error *local_err = NULL;
+    int ret = -ENOTSUP;
+
+    if (!bs->file || !bs->file->drv) {
+        error_setg(errp, "Block driver not reachable.");
+        return ret;
+    }
+
+    if (!bs->file->drv->bdrv_ext_snapshot_reopen) {
+        ret = bdrv_reopen(bs, bdrv_flags, &local_err);
+    } else {
+        ret = bs->file->drv->bdrv_ext_snapshot_reopen(bs, bdrv_flags,
+                                                      &local_err);
+    }
+
+    if (error_is_set(&local_err)) {
+        error_propagate(errp, local_err);
+    }
+
+    return ret;
+}
diff --git a/blockdev.c b/blockdev.c
index b1f388b..e9d235b 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -817,8 +817,9 @@ void qmp_transaction(BlockdevActionList *dev_list, Error 
**errp)
         /* We don't need (or want) to use the transactional
          * bdrv_reopen_multiple() across all the entries at once, because we
          * don't want to abort all of them if one of them fails the reopen */
-        bdrv_reopen(states->new_bs, states->new_bs->open_flags & ~BDRV_O_RDWR,
-                    NULL);
+        bdrv_ext_snapshot_reopen(states->new_bs,
+                                 states->new_bs->open_flags & ~BDRV_O_RDWR,
+                                 NULL);
     }
 
     /* success */
diff --git a/include/block/block.h b/include/block/block.h
index b7be2d2..d7e7334 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -141,6 +141,8 @@ BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue 
*bs_queue,
                                     BlockDriverState *bs, int flags);
 int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp);
 int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp);
+int bdrv_ext_snapshot_reopen(BlockDriverState *bs, int bdrv_flags,
+                             Error **errp);
 int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
                         BlockReopenQueue *queue, Error **errp);
 void bdrv_reopen_commit(BDRVReopenState *reopen_state);
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 5bab830..996fd9b 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -209,6 +209,9 @@ struct BlockDriver {
                                          const char *base_fmt,
                                          char *options, uint64_t img_size,
                                          int flags, Error **errp);
+    /* optional field */
+    int (*bdrv_ext_snapshot_reopen)(BlockDriverState *bs, int bdrv_flags,
+                                    Error **errp);
 
     QLIST_ENTRY(BlockDriver) list;
 };
-- 
1.7.10.4




reply via email to

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