blob: c8a70ffc935daee2cc91a99a562075389aa4c6db [file] [log] [blame]
bellardea2384d2004-08-01 21:59:26 +00001/*
bellardfb43f4d2006-08-07 21:34:46 +00002 * QEMU disk image utility
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard68d0f702008-01-06 17:21:48 +00004 * Copyright (c) 2003-2008 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellardea2384d2004-08-01 21:59:26 +00006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
pbrookfaf07962007-11-11 02:51:17 +000024#include "qemu-common.h"
Kevin Wolf9ea2ea72009-05-18 16:42:11 +020025#include "qemu-option.h"
Kevin Wolf53f76e52010-12-16 15:10:32 +010026#include "qemu-error.h"
aliguorif7b4a942009-01-07 17:40:15 +000027#include "osdep.h"
Jes Sorensendc786bc2010-10-26 10:39:23 +020028#include "sysemu.h"
thsec36ba12007-09-16 21:59:02 +000029#include "block_int.h"
aliguori9230eaf2009-03-28 17:55:19 +000030#include <stdio.h>
bellardea2384d2004-08-01 21:59:26 +000031
bellarde8445332006-06-14 15:32:10 +000032#ifdef _WIN32
33#include <windows.h>
34#endif
35
Anthony Liguoric227f092009-10-01 16:12:16 -050036typedef struct img_cmd_t {
Stuart Brady153859b2009-06-07 00:42:17 +010037 const char *name;
38 int (*handler)(int argc, char **argv);
Anthony Liguoric227f092009-10-01 16:12:16 -050039} img_cmd_t;
Stuart Brady153859b2009-06-07 00:42:17 +010040
aurel32137519c2008-11-30 19:12:49 +000041/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
Stefan Hajnocziadfe0782010-04-13 10:29:35 +010042#define BDRV_O_FLAGS BDRV_O_CACHE_WB
Federico Simoncelli661a0f72011-06-20 12:48:19 -040043#define BDRV_DEFAULT_CACHE "writeback"
aurel32137519c2008-11-30 19:12:49 +000044
bellardea2384d2004-08-01 21:59:26 +000045static void format_print(void *opaque, const char *name)
46{
47 printf(" %s", name);
48}
49
blueswir1d2c639d2009-01-24 18:19:25 +000050/* Please keep in synch with qemu-img.texi */
pbrook3f379ab2007-11-11 03:33:13 +000051static void help(void)
bellardea2384d2004-08-01 21:59:26 +000052{
Paolo Bonzinie00291c2010-02-04 16:49:56 +010053 const char *help_msg =
54 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
malc3f020d72010-02-08 12:04:56 +030055 "usage: qemu-img command [command options]\n"
56 "QEMU disk image utility\n"
57 "\n"
58 "Command syntax:\n"
Stuart Brady153859b2009-06-07 00:42:17 +010059#define DEF(option, callback, arg_string) \
60 " " arg_string "\n"
61#include "qemu-img-cmds.h"
62#undef DEF
63#undef GEN_DOCS
malc3f020d72010-02-08 12:04:56 +030064 "\n"
65 "Command parameters:\n"
66 " 'filename' is a disk image filename\n"
67 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
Federico Simoncelli661a0f72011-06-20 12:48:19 -040068 " 'cache' is the cache mode used to write the output disk image, the valid\n"
Liu Yuan80ccf932012-04-20 17:10:56 +080069 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
70 " 'directsync' and 'unsafe' (default for convert)\n"
malc3f020d72010-02-08 12:04:56 +030071 " 'size' is the disk image size in bytes. Optional suffixes\n"
72 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
73 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
74 " 'output_filename' is the destination disk image filename\n"
75 " 'output_fmt' is the destination format\n"
76 " 'options' is a comma separated list of format specific options in a\n"
77 " name=value format. Use -o ? for an overview of the options supported by the\n"
78 " used format\n"
79 " '-c' indicates that target image must be compressed (qcow format only)\n"
80 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
81 " match exactly. The image doesn't need a working backing file before\n"
82 " rebasing in this case (useful for renaming the backing file)\n"
83 " '-h' with or without a command shows this help and lists the supported formats\n"
Jes Sorensen6b837bc2011-03-30 14:16:25 +020084 " '-p' show progress of command (only certain commands)\n"
Kevin Wolfa22f1232011-08-26 15:27:13 +020085 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
86 " for qemu-img to create a sparse image during conversion\n"
malc3f020d72010-02-08 12:04:56 +030087 "\n"
88 "Parameters to snapshot subcommand:\n"
89 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
90 " '-a' applies a snapshot (revert disk to saved state)\n"
91 " '-c' creates a snapshot\n"
92 " '-d' deletes a snapshot\n"
Paolo Bonzinie00291c2010-02-04 16:49:56 +010093 " '-l' lists all snapshots in the given image\n";
94
95 printf("%s\nSupported formats:", help_msg);
bellardea2384d2004-08-01 21:59:26 +000096 bdrv_iterate_format(format_print, NULL);
97 printf("\n");
98 exit(1);
99}
100
bellardea2384d2004-08-01 21:59:26 +0000101#if defined(WIN32)
102/* XXX: put correct support for win32 */
103static int read_password(char *buf, int buf_size)
104{
105 int c, i;
106 printf("Password: ");
107 fflush(stdout);
108 i = 0;
109 for(;;) {
110 c = getchar();
111 if (c == '\n')
112 break;
113 if (i < (buf_size - 1))
114 buf[i++] = c;
115 }
116 buf[i] = '\0';
117 return 0;
118}
119
120#else
121
122#include <termios.h>
123
124static struct termios oldtty;
125
126static void term_exit(void)
127{
128 tcsetattr (0, TCSANOW, &oldtty);
129}
130
131static void term_init(void)
132{
133 struct termios tty;
134
135 tcgetattr (0, &tty);
136 oldtty = tty;
137
138 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
139 |INLCR|IGNCR|ICRNL|IXON);
140 tty.c_oflag |= OPOST;
141 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
142 tty.c_cflag &= ~(CSIZE|PARENB);
143 tty.c_cflag |= CS8;
144 tty.c_cc[VMIN] = 1;
145 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +0000146
bellardea2384d2004-08-01 21:59:26 +0000147 tcsetattr (0, TCSANOW, &tty);
148
149 atexit(term_exit);
150}
151
pbrook3f379ab2007-11-11 03:33:13 +0000152static int read_password(char *buf, int buf_size)
bellardea2384d2004-08-01 21:59:26 +0000153{
154 uint8_t ch;
155 int i, ret;
156
157 printf("password: ");
158 fflush(stdout);
159 term_init();
160 i = 0;
161 for(;;) {
162 ret = read(0, &ch, 1);
163 if (ret == -1) {
164 if (errno == EAGAIN || errno == EINTR) {
165 continue;
166 } else {
167 ret = -1;
168 break;
169 }
170 } else if (ret == 0) {
171 ret = -1;
172 break;
173 } else {
174 if (ch == '\r') {
175 ret = 0;
176 break;
177 }
178 if (i < (buf_size - 1))
179 buf[i++] = ch;
180 }
181 }
182 term_exit();
183 buf[i] = '\0';
184 printf("\n");
185 return ret;
186}
187#endif
188
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100189static int print_block_option_help(const char *filename, const char *fmt)
190{
191 BlockDriver *drv, *proto_drv;
192 QEMUOptionParameter *create_options = NULL;
193
194 /* Find driver and parse its options */
195 drv = bdrv_find_format(fmt);
196 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100197 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100198 return 1;
199 }
200
201 proto_drv = bdrv_find_protocol(filename);
202 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100203 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100204 return 1;
205 }
206
207 create_options = append_option_parameters(create_options,
208 drv->create_options);
209 create_options = append_option_parameters(create_options,
210 proto_drv->create_options);
211 print_option_help(create_options);
212 free_option_parameters(create_options);
213 return 0;
214}
215
bellard75c23802004-08-27 21:28:58 +0000216static BlockDriverState *bdrv_new_open(const char *filename,
Sheng Yang9bc378c2010-01-29 10:15:06 +0800217 const char *fmt,
Stefan Hajnoczif163d072010-04-13 10:29:34 +0100218 int flags)
bellard75c23802004-08-27 21:28:58 +0000219{
220 BlockDriverState *bs;
221 BlockDriver *drv;
222 char password[256];
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100223 int ret;
bellard75c23802004-08-27 21:28:58 +0000224
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100225 bs = bdrv_new("image");
Kevin Wolfad717132010-12-16 15:37:41 +0100226
bellard75c23802004-08-27 21:28:58 +0000227 if (fmt) {
228 drv = bdrv_find_format(fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900229 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100230 error_report("Unknown file format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900231 goto fail;
232 }
bellard75c23802004-08-27 21:28:58 +0000233 } else {
234 drv = NULL;
235 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100236
237 ret = bdrv_open(bs, filename, flags, drv);
238 if (ret < 0) {
239 error_report("Could not open '%s': %s", filename, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900240 goto fail;
bellard75c23802004-08-27 21:28:58 +0000241 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100242
bellard75c23802004-08-27 21:28:58 +0000243 if (bdrv_is_encrypted(bs)) {
244 printf("Disk image '%s' is encrypted.\n", filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900245 if (read_password(password, sizeof(password)) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100246 error_report("No password given");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900247 goto fail;
248 }
249 if (bdrv_set_key(bs, password) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100250 error_report("invalid password");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900251 goto fail;
252 }
bellard75c23802004-08-27 21:28:58 +0000253 }
254 return bs;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900255fail:
256 if (bs) {
257 bdrv_delete(bs);
258 }
259 return NULL;
bellard75c23802004-08-27 21:28:58 +0000260}
261
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900262static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
Jes Sorenseneec77d92010-12-07 17:44:34 +0100263 const char *base_filename,
264 const char *base_fmt)
Kevin Wolfefa84d42009-05-18 16:42:12 +0200265{
Kevin Wolfefa84d42009-05-18 16:42:12 +0200266 if (base_filename) {
267 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100268 error_report("Backing file not supported for file format '%s'",
269 fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900270 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200271 }
272 }
273 if (base_fmt) {
274 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100275 error_report("Backing file format not supported for file "
276 "format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900277 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200278 }
279 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900280 return 0;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200281}
282
bellardea2384d2004-08-01 21:59:26 +0000283static int img_create(int argc, char **argv)
284{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100285 int c, ret = 0;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100286 uint64_t img_size = -1;
bellardea2384d2004-08-01 21:59:26 +0000287 const char *fmt = "raw";
aliguori9230eaf2009-03-28 17:55:19 +0000288 const char *base_fmt = NULL;
bellardea2384d2004-08-01 21:59:26 +0000289 const char *filename;
290 const char *base_filename = NULL;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200291 char *options = NULL;
ths3b46e622007-09-17 08:09:54 +0000292
bellardea2384d2004-08-01 21:59:26 +0000293 for(;;) {
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200294 c = getopt(argc, argv, "F:b:f:he6o:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100295 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000296 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100297 }
bellardea2384d2004-08-01 21:59:26 +0000298 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100299 case '?':
bellardea2384d2004-08-01 21:59:26 +0000300 case 'h':
301 help();
302 break;
aliguori9230eaf2009-03-28 17:55:19 +0000303 case 'F':
304 base_fmt = optarg;
305 break;
bellardea2384d2004-08-01 21:59:26 +0000306 case 'b':
307 base_filename = optarg;
308 break;
309 case 'f':
310 fmt = optarg;
311 break;
312 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200313 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100314 "encryption\' instead!");
315 return 1;
thsd8871c52007-10-24 16:11:42 +0000316 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200317 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100318 "compat6\' instead!");
319 return 1;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200320 case 'o':
321 options = optarg;
322 break;
bellardea2384d2004-08-01 21:59:26 +0000323 }
324 }
aliguori9230eaf2009-03-28 17:55:19 +0000325
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900326 /* Get the filename */
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100327 if (optind >= argc) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900328 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100329 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900330 filename = argv[optind++];
331
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100332 /* Get image size, if specified */
333 if (optind < argc) {
Jes Sorensen70b4f4b2011-01-05 11:41:02 +0100334 int64_t sval;
Markus Armbrustere36b3692011-11-22 09:46:05 +0100335 char *end;
336 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
337 if (sval < 0 || *end) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100338 error_report("Invalid image size specified! You may use k, M, G or "
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100339 "T suffixes for ");
Jes Sorensen15654a62010-12-16 14:31:53 +0100340 error_report("kilobytes, megabytes, gigabytes and terabytes.");
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100341 ret = -1;
342 goto out;
343 }
344 img_size = (uint64_t)sval;
345 }
346
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100347 if (options && !strcmp(options, "?")) {
348 ret = print_block_option_help(filename, fmt);
349 goto out;
350 }
351
Jes Sorensenf88e1a42010-12-16 13:52:15 +0100352 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
353 options, img_size, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900354out:
355 if (ret) {
356 return 1;
357 }
bellardea2384d2004-08-01 21:59:26 +0000358 return 0;
359}
360
Kevin Wolfe076f332010-06-29 11:43:13 +0200361/*
362 * Checks an image for consistency. Exit codes:
363 *
364 * 0 - Check completed, image is good
365 * 1 - Check not completed because of internal errors
366 * 2 - Check completed, image is corrupted
367 * 3 - Check completed, image has leaked clusters, but is good otherwise
368 */
aliguori15859692009-04-21 23:11:53 +0000369static int img_check(int argc, char **argv)
370{
371 int c, ret;
372 const char *filename, *fmt;
aliguori15859692009-04-21 23:11:53 +0000373 BlockDriverState *bs;
Kevin Wolfe076f332010-06-29 11:43:13 +0200374 BdrvCheckResult result;
aliguori15859692009-04-21 23:11:53 +0000375
376 fmt = NULL;
377 for(;;) {
378 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100379 if (c == -1) {
aliguori15859692009-04-21 23:11:53 +0000380 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100381 }
aliguori15859692009-04-21 23:11:53 +0000382 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100383 case '?':
aliguori15859692009-04-21 23:11:53 +0000384 case 'h':
385 help();
386 break;
387 case 'f':
388 fmt = optarg;
389 break;
390 }
391 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100392 if (optind >= argc) {
aliguori15859692009-04-21 23:11:53 +0000393 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100394 }
aliguori15859692009-04-21 23:11:53 +0000395 filename = argv[optind++];
396
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100397 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900398 if (!bs) {
399 return 1;
400 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200401 ret = bdrv_check(bs, &result);
402
403 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100404 error_report("This image format does not support checks");
Kevin Wolfe076f332010-06-29 11:43:13 +0200405 bdrv_delete(bs);
406 return 1;
407 }
408
409 if (!(result.corruptions || result.leaks || result.check_errors)) {
410 printf("No errors were found on the image.\n");
411 } else {
412 if (result.corruptions) {
413 printf("\n%d errors were found on the image.\n"
414 "Data may be corrupted, or further writes to the image "
415 "may corrupt it.\n",
416 result.corruptions);
aliguori15859692009-04-21 23:11:53 +0000417 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200418
419 if (result.leaks) {
420 printf("\n%d leaked clusters were found on the image.\n"
421 "This means waste of disk space, but no harm to data.\n",
422 result.leaks);
423 }
424
425 if (result.check_errors) {
426 printf("\n%d internal errors have occurred during the check.\n",
427 result.check_errors);
428 }
aliguori15859692009-04-21 23:11:53 +0000429 }
430
Dong Xu Wangf8111c22012-03-15 20:13:31 +0800431 if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
432 printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
433 result.bfi.allocated_clusters, result.bfi.total_clusters,
434 result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
435 result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
436 }
437
aliguori15859692009-04-21 23:11:53 +0000438 bdrv_delete(bs);
Kevin Wolfe076f332010-06-29 11:43:13 +0200439
440 if (ret < 0 || result.check_errors) {
441 printf("\nAn error has occurred during the check: %s\n"
442 "The check is not complete and may have missed error.\n",
443 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900444 return 1;
445 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200446
447 if (result.corruptions) {
448 return 2;
449 } else if (result.leaks) {
450 return 3;
451 } else {
452 return 0;
453 }
aliguori15859692009-04-21 23:11:53 +0000454}
455
bellardea2384d2004-08-01 21:59:26 +0000456static int img_commit(int argc, char **argv)
457{
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400458 int c, ret, flags;
459 const char *filename, *fmt, *cache;
bellardea2384d2004-08-01 21:59:26 +0000460 BlockDriverState *bs;
461
462 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400463 cache = BDRV_DEFAULT_CACHE;
bellardea2384d2004-08-01 21:59:26 +0000464 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400465 c = getopt(argc, argv, "f:ht:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100466 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000467 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100468 }
bellardea2384d2004-08-01 21:59:26 +0000469 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100470 case '?':
bellardea2384d2004-08-01 21:59:26 +0000471 case 'h':
472 help();
473 break;
474 case 'f':
475 fmt = optarg;
476 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400477 case 't':
478 cache = optarg;
479 break;
bellardea2384d2004-08-01 21:59:26 +0000480 }
481 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100482 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +0000483 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100484 }
bellardea2384d2004-08-01 21:59:26 +0000485 filename = argv[optind++];
486
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400487 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100488 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400489 if (ret < 0) {
490 error_report("Invalid cache option: %s", cache);
491 return -1;
492 }
493
494 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900495 if (!bs) {
496 return 1;
497 }
bellardea2384d2004-08-01 21:59:26 +0000498 ret = bdrv_commit(bs);
499 switch(ret) {
500 case 0:
501 printf("Image committed.\n");
502 break;
503 case -ENOENT:
Jes Sorensen15654a62010-12-16 14:31:53 +0100504 error_report("No disk inserted");
bellardea2384d2004-08-01 21:59:26 +0000505 break;
506 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +0100507 error_report("Image is read-only");
bellardea2384d2004-08-01 21:59:26 +0000508 break;
509 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +0100510 error_report("Image is already committed");
bellardea2384d2004-08-01 21:59:26 +0000511 break;
512 default:
Jes Sorensen15654a62010-12-16 14:31:53 +0100513 error_report("Error while committing image");
bellardea2384d2004-08-01 21:59:26 +0000514 break;
515 }
516
517 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900518 if (ret) {
519 return 1;
520 }
bellardea2384d2004-08-01 21:59:26 +0000521 return 0;
522}
523
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400524/*
thsf58c7b32008-06-05 21:53:49 +0000525 * Returns true iff the first sector pointed to by 'buf' contains at least
526 * a non-NUL byte.
527 *
528 * 'pnum' is set to the number of sectors (including and immediately following
529 * the first one) that are known to be in the same allocated/unallocated state.
530 */
bellardea2384d2004-08-01 21:59:26 +0000531static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
532{
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000533 bool is_zero;
534 int i;
bellardea2384d2004-08-01 21:59:26 +0000535
536 if (n <= 0) {
537 *pnum = 0;
538 return 0;
539 }
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000540 is_zero = buffer_is_zero(buf, 512);
bellardea2384d2004-08-01 21:59:26 +0000541 for(i = 1; i < n; i++) {
542 buf += 512;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000543 if (is_zero != buffer_is_zero(buf, 512)) {
bellardea2384d2004-08-01 21:59:26 +0000544 break;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000545 }
bellardea2384d2004-08-01 21:59:26 +0000546 }
547 *pnum = i;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000548 return !is_zero;
bellardea2384d2004-08-01 21:59:26 +0000549}
550
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100551/*
Kevin Wolfa22f1232011-08-26 15:27:13 +0200552 * Like is_allocated_sectors, but if the buffer starts with a used sector,
553 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
554 * breaking up write requests for only small sparse areas.
555 */
556static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
557 int min)
558{
559 int ret;
560 int num_checked, num_used;
561
562 if (n < min) {
563 min = n;
564 }
565
566 ret = is_allocated_sectors(buf, n, pnum);
567 if (!ret) {
568 return ret;
569 }
570
571 num_used = *pnum;
572 buf += BDRV_SECTOR_SIZE * *pnum;
573 n -= *pnum;
574 num_checked = num_used;
575
576 while (n > 0) {
577 ret = is_allocated_sectors(buf, n, pnum);
578
579 buf += BDRV_SECTOR_SIZE * *pnum;
580 n -= *pnum;
581 num_checked += *pnum;
582 if (ret) {
583 num_used = num_checked;
584 } else if (*pnum >= min) {
585 break;
586 }
587 }
588
589 *pnum = num_used;
590 return 1;
591}
592
593/*
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100594 * Compares two buffers sector by sector. Returns 0 if the first sector of both
595 * buffers matches, non-zero otherwise.
596 *
597 * pnum is set to the number of sectors (including and immediately following
598 * the first one) that are known to have the same comparison result
599 */
600static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
601 int *pnum)
602{
603 int res, i;
604
605 if (n <= 0) {
606 *pnum = 0;
607 return 0;
608 }
609
610 res = !!memcmp(buf1, buf2, 512);
611 for(i = 1; i < n; i++) {
612 buf1 += 512;
613 buf2 += 512;
614
615 if (!!memcmp(buf1, buf2, 512) != res) {
616 break;
617 }
618 }
619
620 *pnum = i;
621 return res;
622}
623
Kevin Wolf80ee15a2009-09-15 12:30:43 +0200624#define IO_BUF_SIZE (2 * 1024 * 1024)
bellardea2384d2004-08-01 21:59:26 +0000625
626static int img_convert(int argc, char **argv)
627{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100628 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400629 int progress = 0, flags;
630 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900631 BlockDriver *drv, *proto_drv;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900632 BlockDriverState **bs = NULL, *out_bs = NULL;
ths96b8f132007-12-17 01:35:20 +0000633 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
634 uint64_t bs_sectors;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900635 uint8_t * buf = NULL;
bellardea2384d2004-08-01 21:59:26 +0000636 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +0000637 BlockDriverInfo bdi;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900638 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfa18953f2010-10-14 15:46:04 +0200639 QEMUOptionParameter *out_baseimg_param;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200640 char *options = NULL;
edison51ef6722010-09-21 19:58:41 -0700641 const char *snapshot_name = NULL;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200642 float local_progress;
Kevin Wolfa22f1232011-08-26 15:27:13 +0200643 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
bellardea2384d2004-08-01 21:59:26 +0000644
645 fmt = NULL;
646 out_fmt = "raw";
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400647 cache = "unsafe";
thsf58c7b32008-06-05 21:53:49 +0000648 out_baseimg = NULL;
Jes Sorenseneec77d92010-12-07 17:44:34 +0100649 compress = 0;
bellardea2384d2004-08-01 21:59:26 +0000650 for(;;) {
Kevin Wolfa22f1232011-08-26 15:27:13 +0200651 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100652 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000653 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100654 }
bellardea2384d2004-08-01 21:59:26 +0000655 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100656 case '?':
bellardea2384d2004-08-01 21:59:26 +0000657 case 'h':
658 help();
659 break;
660 case 'f':
661 fmt = optarg;
662 break;
663 case 'O':
664 out_fmt = optarg;
665 break;
thsf58c7b32008-06-05 21:53:49 +0000666 case 'B':
667 out_baseimg = optarg;
668 break;
bellardea2384d2004-08-01 21:59:26 +0000669 case 'c':
Jes Sorenseneec77d92010-12-07 17:44:34 +0100670 compress = 1;
bellardea2384d2004-08-01 21:59:26 +0000671 break;
672 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200673 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100674 "encryption\' instead!");
675 return 1;
thsec36ba12007-09-16 21:59:02 +0000676 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200677 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100678 "compat6\' instead!");
679 return 1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200680 case 'o':
681 options = optarg;
682 break;
edison51ef6722010-09-21 19:58:41 -0700683 case 's':
684 snapshot_name = optarg;
685 break;
Kevin Wolfa22f1232011-08-26 15:27:13 +0200686 case 'S':
687 {
688 int64_t sval;
Markus Armbrustere36b3692011-11-22 09:46:05 +0100689 char *end;
690 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
691 if (sval < 0 || *end) {
Kevin Wolfa22f1232011-08-26 15:27:13 +0200692 error_report("Invalid minimum zero buffer size for sparse output specified");
693 return 1;
694 }
695
696 min_sparse = sval / BDRV_SECTOR_SIZE;
697 break;
698 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200699 case 'p':
700 progress = 1;
701 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400702 case 't':
703 cache = optarg;
704 break;
bellardea2384d2004-08-01 21:59:26 +0000705 }
706 }
ths3b46e622007-09-17 08:09:54 +0000707
balrog926c2d22007-10-31 01:11:44 +0000708 bs_n = argc - optind - 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100709 if (bs_n < 1) {
710 help();
711 }
balrog926c2d22007-10-31 01:11:44 +0000712
713 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +0000714
Charles Arnoldfa170c12012-05-11 10:57:54 -0600715 /* Initialize before goto out */
716 qemu_progress_init(progress, 2.0);
717
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100718 if (options && !strcmp(options, "?")) {
719 ret = print_block_option_help(out_filename, out_fmt);
720 goto out;
721 }
722
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900723 if (bs_n > 1 && out_baseimg) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100724 error_report("-B makes no sense when concatenating multiple input "
725 "images");
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100726 ret = -1;
727 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900728 }
Dong Xu Wangf8111c22012-03-15 20:13:31 +0800729
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200730 qemu_progress_print(0, 100);
731
Anthony Liguori7267c092011-08-20 22:09:37 -0500732 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
balrog926c2d22007-10-31 01:11:44 +0000733
734 total_sectors = 0;
735 for (bs_i = 0; bs_i < bs_n; bs_i++) {
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100736 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900737 if (!bs[bs_i]) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100738 error_report("Could not open '%s'", argv[optind + bs_i]);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900739 ret = -1;
740 goto out;
741 }
balrog926c2d22007-10-31 01:11:44 +0000742 bdrv_get_geometry(bs[bs_i], &bs_sectors);
743 total_sectors += bs_sectors;
744 }
bellardea2384d2004-08-01 21:59:26 +0000745
edison51ef6722010-09-21 19:58:41 -0700746 if (snapshot_name != NULL) {
747 if (bs_n > 1) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200748 error_report("No support for concatenating multiple snapshot");
edison51ef6722010-09-21 19:58:41 -0700749 ret = -1;
750 goto out;
751 }
752 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200753 error_report("Failed to load snapshot");
edison51ef6722010-09-21 19:58:41 -0700754 ret = -1;
755 goto out;
756 }
757 }
758
Kevin Wolfefa84d42009-05-18 16:42:12 +0200759 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000760 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900761 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100762 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900763 ret = -1;
764 goto out;
765 }
balrog926c2d22007-10-31 01:11:44 +0000766
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900767 proto_drv = bdrv_find_protocol(out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900768 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100769 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900770 ret = -1;
771 goto out;
772 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900773
774 create_options = append_option_parameters(create_options,
775 drv->create_options);
776 create_options = append_option_parameters(create_options,
777 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200778
Kevin Wolfefa84d42009-05-18 16:42:12 +0200779 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900780 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200781 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100782 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900783 ret = -1;
784 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200785 }
786 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900787 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200788 }
789
790 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +0100791 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900792 if (ret < 0) {
793 goto out;
794 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200795
Kevin Wolfa18953f2010-10-14 15:46:04 +0200796 /* Get backing file name if -o backing_file was used */
797 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
798 if (out_baseimg_param) {
799 out_baseimg = out_baseimg_param->value.s;
800 }
801
Kevin Wolfefa84d42009-05-18 16:42:12 +0200802 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +0100803 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +0200804 QEMUOptionParameter *encryption =
805 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
Kevin Wolf41521fa2011-10-18 16:19:42 +0200806 QEMUOptionParameter *preallocation =
807 get_option_parameter(param, BLOCK_OPT_PREALLOC);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200808
809 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100810 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900811 ret = -1;
812 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200813 }
814
815 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100816 error_report("Compression and encryption not supported at "
817 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900818 ret = -1;
819 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200820 }
Kevin Wolf41521fa2011-10-18 16:19:42 +0200821
822 if (preallocation && preallocation->value.s
823 && strcmp(preallocation->value.s, "off"))
824 {
825 error_report("Compression and preallocation not supported at "
826 "the same time");
827 ret = -1;
828 goto out;
829 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200830 }
831
832 /* Create the new image */
833 ret = bdrv_create(drv, out_filename, param);
bellardea2384d2004-08-01 21:59:26 +0000834 if (ret < 0) {
835 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100836 error_report("Formatting not supported for file format '%s'",
837 out_fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000838 } else if (ret == -EFBIG) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100839 error_report("The image size is too large for file format '%s'",
840 out_fmt);
bellardea2384d2004-08-01 21:59:26 +0000841 } else {
Jes Sorensen15654a62010-12-16 14:31:53 +0100842 error_report("%s: error while converting %s: %s",
843 out_filename, out_fmt, strerror(-ret));
bellardea2384d2004-08-01 21:59:26 +0000844 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900845 goto out;
bellardea2384d2004-08-01 21:59:26 +0000846 }
ths3b46e622007-09-17 08:09:54 +0000847
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400848 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100849 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400850 if (ret < 0) {
851 error_report("Invalid cache option: %s", cache);
852 return -1;
853 }
854
855 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900856 if (!out_bs) {
857 ret = -1;
858 goto out;
859 }
bellardea2384d2004-08-01 21:59:26 +0000860
balrog926c2d22007-10-31 01:11:44 +0000861 bs_i = 0;
862 bs_offset = 0;
863 bdrv_get_geometry(bs[0], &bs_sectors);
Kevin Wolfbb1c0592011-08-08 14:09:12 +0200864 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +0000865
Jes Sorenseneec77d92010-12-07 17:44:34 +0100866 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900867 ret = bdrv_get_info(out_bs, &bdi);
868 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100869 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900870 goto out;
871 }
bellardfaea38e2006-08-05 21:31:00 +0000872 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900873 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100874 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900875 ret = -1;
876 goto out;
877 }
bellardea2384d2004-08-01 21:59:26 +0000878 cluster_sectors = cluster_size >> 9;
879 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200880
881 nb_sectors = total_sectors;
882 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200883 (nb_sectors / MIN(nb_sectors, cluster_sectors));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200884
bellardea2384d2004-08-01 21:59:26 +0000885 for(;;) {
balrog926c2d22007-10-31 01:11:44 +0000886 int64_t bs_num;
887 int remainder;
888 uint8_t *buf2;
889
bellardea2384d2004-08-01 21:59:26 +0000890 nb_sectors = total_sectors - sector_num;
891 if (nb_sectors <= 0)
892 break;
893 if (nb_sectors >= cluster_sectors)
894 n = cluster_sectors;
895 else
896 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000897
898 bs_num = sector_num - bs_offset;
899 assert (bs_num >= 0);
900 remainder = n;
901 buf2 = buf;
902 while (remainder > 0) {
903 int nlow;
904 while (bs_num == bs_sectors) {
905 bs_i++;
906 assert (bs_i < bs_n);
907 bs_offset += bs_sectors;
908 bdrv_get_geometry(bs[bs_i], &bs_sectors);
909 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +0000910 /* printf("changing part: sector_num=%" PRId64 ", "
911 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
912 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +0000913 }
914 assert (bs_num < bs_sectors);
915
916 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
917
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900918 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
919 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +0100920 error_report("error while reading sector %" PRId64 ": %s",
921 bs_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900922 goto out;
923 }
balrog926c2d22007-10-31 01:11:44 +0000924
925 buf2 += nlow * 512;
926 bs_num += nlow;
927
928 remainder -= nlow;
929 }
930 assert (remainder == 0);
931
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100932 if (n < cluster_sectors) {
bellardea2384d2004-08-01 21:59:26 +0000933 memset(buf + n * 512, 0, cluster_size - n * 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100934 }
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000935 if (!buffer_is_zero(buf, cluster_size)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900936 ret = bdrv_write_compressed(out_bs, sector_num, buf,
937 cluster_sectors);
938 if (ret != 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +0100939 error_report("error while compressing sector %" PRId64
940 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900941 goto out;
942 }
bellardea2384d2004-08-01 21:59:26 +0000943 }
944 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200945 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +0000946 }
bellardfaea38e2006-08-05 21:31:00 +0000947 /* signal EOF to align */
948 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +0000949 } else {
Kevin Wolff2feebb2010-04-14 17:30:35 +0200950 int has_zero_init = bdrv_has_zero_init(out_bs);
951
thsf58c7b32008-06-05 21:53:49 +0000952 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200953 nb_sectors = total_sectors - sector_num;
954 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200955 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200956
bellardea2384d2004-08-01 21:59:26 +0000957 for(;;) {
958 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100959 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +0000960 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100961 }
962 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +0000963 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100964 } else {
bellardea2384d2004-08-01 21:59:26 +0000965 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100966 }
balrog926c2d22007-10-31 01:11:44 +0000967
968 while (sector_num - bs_offset >= bs_sectors) {
969 bs_i ++;
970 assert (bs_i < bs_n);
971 bs_offset += bs_sectors;
972 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +0000973 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
974 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +0000975 sector_num, bs_i, bs_offset, bs_sectors); */
976 }
977
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100978 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +0000979 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100980 }
balrog926c2d22007-10-31 01:11:44 +0000981
Kevin Wolff2feebb2010-04-14 17:30:35 +0200982 if (has_zero_init) {
Akkarit Sangpetchd0320442009-07-17 10:02:15 +0200983 /* If the output image is being created as a copy on write image,
984 assume that sectors which are unallocated in the input image
985 are present in both the output's and input's base images (no
986 need to copy them). */
987 if (out_baseimg) {
988 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
989 n, &n1)) {
990 sector_num += n1;
991 continue;
992 }
993 /* The next 'n1' sectors are allocated in the input image. Copy
994 only those as they may be followed by unallocated sectors. */
995 n = n1;
aliguori93c65b42009-04-05 17:40:43 +0000996 }
aliguori93c65b42009-04-05 17:40:43 +0000997 } else {
998 n1 = n;
thsf58c7b32008-06-05 21:53:49 +0000999 }
1000
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001001 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1002 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001003 error_report("error while reading sector %" PRId64 ": %s",
1004 sector_num - bs_offset, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001005 goto out;
1006 }
bellardea2384d2004-08-01 21:59:26 +00001007 /* NOTE: at the same time we convert, we do not write zero
1008 sectors to have a chance to compress the image. Ideally, we
1009 should add a specific call to have the info to go faster */
1010 buf1 = buf;
1011 while (n > 0) {
thsf58c7b32008-06-05 21:53:49 +00001012 /* If the output image is being created as a copy on write image,
1013 copy all sectors even the ones containing only NUL bytes,
aliguori93c65b42009-04-05 17:40:43 +00001014 because they may differ from the sectors in the base image.
1015
1016 If the output is to a host device, we also write out
1017 sectors that are entirely 0, since whatever data was
1018 already there is garbage, not 0s. */
Kevin Wolff2feebb2010-04-14 17:30:35 +02001019 if (!has_zero_init || out_baseimg ||
Kevin Wolfa22f1232011-08-26 15:27:13 +02001020 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001021 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1022 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001023 error_report("error while writing sector %" PRId64
1024 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001025 goto out;
1026 }
bellardea2384d2004-08-01 21:59:26 +00001027 }
1028 sector_num += n1;
1029 n -= n1;
1030 buf1 += n1 * 512;
1031 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001032 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001033 }
1034 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001035out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001036 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001037 free_option_parameters(create_options);
1038 free_option_parameters(param);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001039 qemu_vfree(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001040 if (out_bs) {
1041 bdrv_delete(out_bs);
1042 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001043 if (bs) {
1044 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1045 if (bs[bs_i]) {
1046 bdrv_delete(bs[bs_i]);
1047 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001048 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001049 g_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001050 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001051 if (ret) {
1052 return 1;
1053 }
bellardea2384d2004-08-01 21:59:26 +00001054 return 0;
1055}
1056
bellard57d1a2b2004-08-03 21:15:11 +00001057
bellardfaea38e2006-08-05 21:31:00 +00001058static void dump_snapshots(BlockDriverState *bs)
1059{
1060 QEMUSnapshotInfo *sn_tab, *sn;
1061 int nb_sns, i;
1062 char buf[256];
1063
1064 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1065 if (nb_sns <= 0)
1066 return;
1067 printf("Snapshot list:\n");
1068 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1069 for(i = 0; i < nb_sns; i++) {
1070 sn = &sn_tab[i];
1071 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1072 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001073 g_free(sn_tab);
bellardfaea38e2006-08-05 21:31:00 +00001074}
1075
bellardea2384d2004-08-01 21:59:26 +00001076static int img_info(int argc, char **argv)
1077{
1078 int c;
1079 const char *filename, *fmt;
bellardea2384d2004-08-01 21:59:26 +00001080 BlockDriverState *bs;
1081 char fmt_name[128], size_buf[128], dsize_buf[128];
ths96b8f132007-12-17 01:35:20 +00001082 uint64_t total_sectors;
1083 int64_t allocated_size;
bellard93b6b2a2006-08-01 15:51:11 +00001084 char backing_filename[1024];
1085 char backing_filename2[1024];
bellardfaea38e2006-08-05 21:31:00 +00001086 BlockDriverInfo bdi;
bellardea2384d2004-08-01 21:59:26 +00001087
1088 fmt = NULL;
1089 for(;;) {
1090 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001091 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001092 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001093 }
bellardea2384d2004-08-01 21:59:26 +00001094 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001095 case '?':
bellardea2384d2004-08-01 21:59:26 +00001096 case 'h':
1097 help();
1098 break;
1099 case 'f':
1100 fmt = optarg;
1101 break;
1102 }
1103 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001104 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +00001105 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001106 }
bellardea2384d2004-08-01 21:59:26 +00001107 filename = argv[optind++];
1108
Stefan Hajnocziadfe0782010-04-13 10:29:35 +01001109 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001110 if (!bs) {
1111 return 1;
1112 }
bellardea2384d2004-08-01 21:59:26 +00001113 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1114 bdrv_get_geometry(bs, &total_sectors);
1115 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
Fam Zheng4a1d5e12011-07-12 19:56:39 +08001116 allocated_size = bdrv_get_allocated_file_size(bs);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001117 if (allocated_size < 0) {
blueswir1a10ea302008-08-24 10:30:33 +00001118 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001119 } else {
ths5fafdf22007-09-16 21:08:06 +00001120 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
bellardde167e42005-04-28 21:15:08 +00001121 allocated_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001122 }
bellardea2384d2004-08-01 21:59:26 +00001123 printf("image: %s\n"
1124 "file format: %s\n"
bellardec3757d2006-06-14 15:50:07 +00001125 "virtual size: %s (%" PRId64 " bytes)\n"
bellardea2384d2004-08-01 21:59:26 +00001126 "disk size: %s\n",
ths5fafdf22007-09-16 21:08:06 +00001127 filename, fmt_name, size_buf,
bellardec3757d2006-06-14 15:50:07 +00001128 (total_sectors * 512),
bellardea2384d2004-08-01 21:59:26 +00001129 dsize_buf);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001130 if (bdrv_is_encrypted(bs)) {
bellardea2384d2004-08-01 21:59:26 +00001131 printf("encrypted: yes\n");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001132 }
bellardfaea38e2006-08-05 21:31:00 +00001133 if (bdrv_get_info(bs, &bdi) >= 0) {
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001134 if (bdi.cluster_size != 0) {
bellardfaea38e2006-08-05 21:31:00 +00001135 printf("cluster_size: %d\n", bdi.cluster_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001136 }
Dong Xu Wang64c79162012-03-15 20:13:33 +08001137 if (bdi.is_dirty) {
1138 printf("cleanly shut down: no\n");
1139 }
bellardfaea38e2006-08-05 21:31:00 +00001140 }
bellard93b6b2a2006-08-01 15:51:11 +00001141 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
bellardfaea38e2006-08-05 21:31:00 +00001142 if (backing_filename[0] != '\0') {
Paolo Bonzinidc5a1372012-05-08 16:51:50 +02001143 bdrv_get_full_backing_filename(bs, backing_filename2,
1144 sizeof(backing_filename2));
1145 printf("backing file: %s", backing_filename);
1146 if (strcmp(backing_filename, backing_filename2) != 0) {
1147 printf(" (actual path: %s)", backing_filename2);
1148 }
1149 putchar('\n');
bellardfaea38e2006-08-05 21:31:00 +00001150 }
1151 dump_snapshots(bs);
bellardea2384d2004-08-01 21:59:26 +00001152 bdrv_delete(bs);
1153 return 0;
1154}
1155
aliguorif7b4a942009-01-07 17:40:15 +00001156#define SNAPSHOT_LIST 1
1157#define SNAPSHOT_CREATE 2
1158#define SNAPSHOT_APPLY 3
1159#define SNAPSHOT_DELETE 4
1160
Stuart Brady153859b2009-06-07 00:42:17 +01001161static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00001162{
1163 BlockDriverState *bs;
1164 QEMUSnapshotInfo sn;
1165 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001166 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00001167 int action = 0;
1168 qemu_timeval tv;
1169
Kevin Wolf710da702011-01-10 12:33:02 +01001170 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00001171 /* Parse commandline parameters */
1172 for(;;) {
1173 c = getopt(argc, argv, "la:c:d:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001174 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00001175 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001176 }
aliguorif7b4a942009-01-07 17:40:15 +00001177 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001178 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00001179 case 'h':
1180 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001181 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001182 case 'l':
1183 if (action) {
1184 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001185 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001186 }
1187 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02001188 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00001189 break;
1190 case 'a':
1191 if (action) {
1192 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001193 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001194 }
1195 action = SNAPSHOT_APPLY;
1196 snapshot_name = optarg;
1197 break;
1198 case 'c':
1199 if (action) {
1200 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001201 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001202 }
1203 action = SNAPSHOT_CREATE;
1204 snapshot_name = optarg;
1205 break;
1206 case 'd':
1207 if (action) {
1208 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001209 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001210 }
1211 action = SNAPSHOT_DELETE;
1212 snapshot_name = optarg;
1213 break;
1214 }
1215 }
1216
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001217 if (optind >= argc) {
aliguorif7b4a942009-01-07 17:40:15 +00001218 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001219 }
aliguorif7b4a942009-01-07 17:40:15 +00001220 filename = argv[optind++];
1221
1222 /* Open the image */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001223 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001224 if (!bs) {
1225 return 1;
1226 }
aliguorif7b4a942009-01-07 17:40:15 +00001227
1228 /* Perform the requested action */
1229 switch(action) {
1230 case SNAPSHOT_LIST:
1231 dump_snapshots(bs);
1232 break;
1233
1234 case SNAPSHOT_CREATE:
1235 memset(&sn, 0, sizeof(sn));
1236 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1237
1238 qemu_gettimeofday(&tv);
1239 sn.date_sec = tv.tv_sec;
1240 sn.date_nsec = tv.tv_usec * 1000;
1241
1242 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001243 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001244 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001245 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001246 }
aliguorif7b4a942009-01-07 17:40:15 +00001247 break;
1248
1249 case SNAPSHOT_APPLY:
1250 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001251 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001252 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001253 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001254 }
aliguorif7b4a942009-01-07 17:40:15 +00001255 break;
1256
1257 case SNAPSHOT_DELETE:
1258 ret = bdrv_snapshot_delete(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001259 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001260 error_report("Could not delete snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001261 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001262 }
aliguorif7b4a942009-01-07 17:40:15 +00001263 break;
1264 }
1265
1266 /* Cleanup */
1267 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001268 if (ret) {
1269 return 1;
1270 }
Stuart Brady153859b2009-06-07 00:42:17 +01001271 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001272}
1273
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001274static int img_rebase(int argc, char **argv)
1275{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001276 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001277 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001278 char *filename;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001279 const char *fmt, *cache, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001280 int c, flags, ret;
1281 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001282 int progress = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001283
1284 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001285 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001286 cache = BDRV_DEFAULT_CACHE;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001287 out_baseimg = NULL;
1288 out_basefmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001289 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001290 c = getopt(argc, argv, "uhf:F:b:pt:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001291 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001292 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001293 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001294 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001295 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001296 case 'h':
1297 help();
1298 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001299 case 'f':
1300 fmt = optarg;
1301 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001302 case 'F':
1303 out_basefmt = optarg;
1304 break;
1305 case 'b':
1306 out_baseimg = optarg;
1307 break;
1308 case 'u':
1309 unsafe = 1;
1310 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001311 case 'p':
1312 progress = 1;
1313 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001314 case 't':
1315 cache = optarg;
1316 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001317 }
1318 }
1319
Anthony Liguori9a9d9db2011-04-13 15:51:47 +01001320 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001321 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001322 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001323 filename = argv[optind++];
1324
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001325 qemu_progress_init(progress, 2.0);
1326 qemu_progress_print(0, 100);
1327
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001328 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01001329 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001330 if (ret < 0) {
1331 error_report("Invalid cache option: %s", cache);
1332 return -1;
1333 }
1334
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001335 /*
1336 * Open the images.
1337 *
1338 * Ignore the old backing file for unsafe rebase in case we want to correct
1339 * the reference to a renamed or moved backing file.
1340 */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001341 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001342 if (!bs) {
1343 return 1;
1344 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001345
1346 /* Find the right drivers for the backing files */
1347 old_backing_drv = NULL;
1348 new_backing_drv = NULL;
1349
1350 if (!unsafe && bs->backing_format[0] != '\0') {
1351 old_backing_drv = bdrv_find_format(bs->backing_format);
1352 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001353 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001354 ret = -1;
1355 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001356 }
1357 }
1358
1359 if (out_basefmt != NULL) {
1360 new_backing_drv = bdrv_find_format(out_basefmt);
1361 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001362 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001363 ret = -1;
1364 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001365 }
1366 }
1367
1368 /* For safe rebasing we need to compare old and new backing file */
1369 if (unsafe) {
1370 /* Make the compiler happy */
1371 bs_old_backing = NULL;
1372 bs_new_backing = NULL;
1373 } else {
1374 char backing_name[1024];
1375
1376 bs_old_backing = bdrv_new("old_backing");
1377 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001378 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1379 old_backing_drv);
1380 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001381 error_report("Could not open old backing file '%s'", backing_name);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001382 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001383 }
1384
1385 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfcdbae852010-08-17 18:58:55 +02001386 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001387 new_backing_drv);
1388 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001389 error_report("Could not open new backing file '%s'", out_baseimg);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001390 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001391 }
1392 }
1393
1394 /*
1395 * Check each unallocated cluster in the COW file. If it is unallocated,
1396 * accesses go to the backing file. We must therefore compare this cluster
1397 * in the old and new backing file, and if they differ we need to copy it
1398 * from the old backing file into the COW file.
1399 *
1400 * If qemu-img crashes during this step, no harm is done. The content of
1401 * the image is the same as the original one at any time.
1402 */
1403 if (!unsafe) {
1404 uint64_t num_sectors;
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001405 uint64_t old_backing_num_sectors;
1406 uint64_t new_backing_num_sectors;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001407 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02001408 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08001409 uint8_t * buf_old;
1410 uint8_t * buf_new;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001411 float local_progress;
TeLeMand6771bf2010-02-08 16:20:00 +08001412
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001413 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1414 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001415
1416 bdrv_get_geometry(bs, &num_sectors);
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001417 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1418 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001419
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001420 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +02001421 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001422 for (sector = 0; sector < num_sectors; sector += n) {
1423
1424 /* How many sectors can we handle with the next read? */
1425 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1426 n = (IO_BUF_SIZE / 512);
1427 } else {
1428 n = num_sectors - sector;
1429 }
1430
1431 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02001432 ret = bdrv_is_allocated(bs, sector, n, &n);
1433 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001434 continue;
1435 }
1436
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001437 /*
1438 * Read old and new backing file and take into consideration that
1439 * backing files may be smaller than the COW image.
1440 */
1441 if (sector >= old_backing_num_sectors) {
1442 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1443 } else {
1444 if (sector + n > old_backing_num_sectors) {
1445 n = old_backing_num_sectors - sector;
1446 }
1447
1448 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1449 if (ret < 0) {
1450 error_report("error while reading from old backing file");
1451 goto out;
1452 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001453 }
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001454
1455 if (sector >= new_backing_num_sectors) {
1456 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1457 } else {
1458 if (sector + n > new_backing_num_sectors) {
1459 n = new_backing_num_sectors - sector;
1460 }
1461
1462 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1463 if (ret < 0) {
1464 error_report("error while reading from new backing file");
1465 goto out;
1466 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001467 }
1468
1469 /* If they differ, we need to write to the COW file */
1470 uint64_t written = 0;
1471
1472 while (written < n) {
1473 int pnum;
1474
1475 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01001476 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001477 {
1478 ret = bdrv_write(bs, sector + written,
1479 buf_old + written * 512, pnum);
1480 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001481 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001482 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001483 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001484 }
1485 }
1486
1487 written += pnum;
1488 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001489 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001490 }
TeLeMand6771bf2010-02-08 16:20:00 +08001491
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001492 qemu_vfree(buf_old);
1493 qemu_vfree(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001494 }
1495
1496 /*
1497 * Change the backing file. All clusters that are different from the old
1498 * backing file are overwritten in the COW file now, so the visible content
1499 * doesn't change when we switch the backing file.
1500 */
1501 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1502 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001503 error_report("Could not change the backing file to '%s': No "
1504 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001505 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001506 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001507 out_baseimg, strerror(-ret));
1508 }
1509
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001510 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001511 /*
1512 * TODO At this point it is possible to check if any clusters that are
1513 * allocated in the COW file are the same in the backing file. If so, they
1514 * could be dropped from the COW file. Don't do this before switching the
1515 * backing file, in case of a crash this would lead to corruption.
1516 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001517out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001518 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001519 /* Cleanup */
1520 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02001521 if (bs_old_backing != NULL) {
1522 bdrv_delete(bs_old_backing);
1523 }
1524 if (bs_new_backing != NULL) {
1525 bdrv_delete(bs_new_backing);
1526 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001527 }
1528
1529 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001530 if (ret) {
1531 return 1;
1532 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001533 return 0;
1534}
1535
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001536static int img_resize(int argc, char **argv)
1537{
1538 int c, ret, relative;
1539 const char *filename, *fmt, *size;
1540 int64_t n, total_size;
Jes Sorensen2a819982010-12-06 17:08:31 +01001541 BlockDriverState *bs = NULL;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001542 QEMUOptionParameter *param;
1543 QEMUOptionParameter resize_options[] = {
1544 {
1545 .name = BLOCK_OPT_SIZE,
1546 .type = OPT_SIZE,
1547 .help = "Virtual disk size"
1548 },
1549 { NULL }
1550 };
1551
Kevin Wolfe80fec72011-04-29 10:58:12 +02001552 /* Remove size from argv manually so that negative numbers are not treated
1553 * as options by getopt. */
1554 if (argc < 3) {
1555 help();
1556 return 1;
1557 }
1558
1559 size = argv[--argc];
1560
1561 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001562 fmt = NULL;
1563 for(;;) {
1564 c = getopt(argc, argv, "f:h");
1565 if (c == -1) {
1566 break;
1567 }
1568 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001569 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001570 case 'h':
1571 help();
1572 break;
1573 case 'f':
1574 fmt = optarg;
1575 break;
1576 }
1577 }
Kevin Wolfe80fec72011-04-29 10:58:12 +02001578 if (optind >= argc) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001579 help();
1580 }
1581 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001582
1583 /* Choose grow, shrink, or absolute resize mode */
1584 switch (size[0]) {
1585 case '+':
1586 relative = 1;
1587 size++;
1588 break;
1589 case '-':
1590 relative = -1;
1591 size++;
1592 break;
1593 default:
1594 relative = 0;
1595 break;
1596 }
1597
1598 /* Parse size */
1599 param = parse_option_parameters("", resize_options, NULL);
1600 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1601 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01001602 ret = -1;
1603 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001604 }
1605 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1606 free_option_parameters(param);
1607
1608 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001609 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01001610 ret = -1;
1611 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001612 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001613
1614 if (relative) {
1615 total_size = bdrv_getlength(bs) + n * relative;
1616 } else {
1617 total_size = n;
1618 }
1619 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001620 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001621 ret = -1;
1622 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001623 }
1624
1625 ret = bdrv_truncate(bs, total_size);
1626 switch (ret) {
1627 case 0:
1628 printf("Image resized.\n");
1629 break;
1630 case -ENOTSUP:
Kevin Wolf259b2172012-03-06 12:44:45 +01001631 error_report("This image does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001632 break;
1633 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01001634 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001635 break;
1636 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01001637 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001638 break;
1639 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001640out:
Jes Sorensen2a819982010-12-06 17:08:31 +01001641 if (bs) {
1642 bdrv_delete(bs);
1643 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001644 if (ret) {
1645 return 1;
1646 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001647 return 0;
1648}
1649
Anthony Liguoric227f092009-10-01 16:12:16 -05001650static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01001651#define DEF(option, callback, arg_string) \
1652 { option, callback },
1653#include "qemu-img-cmds.h"
1654#undef DEF
1655#undef GEN_DOCS
1656 { NULL, NULL, },
1657};
1658
bellardea2384d2004-08-01 21:59:26 +00001659int main(int argc, char **argv)
1660{
Anthony Liguoric227f092009-10-01 16:12:16 -05001661 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01001662 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00001663
Kevin Wolf53f76e52010-12-16 15:10:32 +01001664 error_set_progname(argv[0]);
1665
bellardea2384d2004-08-01 21:59:26 +00001666 bdrv_init();
1667 if (argc < 2)
1668 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001669 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00001670 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01001671
Zhi Yong Wu67d384e2012-02-19 22:24:35 +08001672 qemu_init_main_loop();
1673
Stuart Brady153859b2009-06-07 00:42:17 +01001674 /* find the command */
1675 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1676 if (!strcmp(cmdname, cmd->name)) {
1677 return cmd->handler(argc, argv);
1678 }
bellardea2384d2004-08-01 21:59:26 +00001679 }
Stuart Brady153859b2009-06-07 00:42:17 +01001680
1681 /* not found */
1682 help();
bellardea2384d2004-08-01 21:59:26 +00001683 return 0;
1684}