[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 20/38] Introduce do_snapshot_blkdev() and monitor co
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 20/38] Introduce do_snapshot_blkdev() and monitor command to handle it. |
Date: |
Fri, 17 Dec 2010 18:44:35 +0100 |
From: Jes Sorensen <address@hidden>
The monitor command is:
snapshot_blkdev <device> [snapshot-file] [format]
Default format is qcow2. For now snapshots without a snapshot-file, eg
internal snapshots, are not supported.
Signed-off-by: Jes Sorensen <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
blockdev.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
blockdev.h | 1 +
hmp-commands.hx | 19 ++++++++++++++++
3 files changed, 82 insertions(+), 0 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 3b3b82d..d7add36 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -516,6 +516,68 @@ void do_commit(Monitor *mon, const QDict *qdict)
}
}
+int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+ const char *device = qdict_get_str(qdict, "device");
+ const char *filename = qdict_get_try_str(qdict, "snapshot_file");
+ const char *format = qdict_get_try_str(qdict, "format");
+ BlockDriverState *bs;
+ BlockDriver *drv, *proto_drv;
+ int ret = 0;
+ int flags;
+
+ bs = bdrv_find(device);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, device);
+ ret = -1;
+ goto out;
+ }
+
+ if (!format) {
+ format = "qcow2";
+ }
+
+ drv = bdrv_find_format(format);
+ if (!drv) {
+ qerror_report(QERR_INVALID_BLOCK_FORMAT, format);
+ ret = -1;
+ goto out;
+ }
+
+ proto_drv = bdrv_find_protocol(filename);
+ if (!proto_drv) {
+ qerror_report(QERR_INVALID_BLOCK_FORMAT, format);
+ ret = -1;
+ goto out;
+ }
+
+ ret = bdrv_img_create(filename, format, bs->filename,
+ bs->drv->format_name, NULL, -1, bs->open_flags);
+ if (ret) {
+ goto out;
+ }
+
+ qemu_aio_flush();
+ bdrv_flush(bs);
+
+ flags = bs->open_flags;
+ bdrv_close(bs);
+ ret = bdrv_open(bs, filename, flags, drv);
+ /*
+ * If reopening the image file we just created fails, we really
+ * are in trouble :(
+ */
+ if (ret != 0) {
+ abort();
+ }
+out:
+ if (ret) {
+ ret = -1;
+ }
+
+ return ret;
+}
+
static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
{
if (!force) {
diff --git a/blockdev.h b/blockdev.h
index 4cb8ca9..4536b5c 100644
--- a/blockdev.h
+++ b/blockdev.h
@@ -52,5 +52,6 @@ int do_block_set_passwd(Monitor *mon, const QDict *qdict,
QObject **ret_data);
int do_change_block(Monitor *mon, const char *device,
const char *filename, const char *fmt);
int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
+int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data);
#endif
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 23024ba..dd3db36 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -801,6 +801,25 @@ STEXI
Set maximum tolerated downtime (in seconds) for migration.
ETEXI
+ {
+ .name = "snapshot_blkdev",
+ .args_type = "device:s,snapshot_file:s?,format:s?",
+ .params = "device [new-image-file] [format]",
+ .help = "initiates a live snapshot\n\t\t\t"
+ "of device. If a new image file is specified,
the\n\t\t\t"
+ "new image file will become the new root image.\n\t\t\t"
+ "If format is specified, the snapshot file will\n\t\t\t"
+ "be created in that format. Otherwise the\n\t\t\t"
+ "snapshot will be internal! (currently unsupported)",
+ .mhandler.cmd_new = do_snapshot_blkdev,
+ },
+
+STEXI
address@hidden snapshot_blkdev
address@hidden snapshot_blkdev
+Snapshot device, using snapshot file as target if provided
+ETEXI
+
#if defined(TARGET_I386)
{
.name = "drive_add",
--
1.7.2.3
- [Qemu-devel] [PATCH 06/38] ide: split ide command interpretation off, (continued)
- [Qemu-devel] [PATCH 06/38] ide: split ide command interpretation off, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 02/38] block: Introduce path_has_protocol() function, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 10/38] ide: add ncq identify data for ahci sata drives, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 11/38] pci: add storage class for sata, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 09/38] ide: move transfer_start after variable modification, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 05/38] qemu-img.c: Clean up handling of image size in img_create(), Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 01/38] blockdev: check dinfo ptr before using, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 07/38] ide: fix whitespace gap in ide_exec_cmd, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 14/38] config: move ide core and pci to pci.mak, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 21/38] Prevent creating an image with the same filename as backing file, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 20/38] Introduce do_snapshot_blkdev() and monitor command to handle it.,
Kevin Wolf <=
- [Qemu-devel] [PATCH 19/38] qemu-img.c: Re-factor img_create(), Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 25/38] ide: Register vm change state handler once only, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 18/38] qemu-img: Call error_set_progname, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 16/38] ahci: set SATA Mode Select, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 28/38] qemu-io: Add discard command, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 30/38] qemu-io: Fix typo in help texts, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 17/38] ide: honor ncq for atapi, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 31/38] docs: Add QED image format specification, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 32/38] qed: Add QEMU Enhanced Disk image format, Kevin Wolf, 2010/12/17
- [Qemu-devel] [PATCH 38/38] docs: Fix missing carets in QED specification, Kevin Wolf, 2010/12/17