Skip to content

Commit

Permalink
Introduce do_snapshot_blkdev() and monitor command to handle it.
Browse files Browse the repository at this point in the history
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 <Jes.Sorensen@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
Jes Sorensen authored and kevmw committed Dec 17, 2010
1 parent f88e1a4 commit f888256
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 0 deletions.
62 changes: 62 additions & 0 deletions blockdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions blockdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
19 changes: 19 additions & 0 deletions hmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,25 @@ STEXI
@item migrate_set_downtime @var{second}
@findex migrate_set_downtime
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
@item snapshot_blkdev
@findex snapshot_blkdev
Snapshot device, using snapshot file as target if provided
ETEXI

#if defined(TARGET_I386)
Expand Down

0 comments on commit f888256

Please sign in to comment.