From: Paolo Bonzini <pbonzini@redhat.com>
To: Federico Simoncelli <fsimonce@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Add the drive-reopen command
Date: Tue, 06 Mar 2012 08:56:29 +0100 [thread overview]
Message-ID: <4F55C32D.30004@redhat.com> (raw)
In-Reply-To: <1330976163-20597-1-git-send-email-fsimonce@redhat.com>
Il 05/03/2012 20:36, Federico Simoncelli ha scritto:
> Signed-off-by: Federico Simoncelli <fsimonce@redhat.com>
> ---
> blockdev.c | 40 +++++++++++++++++++++++++++-------------
> hmp-commands.hx | 16 ++++++++++++++++
> hmp.c | 11 +++++++++++
> hmp.h | 1 +
> qapi-schema.json | 22 ++++++++++++++++++++++
> 5 files changed, 77 insertions(+), 13 deletions(-)
>
> diff --git a/blockdev.c b/blockdev.c
> index 058b6d5..56da5c9 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -646,9 +646,8 @@ void do_commit(Monitor *mon, const QDict *qdict)
> }
> }
>
> -void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
> - bool has_format, const char *format,
> - Error **errp)
> +static void change_blockdev_image(const char *device, const char *new_image_file,
> + const char *format, bool create, Error **errp)
> {
> BlockDriverState *bs;
> BlockDriver *drv, *old_drv, *proto_drv;
> @@ -671,7 +670,7 @@ void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
> old_drv = bs->drv;
> flags = bs->open_flags;
>
> - if (!has_format) {
> + if (!format) {
> format = "qcow2";
> }
>
> @@ -681,24 +680,26 @@ void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
> return;
> }
>
> - proto_drv = bdrv_find_protocol(snapshot_file);
> + proto_drv = bdrv_find_protocol(new_image_file);
> if (!proto_drv) {
> error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
> return;
> }
>
> - ret = bdrv_img_create(snapshot_file, format, bs->filename,
> - bs->drv->format_name, NULL, -1, flags);
> - if (ret) {
> - error_set(errp, QERR_UNDEFINED_ERROR);
> - return;
> + if (create) {
> + ret = bdrv_img_create(new_image_file, format, bs->filename,
> + bs->drv->format_name, NULL, -1, flags);
> + if (ret) {
> + error_set(errp, QERR_UNDEFINED_ERROR);
> + return;
> + }
> }
>
> bdrv_drain_all();
> bdrv_flush(bs);
>
> bdrv_close(bs);
> - ret = bdrv_open(bs, snapshot_file, flags, drv);
> + ret = bdrv_open(bs, new_image_file, flags, drv);
> /*
> * If reopening the image file we just created fails, fall back
> * and try to re-open the original image. If that fails too, we
> @@ -709,11 +710,25 @@ void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
> if (ret != 0) {
> error_set(errp, QERR_OPEN_FILE_FAILED, old_filename);
> } else {
> - error_set(errp, QERR_OPEN_FILE_FAILED, snapshot_file);
> + error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file);
> }
> }
> }
>
> +void qmp_drive_reopen(const char *device, const char *new_image_file,
> + bool has_format, const char *format, Error **errp)
> +{
> + change_blockdev_image(device, new_image_file,
> + has_format ? format : NULL, false, errp);
> +}
> +
> +void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
> + bool has_format, const char *format,
> + Error **errp)
> +{
> + change_blockdev_image(device, snapshot_file,
> + has_format ? format : NULL, true, errp);
> +}
>
> /* New and old BlockDriverState structs for group snapshots */
> typedef struct BlkTransactionStates {
> @@ -877,7 +892,6 @@ exit:
> return;
> }
>
> -
> static void eject_device(BlockDriverState *bs, int force, Error **errp)
> {
> if (bdrv_in_use(bs)) {
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index 64b3656..9e08123 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -900,6 +900,22 @@ Snapshot device, using snapshot file as target if provided
> ETEXI
>
> {
> + .name = "drive-reopen",
> + .args_type = "device:B,new-image-file:s,format:s?",
> + .params = "device new-image-file [format]",
> + .help = "Assigns a new image file to a device.\n\t\t\t"
> + "The image will be opened using the format\n\t\t\t"
> + "specified or 'qcow2' by default.\n\t\t\t",
> + .mhandler.cmd = hmp_drive_reopen,
> + },
> +
> +STEXI
> +@item drive-reopen
> +@findex drive-reopen
> +Assigns a new image file to a device.
> +ETEXI
> +
> + {
> .name = "drive_add",
> .args_type = "pci_addr:s,opts:s",
> .params = "[[<domain>:]<bus>:]<slot>\n"
> diff --git a/hmp.c b/hmp.c
> index 3a54455..ab069ad 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -706,6 +706,17 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
> hmp_handle_error(mon, &errp);
> }
>
> +void hmp_drive_reopen(Monitor *mon, const QDict *qdict)
> +{
> + const char *device = qdict_get_str(qdict, "device");
> + const char *filename = qdict_get_str(qdict, "new-image-file");
> + const char *format = qdict_get_try_str(qdict, "format");
> + Error *errp = NULL;
> +
> + qmp_drive_reopen(device, filename, !!format, format, &errp);
> + hmp_handle_error(mon, &errp);
> +}
> +
> void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
> {
> qmp_migrate_cancel(NULL);
> diff --git a/hmp.h b/hmp.h
> index 5409464..e96926d 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -48,6 +48,7 @@ void hmp_block_passwd(Monitor *mon, const QDict *qdict);
> void hmp_balloon(Monitor *mon, const QDict *qdict);
> void hmp_block_resize(Monitor *mon, const QDict *qdict);
> void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict);
> +void hmp_drive_reopen(Monitor *mon, const QDict *qdict);
> void hmp_migrate_cancel(Monitor *mon, const QDict *qdict);
> void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict);
> void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict);
> diff --git a/qapi-schema.json b/qapi-schema.json
> index fd5973d..b33875d 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1214,6 +1214,28 @@
> 'data': { 'device': 'str', 'snapshot-file': 'str', '*format': 'str' } }
>
> ##
> +# @drive-reopen
> +#
> +# Assigns a new image file to a device.
> +#
> +# @device: the name of the device for which we are changing the image file.
> +#
> +# @new-image-file: the target of the new image. If the file doesn't exists the
> +# command will fail.
> +#
> +# @format: #optional the format of the new image, default is 'qcow2'.
> +#
> +# Returns: nothing on success
> +# If @device is not a valid block device, DeviceNotFound
> +# If @new-image-file can't be opened, OpenFileFailed
> +# If @format is invalid, InvalidBlockFormat
> +#
> +# Since 1.1
> +##
> +{ 'command': 'drive-reopen',
> + 'data': { 'device': 'str', 'new-image-file': 'str', '*format': 'str' } }
> +
> +##
> # @human-monitor-command:
> #
> # Execute a command on the human monitor and return the output.
I'm rebasing this patch and taking it into my series. Thanks!
Paolo
prev parent reply other threads:[~2012-03-06 7:56 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-05 19:36 [Qemu-devel] [PATCH] Add the drive-reopen command Federico Simoncelli
2012-03-06 7:56 ` Paolo Bonzini [this message]
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=4F55C32D.30004@redhat.com \
--to=pbonzini@redhat.com \
--cc=fsimonce@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.