From: Devin Nakamura <devin122@gmail.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, Devin Nakamura <devin122@gmail.com>
Subject: [Qemu-devel] [RFC 24/24] qemu-img: add inplace conversion to qemu-img
Date: Fri, 29 Jul 2011 00:49:54 -0400 [thread overview]
Message-ID: <1311914994-20482-25-git-send-email-devin122@gmail.com> (raw)
In-Reply-To: <1311914994-20482-1-git-send-email-devin122@gmail.com>
Signed-off-by: Devin Nakamura <devin122@gmail.com>
---
Makefile | 2 +
qemu-img-cmds.hx | 6 +++++
qemu-img.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
index daa3aa0..243c818 100644
--- a/Makefile
+++ b/Makefile
@@ -148,6 +148,8 @@ qemu-nbd$(EXESUF): qemu-nbd.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-ob
qemu-io$(EXESUF): qemu-io.o cmd.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) qemu-timer-common.o
+qemu-convert$(EXESUF): qemu-convert.o cmd.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) qemu-timer-common.o
+
qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $@")
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index 1299e83..ea97f83 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -33,6 +33,12 @@ STEXI
@item convert [-c] [-p] [-f @var{fmt}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] @var{filename} [@var{filename2} [...]] @var{output_filename}
ETEXI
+DEF("convert-inplace", img_convert_inplace,
+ "convert-inplace filename target_format")
+STEXI
+@item convert-inplace @var{filename} @var{target_format}
+ETEXI
+
DEF("info", img_info,
"info [-f fmt] filename")
STEXI
diff --git a/qemu-img.c b/qemu-img.c
index b205e98..c22066e 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1024,6 +1024,70 @@ out:
return 0;
}
+static int img_convert_inplace(int argc, char **argv)
+{
+ int ret;
+ BlockDriverState *bs_src, *bs_tgt;
+ QEMUOptionParameter *options = NULL;
+ BlockConversionOptions drv_options;
+ uint64_t guest_offset, host_offset, count;
+ guest_offset = host_offset = count = 0;
+ bs_src = bdrv_new("");
+ ret = bdrv_open(bs_src, argv[1], BDRV_O_RDWR, NULL);
+ if (ret) {
+ printf("Failed to open source image: %s\n", argv[1]);
+ return ret;
+ }
+
+ ret = bdrv_get_conversion_options(bs_src, &drv_options);
+ if (ret) {
+ printf("Failed getting conversion options\n");
+ goto end_before_tgt;
+ }
+
+ ret = bdrv_open_conversion_target(&bs_tgt, bs_src->file, &drv_options, options, argv[2]);
+ if (ret) {
+ printf("Failed to open conversion target, format: %s\n", argv[2]);
+ switch(ret) {
+ case -ENOENT:
+ printf("No block driver found\n"); break;
+ case -ENOTSUP:
+ printf("Not supported by block driver\n"); break;
+ default:
+ printf("Unknown error (%i)\n", ret);
+ }
+ goto end_before_tgt;
+ }
+
+ do {
+ ret = bdrv_get_mapping(bs_src, &guest_offset, &host_offset, &count);
+ if (!ret) {
+ ret = bdrv_map(bs_tgt, guest_offset, host_offset, count);
+ }
+ } while (count != 0);
+
+ if (ret) {
+ printf("An error occured during mapping process\n");
+ goto end;
+ }
+ ret = bdrv_copy_header(bs_tgt);
+ if (ret) {
+ printf("An error occured during header copy\n");
+ goto end;
+ }
+
+ ret = 0;
+
+end:
+ bdrv_close(bs_tgt);
+end_before_tgt:
+ bdrv_close(bs_src);
+ return ret;
+
+
+
+}
+
static void dump_snapshots(BlockDriverState *bs)
{
--
1.7.6.rc1
prev parent reply other threads:[~2011-07-29 4:50 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-29 4:49 [Qemu-devel] [RFC 00/24] inplace image conversion Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 01/24] block: add block conversion api Devin Nakamura
2011-08-01 13:34 ` Kevin Wolf
2011-08-02 4:43 ` Devin Nakamura
2011-08-02 8:56 ` Stefan Hajnoczi
2011-08-02 9:24 ` Kevin Wolf
2011-07-29 4:49 ` [Qemu-devel] [RFC 02/24] block: add bdrv_get_conversion_options() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 03/24] block: add bdrv_open_conversion_target() Devin Nakamura
2011-08-01 13:42 ` Kevin Wolf
2011-08-02 8:57 ` Stefan Hajnoczi
2011-07-29 4:49 ` [Qemu-devel] [RFC 04/24] block: add bdrv_get_mapping() Devin Nakamura
2011-08-02 8:58 ` Stefan Hajnoczi
2011-07-29 4:49 ` [Qemu-devel] [RFC 05/24] block: add bdrv_map() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 06/24] block: add bdrv_copy_header() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 07/24] qed: make qed_alloc_clusters round up offset to nearest cluster Devin Nakamura
2011-08-01 13:51 ` Kevin Wolf
2011-07-29 4:49 ` [Qemu-devel] [RFC 08/24] qed: add qed_find_cluster_sync() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 09/24] qed: add qed_bdrv_get_mapping() Devin Nakamura
2011-08-02 8:59 ` Stefan Hajnoczi
2011-07-29 4:49 ` [Qemu-devel] [RFC 10/24] qed: add qed_bdrv_map() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 11/24] qed: add open_conversion_target() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 12/24] qed: add bdrv_qed_copy_header() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 13/24] qed: add bdrv_qed_get_conversion_options() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 14/24] qcow2: fix typo in documentation for qcow2_get_cluster_offset() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 15/24] qcow2: split up the creation of new refcount table from the act of checking it Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 16/24] qcow2: add qcow2_drop_leaked_clusters() Devin Nakamura
2011-08-01 14:18 ` Kevin Wolf
2011-07-29 4:49 ` [Qemu-devel] [RFC 17/24] qcow2: add qcow2_get_mapping Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 18/24] qcow2: add qcow2_map Devin Nakamura
2011-08-01 14:32 ` Kevin Wolf
[not found] ` <CAJ1AwB5ohCMOeSgcUKpKHbqGuK8Eioq5dr-z+a6+vGzdMrJJ6w@mail.gmail.com>
2011-08-02 8:05 ` Kevin Wolf
2011-07-29 4:49 ` [Qemu-devel] [RFC 19/24] qcow2: add qcow2_copy_header() Devin Nakamura
2011-08-01 14:57 ` Kevin Wolf
2011-07-29 4:49 ` [Qemu-devel] [RFC 20/24] qcow2: add get_conversion_options() Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 21/24] qcow2: add qcow2_open_conversion_target() Devin Nakamura
2011-08-01 15:26 ` Kevin Wolf
2011-08-02 4:37 ` Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 22/24] qemu-io: make map command use new block mapping function Devin Nakamura
2011-08-01 15:38 ` Kevin Wolf
2011-08-02 4:02 ` Devin Nakamura
2011-07-29 4:49 ` [Qemu-devel] [RFC 23/24] qemu-io: add setmap command Devin Nakamura
2011-07-29 4:49 ` Devin Nakamura [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=1311914994-20482-25-git-send-email-devin122@gmail.com \
--to=devin122@gmail.com \
--cc=kwolf@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 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).