From: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, mst@redhat.com,
jasowang@redhat.com, quintela@redhat.com, dovgaluk@ispras.ru,
kraxel@redhat.com, pbonzini@redhat.com
Subject: [Qemu-devel] [PATCH v9 02/10] blkreplay: create temporary overlay for underlaying devices
Date: Thu, 04 May 2017 11:41:48 +0300 [thread overview]
Message-ID: <20170504084148.7488.77468.stgit@PASHA-ISP> (raw)
In-Reply-To: <20170504084135.7488.24715.stgit@PASHA-ISP>
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.
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 d13a98d691..a9bab72bfc 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, errp);
+
+ 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 9c8aa48c9c..9991ee5120 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 f46e070e0d..eafb3ff7a4 100644
--- a/vl.c
+++ b/vl.c
@@ -4492,7 +4492,7 @@ int main(int argc, char **argv, char **envp)
qapi_free_BlockdevOptions(bdo->bdo);
g_free(bdo);
}
- if (snapshot || replay_mode != REPLAY_MODE_NONE) {
+ if (snapshot) {
qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
NULL, NULL);
}
next prev parent reply other threads:[~2017-05-04 8:41 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-04 8:41 [Qemu-devel] [PATCH v9 00/10] replay additions Pavel Dovgalyuk
2017-05-04 8:41 ` [Qemu-devel] [PATCH v9 01/10] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2017-05-04 8:41 ` Pavel Dovgalyuk [this message]
2017-05-04 8:41 ` [Qemu-devel] [PATCH v9 03/10] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2017-05-04 8:41 ` [Qemu-devel] [PATCH v9 04/10] replay: fix processing async events Pavel Dovgalyuk
2017-05-04 10:30 ` Paolo Bonzini
2017-05-04 12:32 ` Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 05/10] replay: fixed replay_enable_events Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 06/10] replay: fix save/load vm for non-empty queue Pavel Dovgalyuk
2017-05-04 9:33 ` Juan Quintela
2017-05-04 10:03 ` Pavel Dovgalyuk
2017-05-04 10:31 ` Paolo Bonzini
2017-05-04 11:13 ` Pavel Dovgalyuk
2017-05-04 11:52 ` Paolo Bonzini
2017-05-04 11:54 ` Pavel Dovgalyuk
2017-05-04 12:02 ` Paolo Bonzini
2017-05-04 12:10 ` Pavel Dovgalyuk
2017-05-04 12:32 ` Paolo Bonzini
2017-05-04 12:34 ` Pavel Dovgalyuk
2017-05-04 12:52 ` Paolo Bonzini
2017-05-04 13:02 ` Pavel Dovgalyuk
2017-05-04 13:12 ` Paolo Bonzini
2017-05-04 13:24 ` Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 07/10] replay: added replay log format description Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 08/10] replay: make safe vmstop at record/replay Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 09/10] replay: save prior value of the host clock Pavel Dovgalyuk
2017-05-04 8:42 ` [Qemu-devel] [PATCH v9 10/10] icount: fixed saving/restoring of icount warp timers Pavel Dovgalyuk
2017-05-04 9:35 ` [Qemu-devel] [PATCH v9 00/10] replay additions no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170504084148.7488.77468.stgit@PASHA-ISP \
--to=pavel.dovgaluk@ispras.ru \
--cc=dovgaluk@ispras.ru \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).