* [Qemu-devel] [PATCH v2 1/3] block: implement bdrv_snapshot_goto for blkreplay
2017-02-28 10:55 [Qemu-devel] [PATCH v2 0/3] block devices record/replay update Pavel Dovgalyuk
@ 2017-02-28 10:55 ` Pavel Dovgalyuk
2017-03-01 2:00 ` Eric Blake
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 2/3] blkreplay: create temporary overlay for underlaying devices Pavel Dovgalyuk
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 3/3] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2 siblings, 1 reply; 5+ messages in thread
From: Pavel Dovgalyuk @ 2017-02-28 10:55 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, pbonzini, dovgaluk, qemu-block, mreitz
This patch enables making snapshots with blkreplay used in
block devices.
This function is required to make bdrv_snapshot_goto without
calling .bdrv_open which is not implemented.
v2: updated commit message
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
---
block/blkreplay.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/block/blkreplay.c b/block/blkreplay.c
index cfc8c5b..ddcf344 100644
--- a/block/blkreplay.c
+++ b/block/blkreplay.c
@@ -130,6 +130,12 @@ static int coroutine_fn blkreplay_co_flush(BlockDriverState *bs)
return ret;
}
+static int blkreplay_snapshot_goto(BlockDriverState *bs,
+ const char *snapshot_id)
+{
+ return bdrv_snapshot_goto(bs->file->bs, snapshot_id);
+}
+
static BlockDriver bdrv_blkreplay = {
.format_name = "blkreplay",
.protocol_name = "blkreplay",
@@ -145,6 +151,8 @@ static BlockDriver bdrv_blkreplay = {
.bdrv_co_pwrite_zeroes = blkreplay_co_pwrite_zeroes,
.bdrv_co_pdiscard = blkreplay_co_pdiscard,
.bdrv_co_flush = blkreplay_co_flush,
+
+ .bdrv_snapshot_goto = blkreplay_snapshot_goto,
};
static void bdrv_blkreplay_init(void)
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH v2 2/3] blkreplay: create temporary overlay for underlaying devices
2017-02-28 10:55 [Qemu-devel] [PATCH v2 0/3] block devices record/replay update Pavel Dovgalyuk
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 1/3] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
@ 2017-02-28 10:55 ` Pavel Dovgalyuk
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 3/3] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2 siblings, 0 replies; 5+ messages in thread
From: Pavel Dovgalyuk @ 2017-02-28 10:55 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, pbonzini, dovgaluk, qemu-block, mreitz
This patch allows using '-snapshot' behavior in record/replay mode.
blkreplay layer creates temporary overlays on top of underlaying
disk images. It is needed, because creating an overlay over blkreplay
breaks the determinism.
This patch creates similar temporary overlay (when it is needed)
under the blkreplay driver. Therefore all block operations are controlled
by blkreplay.
v2: removed useless ref/unref (as suggested by Kevin Wolf)
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
---
block/blkreplay.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
stubs/replay.c | 1 +
vl.c | 2 +-
3 files changed, 67 insertions(+), 1 deletion(-)
diff --git a/block/blkreplay.c b/block/blkreplay.c
index ddcf344..de91def 100644
--- a/block/blkreplay.c
+++ b/block/blkreplay.c
@@ -14,12 +14,69 @@
#include "block/block_int.h"
#include "sysemu/replay.h"
#include "qapi/error.h"
+#include "qapi/qmp/qstring.h"
typedef struct Request {
Coroutine *co;
QEMUBH *bh;
} Request;
+static BlockDriverState *blkreplay_append_snapshot(BlockDriverState *bs,
+ Error **errp)
+{
+ int ret;
+ BlockDriverState *bs_snapshot;
+ int64_t total_size;
+ QemuOpts *opts = NULL;
+ char tmp_filename[PATH_MAX + 1];
+ QDict *snapshot_options = qdict_new();
+
+ /* Prepare options QDict for the overlay file */
+ qdict_put(snapshot_options, "file.driver", qstring_from_str("file"));
+ qdict_put(snapshot_options, "driver", qstring_from_str("qcow2"));
+
+ /* Create temporary file */
+ ret = get_tmp_filename(tmp_filename, PATH_MAX + 1);
+ if (ret < 0) {
+ error_setg_errno(errp, -ret, "Could not get temporary filename");
+ goto out;
+ }
+ qdict_put(snapshot_options, "file.filename",
+ qstring_from_str(tmp_filename));
+
+ /* Get the required size from the image */
+ total_size = bdrv_getlength(bs);
+ if (total_size < 0) {
+ error_setg_errno(errp, -total_size, "Could not get image size");
+ goto out;
+ }
+
+ opts = qemu_opts_create(bdrv_qcow2.create_opts, NULL, 0, &error_abort);
+ qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size, &error_abort);
+ ret = bdrv_create(&bdrv_qcow2, tmp_filename, opts, errp);
+ qemu_opts_del(opts);
+ if (ret < 0) {
+ error_prepend(errp, "Could not create temporary overlay '%s': ",
+ tmp_filename);
+ goto out;
+ }
+
+ bs_snapshot = bdrv_open(NULL, NULL, snapshot_options,
+ BDRV_O_RDWR | BDRV_O_TEMPORARY, errp);
+ snapshot_options = NULL;
+ if (!bs_snapshot) {
+ goto out;
+ }
+
+ bdrv_append(bs_snapshot, bs);
+
+ return bs_snapshot;
+
+out:
+ QDECREF(snapshot_options);
+ return NULL;
+}
+
static int blkreplay_open(BlockDriverState *bs, QDict *options, int flags,
Error **errp)
{
@@ -35,6 +92,14 @@ static int blkreplay_open(BlockDriverState *bs, QDict *options, int flags,
goto fail;
}
+ /* Add temporary snapshot to preserve the image */
+ if (!replay_snapshot
+ && !blkreplay_append_snapshot(bs->file->bs, &local_err)) {
+ ret = -EINVAL;
+ error_propagate(errp, local_err);
+ goto fail;
+ }
+
ret = 0;
fail:
if (ret < 0) {
diff --git a/stubs/replay.c b/stubs/replay.c
index 9c8aa48..9991ee5 100644
--- a/stubs/replay.c
+++ b/stubs/replay.c
@@ -3,6 +3,7 @@
#include "sysemu/sysemu.h"
ReplayMode replay_mode;
+char *replay_snapshot;
int64_t replay_save_clock(unsigned int kind, int64_t clock)
{
diff --git a/vl.c b/vl.c
index e10a27b..876a55a 100644
--- a/vl.c
+++ b/vl.c
@@ -4450,7 +4450,7 @@ int main(int argc, char **argv, char **envp)
}
/* open the virtual block devices */
- if (snapshot || replay_mode != REPLAY_MODE_NONE) {
+ if (snapshot) {
qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
NULL, NULL);
}
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH v2 3/3] replay: disable default snapshot for record/replay
2017-02-28 10:55 [Qemu-devel] [PATCH v2 0/3] block devices record/replay update Pavel Dovgalyuk
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 1/3] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2017-02-28 10:55 ` [Qemu-devel] [PATCH v2 2/3] blkreplay: create temporary overlay for underlaying devices Pavel Dovgalyuk
@ 2017-02-28 10:55 ` Pavel Dovgalyuk
2 siblings, 0 replies; 5+ messages in thread
From: Pavel Dovgalyuk @ 2017-02-28 10:55 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, pbonzini, dovgaluk, qemu-block, mreitz
This patch disables setting '-snapshot' option on by default
in record/replay mode. This is needed for creating vmstates in record
and replay modes.
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
---
vl.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/vl.c b/vl.c
index 876a55a..1b85923 100644
--- a/vl.c
+++ b/vl.c
@@ -3140,7 +3140,13 @@ int main(int argc, char **argv, char **envp)
drive_add(IF_PFLASH, -1, optarg, PFLASH_OPTS);
break;
case QEMU_OPTION_snapshot:
- snapshot = 1;
+ {
+ Error *blocker = NULL;
+ snapshot = 1;
+ error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED,
+ "-snapshot");
+ replay_add_blocker(blocker);
+ }
break;
case QEMU_OPTION_hdachs:
{
^ permalink raw reply related [flat|nested] 5+ messages in thread