blob: 0e48b352969d93b4857b0cd0a35b72c2e3bfe4c3 [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"
Stefan Hajnoczi92196b22011-08-04 12:26:52 +010069 " options are: 'none', 'writeback' (default), 'writethrough', 'directsync'\n"
70 " and 'unsafe'\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
431 bdrv_delete(bs);
Kevin Wolfe076f332010-06-29 11:43:13 +0200432
433 if (ret < 0 || result.check_errors) {
434 printf("\nAn error has occurred during the check: %s\n"
435 "The check is not complete and may have missed error.\n",
436 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900437 return 1;
438 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200439
440 if (result.corruptions) {
441 return 2;
442 } else if (result.leaks) {
443 return 3;
444 } else {
445 return 0;
446 }
aliguori15859692009-04-21 23:11:53 +0000447}
448
bellardea2384d2004-08-01 21:59:26 +0000449static int img_commit(int argc, char **argv)
450{
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400451 int c, ret, flags;
452 const char *filename, *fmt, *cache;
bellardea2384d2004-08-01 21:59:26 +0000453 BlockDriverState *bs;
454
455 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400456 cache = BDRV_DEFAULT_CACHE;
bellardea2384d2004-08-01 21:59:26 +0000457 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400458 c = getopt(argc, argv, "f:ht:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100459 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000460 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100461 }
bellardea2384d2004-08-01 21:59:26 +0000462 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100463 case '?':
bellardea2384d2004-08-01 21:59:26 +0000464 case 'h':
465 help();
466 break;
467 case 'f':
468 fmt = optarg;
469 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400470 case 't':
471 cache = optarg;
472 break;
bellardea2384d2004-08-01 21:59:26 +0000473 }
474 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100475 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +0000476 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100477 }
bellardea2384d2004-08-01 21:59:26 +0000478 filename = argv[optind++];
479
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400480 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100481 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400482 if (ret < 0) {
483 error_report("Invalid cache option: %s", cache);
484 return -1;
485 }
486
487 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900488 if (!bs) {
489 return 1;
490 }
bellardea2384d2004-08-01 21:59:26 +0000491 ret = bdrv_commit(bs);
492 switch(ret) {
493 case 0:
494 printf("Image committed.\n");
495 break;
496 case -ENOENT:
Jes Sorensen15654a62010-12-16 14:31:53 +0100497 error_report("No disk inserted");
bellardea2384d2004-08-01 21:59:26 +0000498 break;
499 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +0100500 error_report("Image is read-only");
bellardea2384d2004-08-01 21:59:26 +0000501 break;
502 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +0100503 error_report("Image is already committed");
bellardea2384d2004-08-01 21:59:26 +0000504 break;
505 default:
Jes Sorensen15654a62010-12-16 14:31:53 +0100506 error_report("Error while committing image");
bellardea2384d2004-08-01 21:59:26 +0000507 break;
508 }
509
510 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900511 if (ret) {
512 return 1;
513 }
bellardea2384d2004-08-01 21:59:26 +0000514 return 0;
515}
516
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400517/*
thsf58c7b32008-06-05 21:53:49 +0000518 * Returns true iff the first sector pointed to by 'buf' contains at least
519 * a non-NUL byte.
520 *
521 * 'pnum' is set to the number of sectors (including and immediately following
522 * the first one) that are known to be in the same allocated/unallocated state.
523 */
bellardea2384d2004-08-01 21:59:26 +0000524static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
525{
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000526 bool is_zero;
527 int i;
bellardea2384d2004-08-01 21:59:26 +0000528
529 if (n <= 0) {
530 *pnum = 0;
531 return 0;
532 }
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000533 is_zero = buffer_is_zero(buf, 512);
bellardea2384d2004-08-01 21:59:26 +0000534 for(i = 1; i < n; i++) {
535 buf += 512;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000536 if (is_zero != buffer_is_zero(buf, 512)) {
bellardea2384d2004-08-01 21:59:26 +0000537 break;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000538 }
bellardea2384d2004-08-01 21:59:26 +0000539 }
540 *pnum = i;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000541 return !is_zero;
bellardea2384d2004-08-01 21:59:26 +0000542}
543
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100544/*
Kevin Wolfa22f1232011-08-26 15:27:13 +0200545 * Like is_allocated_sectors, but if the buffer starts with a used sector,
546 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
547 * breaking up write requests for only small sparse areas.
548 */
549static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
550 int min)
551{
552 int ret;
553 int num_checked, num_used;
554
555 if (n < min) {
556 min = n;
557 }
558
559 ret = is_allocated_sectors(buf, n, pnum);
560 if (!ret) {
561 return ret;
562 }
563
564 num_used = *pnum;
565 buf += BDRV_SECTOR_SIZE * *pnum;
566 n -= *pnum;
567 num_checked = num_used;
568
569 while (n > 0) {
570 ret = is_allocated_sectors(buf, n, pnum);
571
572 buf += BDRV_SECTOR_SIZE * *pnum;
573 n -= *pnum;
574 num_checked += *pnum;
575 if (ret) {
576 num_used = num_checked;
577 } else if (*pnum >= min) {
578 break;
579 }
580 }
581
582 *pnum = num_used;
583 return 1;
584}
585
586/*
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100587 * Compares two buffers sector by sector. Returns 0 if the first sector of both
588 * buffers matches, non-zero otherwise.
589 *
590 * pnum is set to the number of sectors (including and immediately following
591 * the first one) that are known to have the same comparison result
592 */
593static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
594 int *pnum)
595{
596 int res, i;
597
598 if (n <= 0) {
599 *pnum = 0;
600 return 0;
601 }
602
603 res = !!memcmp(buf1, buf2, 512);
604 for(i = 1; i < n; i++) {
605 buf1 += 512;
606 buf2 += 512;
607
608 if (!!memcmp(buf1, buf2, 512) != res) {
609 break;
610 }
611 }
612
613 *pnum = i;
614 return res;
615}
616
Kevin Wolf80ee15a2009-09-15 12:30:43 +0200617#define IO_BUF_SIZE (2 * 1024 * 1024)
bellardea2384d2004-08-01 21:59:26 +0000618
619static int img_convert(int argc, char **argv)
620{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100621 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400622 int progress = 0, flags;
623 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900624 BlockDriver *drv, *proto_drv;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900625 BlockDriverState **bs = NULL, *out_bs = NULL;
ths96b8f132007-12-17 01:35:20 +0000626 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
627 uint64_t bs_sectors;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900628 uint8_t * buf = NULL;
bellardea2384d2004-08-01 21:59:26 +0000629 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +0000630 BlockDriverInfo bdi;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900631 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfa18953f2010-10-14 15:46:04 +0200632 QEMUOptionParameter *out_baseimg_param;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200633 char *options = NULL;
edison51ef6722010-09-21 19:58:41 -0700634 const char *snapshot_name = NULL;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200635 float local_progress;
Kevin Wolfa22f1232011-08-26 15:27:13 +0200636 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
bellardea2384d2004-08-01 21:59:26 +0000637
638 fmt = NULL;
639 out_fmt = "raw";
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400640 cache = "unsafe";
thsf58c7b32008-06-05 21:53:49 +0000641 out_baseimg = NULL;
Jes Sorenseneec77d92010-12-07 17:44:34 +0100642 compress = 0;
bellardea2384d2004-08-01 21:59:26 +0000643 for(;;) {
Kevin Wolfa22f1232011-08-26 15:27:13 +0200644 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100645 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000646 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100647 }
bellardea2384d2004-08-01 21:59:26 +0000648 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100649 case '?':
bellardea2384d2004-08-01 21:59:26 +0000650 case 'h':
651 help();
652 break;
653 case 'f':
654 fmt = optarg;
655 break;
656 case 'O':
657 out_fmt = optarg;
658 break;
thsf58c7b32008-06-05 21:53:49 +0000659 case 'B':
660 out_baseimg = optarg;
661 break;
bellardea2384d2004-08-01 21:59:26 +0000662 case 'c':
Jes Sorenseneec77d92010-12-07 17:44:34 +0100663 compress = 1;
bellardea2384d2004-08-01 21:59:26 +0000664 break;
665 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200666 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100667 "encryption\' instead!");
668 return 1;
thsec36ba12007-09-16 21:59:02 +0000669 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200670 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100671 "compat6\' instead!");
672 return 1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200673 case 'o':
674 options = optarg;
675 break;
edison51ef6722010-09-21 19:58:41 -0700676 case 's':
677 snapshot_name = optarg;
678 break;
Kevin Wolfa22f1232011-08-26 15:27:13 +0200679 case 'S':
680 {
681 int64_t sval;
Markus Armbrustere36b3692011-11-22 09:46:05 +0100682 char *end;
683 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
684 if (sval < 0 || *end) {
Kevin Wolfa22f1232011-08-26 15:27:13 +0200685 error_report("Invalid minimum zero buffer size for sparse output specified");
686 return 1;
687 }
688
689 min_sparse = sval / BDRV_SECTOR_SIZE;
690 break;
691 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200692 case 'p':
693 progress = 1;
694 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400695 case 't':
696 cache = optarg;
697 break;
bellardea2384d2004-08-01 21:59:26 +0000698 }
699 }
ths3b46e622007-09-17 08:09:54 +0000700
balrog926c2d22007-10-31 01:11:44 +0000701 bs_n = argc - optind - 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100702 if (bs_n < 1) {
703 help();
704 }
balrog926c2d22007-10-31 01:11:44 +0000705
706 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +0000707
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100708 if (options && !strcmp(options, "?")) {
709 ret = print_block_option_help(out_filename, out_fmt);
710 goto out;
711 }
712
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900713 if (bs_n > 1 && out_baseimg) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100714 error_report("-B makes no sense when concatenating multiple input "
715 "images");
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100716 ret = -1;
717 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900718 }
balrog926c2d22007-10-31 01:11:44 +0000719
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200720 qemu_progress_init(progress, 2.0);
721 qemu_progress_print(0, 100);
722
Anthony Liguori7267c092011-08-20 22:09:37 -0500723 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
balrog926c2d22007-10-31 01:11:44 +0000724
725 total_sectors = 0;
726 for (bs_i = 0; bs_i < bs_n; bs_i++) {
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100727 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900728 if (!bs[bs_i]) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100729 error_report("Could not open '%s'", argv[optind + bs_i]);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900730 ret = -1;
731 goto out;
732 }
balrog926c2d22007-10-31 01:11:44 +0000733 bdrv_get_geometry(bs[bs_i], &bs_sectors);
734 total_sectors += bs_sectors;
735 }
bellardea2384d2004-08-01 21:59:26 +0000736
edison51ef6722010-09-21 19:58:41 -0700737 if (snapshot_name != NULL) {
738 if (bs_n > 1) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200739 error_report("No support for concatenating multiple snapshot");
edison51ef6722010-09-21 19:58:41 -0700740 ret = -1;
741 goto out;
742 }
743 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200744 error_report("Failed to load snapshot");
edison51ef6722010-09-21 19:58:41 -0700745 ret = -1;
746 goto out;
747 }
748 }
749
Kevin Wolfefa84d42009-05-18 16:42:12 +0200750 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000751 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900752 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100753 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900754 ret = -1;
755 goto out;
756 }
balrog926c2d22007-10-31 01:11:44 +0000757
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900758 proto_drv = bdrv_find_protocol(out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900759 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100760 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900761 ret = -1;
762 goto out;
763 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900764
765 create_options = append_option_parameters(create_options,
766 drv->create_options);
767 create_options = append_option_parameters(create_options,
768 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200769
Kevin Wolfefa84d42009-05-18 16:42:12 +0200770 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900771 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200772 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100773 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900774 ret = -1;
775 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200776 }
777 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900778 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200779 }
780
781 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +0100782 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900783 if (ret < 0) {
784 goto out;
785 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200786
Kevin Wolfa18953f2010-10-14 15:46:04 +0200787 /* Get backing file name if -o backing_file was used */
788 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
789 if (out_baseimg_param) {
790 out_baseimg = out_baseimg_param->value.s;
791 }
792
Kevin Wolfefa84d42009-05-18 16:42:12 +0200793 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +0100794 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +0200795 QEMUOptionParameter *encryption =
796 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
Kevin Wolf41521fa2011-10-18 16:19:42 +0200797 QEMUOptionParameter *preallocation =
798 get_option_parameter(param, BLOCK_OPT_PREALLOC);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200799
800 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100801 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900802 ret = -1;
803 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200804 }
805
806 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100807 error_report("Compression and encryption not supported at "
808 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900809 ret = -1;
810 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200811 }
Kevin Wolf41521fa2011-10-18 16:19:42 +0200812
813 if (preallocation && preallocation->value.s
814 && strcmp(preallocation->value.s, "off"))
815 {
816 error_report("Compression and preallocation not supported at "
817 "the same time");
818 ret = -1;
819 goto out;
820 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200821 }
822
823 /* Create the new image */
824 ret = bdrv_create(drv, out_filename, param);
bellardea2384d2004-08-01 21:59:26 +0000825 if (ret < 0) {
826 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100827 error_report("Formatting not supported for file format '%s'",
828 out_fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000829 } else if (ret == -EFBIG) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100830 error_report("The image size is too large for file format '%s'",
831 out_fmt);
bellardea2384d2004-08-01 21:59:26 +0000832 } else {
Jes Sorensen15654a62010-12-16 14:31:53 +0100833 error_report("%s: error while converting %s: %s",
834 out_filename, out_fmt, strerror(-ret));
bellardea2384d2004-08-01 21:59:26 +0000835 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900836 goto out;
bellardea2384d2004-08-01 21:59:26 +0000837 }
ths3b46e622007-09-17 08:09:54 +0000838
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400839 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100840 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400841 if (ret < 0) {
842 error_report("Invalid cache option: %s", cache);
843 return -1;
844 }
845
846 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900847 if (!out_bs) {
848 ret = -1;
849 goto out;
850 }
bellardea2384d2004-08-01 21:59:26 +0000851
balrog926c2d22007-10-31 01:11:44 +0000852 bs_i = 0;
853 bs_offset = 0;
854 bdrv_get_geometry(bs[0], &bs_sectors);
Kevin Wolfbb1c0592011-08-08 14:09:12 +0200855 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +0000856
Jes Sorenseneec77d92010-12-07 17:44:34 +0100857 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900858 ret = bdrv_get_info(out_bs, &bdi);
859 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100860 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900861 goto out;
862 }
bellardfaea38e2006-08-05 21:31:00 +0000863 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900864 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100865 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900866 ret = -1;
867 goto out;
868 }
bellardea2384d2004-08-01 21:59:26 +0000869 cluster_sectors = cluster_size >> 9;
870 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200871
872 nb_sectors = total_sectors;
873 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200874 (nb_sectors / MIN(nb_sectors, cluster_sectors));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200875
bellardea2384d2004-08-01 21:59:26 +0000876 for(;;) {
balrog926c2d22007-10-31 01:11:44 +0000877 int64_t bs_num;
878 int remainder;
879 uint8_t *buf2;
880
bellardea2384d2004-08-01 21:59:26 +0000881 nb_sectors = total_sectors - sector_num;
882 if (nb_sectors <= 0)
883 break;
884 if (nb_sectors >= cluster_sectors)
885 n = cluster_sectors;
886 else
887 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000888
889 bs_num = sector_num - bs_offset;
890 assert (bs_num >= 0);
891 remainder = n;
892 buf2 = buf;
893 while (remainder > 0) {
894 int nlow;
895 while (bs_num == bs_sectors) {
896 bs_i++;
897 assert (bs_i < bs_n);
898 bs_offset += bs_sectors;
899 bdrv_get_geometry(bs[bs_i], &bs_sectors);
900 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +0000901 /* printf("changing part: sector_num=%" PRId64 ", "
902 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
903 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +0000904 }
905 assert (bs_num < bs_sectors);
906
907 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
908
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900909 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
910 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +0100911 error_report("error while reading sector %" PRId64 ": %s",
912 bs_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900913 goto out;
914 }
balrog926c2d22007-10-31 01:11:44 +0000915
916 buf2 += nlow * 512;
917 bs_num += nlow;
918
919 remainder -= nlow;
920 }
921 assert (remainder == 0);
922
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100923 if (n < cluster_sectors) {
bellardea2384d2004-08-01 21:59:26 +0000924 memset(buf + n * 512, 0, cluster_size - n * 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100925 }
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000926 if (!buffer_is_zero(buf, cluster_size)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900927 ret = bdrv_write_compressed(out_bs, sector_num, buf,
928 cluster_sectors);
929 if (ret != 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +0100930 error_report("error while compressing sector %" PRId64
931 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900932 goto out;
933 }
bellardea2384d2004-08-01 21:59:26 +0000934 }
935 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200936 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +0000937 }
bellardfaea38e2006-08-05 21:31:00 +0000938 /* signal EOF to align */
939 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +0000940 } else {
Kevin Wolff2feebb2010-04-14 17:30:35 +0200941 int has_zero_init = bdrv_has_zero_init(out_bs);
942
thsf58c7b32008-06-05 21:53:49 +0000943 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200944 nb_sectors = total_sectors - sector_num;
945 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200946 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200947
bellardea2384d2004-08-01 21:59:26 +0000948 for(;;) {
949 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100950 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +0000951 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100952 }
953 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +0000954 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100955 } else {
bellardea2384d2004-08-01 21:59:26 +0000956 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100957 }
balrog926c2d22007-10-31 01:11:44 +0000958
959 while (sector_num - bs_offset >= bs_sectors) {
960 bs_i ++;
961 assert (bs_i < bs_n);
962 bs_offset += bs_sectors;
963 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +0000964 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
965 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +0000966 sector_num, bs_i, bs_offset, bs_sectors); */
967 }
968
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100969 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +0000970 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100971 }
balrog926c2d22007-10-31 01:11:44 +0000972
Kevin Wolff2feebb2010-04-14 17:30:35 +0200973 if (has_zero_init) {
Akkarit Sangpetchd0320442009-07-17 10:02:15 +0200974 /* If the output image is being created as a copy on write image,
975 assume that sectors which are unallocated in the input image
976 are present in both the output's and input's base images (no
977 need to copy them). */
978 if (out_baseimg) {
979 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
980 n, &n1)) {
981 sector_num += n1;
982 continue;
983 }
984 /* The next 'n1' sectors are allocated in the input image. Copy
985 only those as they may be followed by unallocated sectors. */
986 n = n1;
aliguori93c65b42009-04-05 17:40:43 +0000987 }
aliguori93c65b42009-04-05 17:40:43 +0000988 } else {
989 n1 = n;
thsf58c7b32008-06-05 21:53:49 +0000990 }
991
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900992 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
993 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +0100994 error_report("error while reading sector %" PRId64 ": %s",
995 sector_num - bs_offset, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900996 goto out;
997 }
bellardea2384d2004-08-01 21:59:26 +0000998 /* NOTE: at the same time we convert, we do not write zero
999 sectors to have a chance to compress the image. Ideally, we
1000 should add a specific call to have the info to go faster */
1001 buf1 = buf;
1002 while (n > 0) {
thsf58c7b32008-06-05 21:53:49 +00001003 /* If the output image is being created as a copy on write image,
1004 copy all sectors even the ones containing only NUL bytes,
aliguori93c65b42009-04-05 17:40:43 +00001005 because they may differ from the sectors in the base image.
1006
1007 If the output is to a host device, we also write out
1008 sectors that are entirely 0, since whatever data was
1009 already there is garbage, not 0s. */
Kevin Wolff2feebb2010-04-14 17:30:35 +02001010 if (!has_zero_init || out_baseimg ||
Kevin Wolfa22f1232011-08-26 15:27:13 +02001011 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001012 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1013 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001014 error_report("error while writing sector %" PRId64
1015 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001016 goto out;
1017 }
bellardea2384d2004-08-01 21:59:26 +00001018 }
1019 sector_num += n1;
1020 n -= n1;
1021 buf1 += n1 * 512;
1022 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001023 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001024 }
1025 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001026out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001027 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001028 free_option_parameters(create_options);
1029 free_option_parameters(param);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001030 qemu_vfree(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001031 if (out_bs) {
1032 bdrv_delete(out_bs);
1033 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001034 if (bs) {
1035 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1036 if (bs[bs_i]) {
1037 bdrv_delete(bs[bs_i]);
1038 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001039 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001040 g_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001041 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001042 if (ret) {
1043 return 1;
1044 }
bellardea2384d2004-08-01 21:59:26 +00001045 return 0;
1046}
1047
bellard57d1a2b2004-08-03 21:15:11 +00001048
bellardfaea38e2006-08-05 21:31:00 +00001049static void dump_snapshots(BlockDriverState *bs)
1050{
1051 QEMUSnapshotInfo *sn_tab, *sn;
1052 int nb_sns, i;
1053 char buf[256];
1054
1055 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1056 if (nb_sns <= 0)
1057 return;
1058 printf("Snapshot list:\n");
1059 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1060 for(i = 0; i < nb_sns; i++) {
1061 sn = &sn_tab[i];
1062 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1063 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001064 g_free(sn_tab);
bellardfaea38e2006-08-05 21:31:00 +00001065}
1066
bellardea2384d2004-08-01 21:59:26 +00001067static int img_info(int argc, char **argv)
1068{
1069 int c;
1070 const char *filename, *fmt;
bellardea2384d2004-08-01 21:59:26 +00001071 BlockDriverState *bs;
1072 char fmt_name[128], size_buf[128], dsize_buf[128];
ths96b8f132007-12-17 01:35:20 +00001073 uint64_t total_sectors;
1074 int64_t allocated_size;
bellard93b6b2a2006-08-01 15:51:11 +00001075 char backing_filename[1024];
1076 char backing_filename2[1024];
bellardfaea38e2006-08-05 21:31:00 +00001077 BlockDriverInfo bdi;
bellardea2384d2004-08-01 21:59:26 +00001078
1079 fmt = NULL;
1080 for(;;) {
1081 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001082 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001083 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001084 }
bellardea2384d2004-08-01 21:59:26 +00001085 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001086 case '?':
bellardea2384d2004-08-01 21:59:26 +00001087 case 'h':
1088 help();
1089 break;
1090 case 'f':
1091 fmt = optarg;
1092 break;
1093 }
1094 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001095 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +00001096 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001097 }
bellardea2384d2004-08-01 21:59:26 +00001098 filename = argv[optind++];
1099
Stefan Hajnocziadfe0782010-04-13 10:29:35 +01001100 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001101 if (!bs) {
1102 return 1;
1103 }
bellardea2384d2004-08-01 21:59:26 +00001104 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1105 bdrv_get_geometry(bs, &total_sectors);
1106 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
Fam Zheng4a1d5e12011-07-12 19:56:39 +08001107 allocated_size = bdrv_get_allocated_file_size(bs);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001108 if (allocated_size < 0) {
blueswir1a10ea302008-08-24 10:30:33 +00001109 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001110 } else {
ths5fafdf22007-09-16 21:08:06 +00001111 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
bellardde167e42005-04-28 21:15:08 +00001112 allocated_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001113 }
bellardea2384d2004-08-01 21:59:26 +00001114 printf("image: %s\n"
1115 "file format: %s\n"
bellardec3757d2006-06-14 15:50:07 +00001116 "virtual size: %s (%" PRId64 " bytes)\n"
bellardea2384d2004-08-01 21:59:26 +00001117 "disk size: %s\n",
ths5fafdf22007-09-16 21:08:06 +00001118 filename, fmt_name, size_buf,
bellardec3757d2006-06-14 15:50:07 +00001119 (total_sectors * 512),
bellardea2384d2004-08-01 21:59:26 +00001120 dsize_buf);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001121 if (bdrv_is_encrypted(bs)) {
bellardea2384d2004-08-01 21:59:26 +00001122 printf("encrypted: yes\n");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001123 }
bellardfaea38e2006-08-05 21:31:00 +00001124 if (bdrv_get_info(bs, &bdi) >= 0) {
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001125 if (bdi.cluster_size != 0) {
bellardfaea38e2006-08-05 21:31:00 +00001126 printf("cluster_size: %d\n", bdi.cluster_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001127 }
bellardfaea38e2006-08-05 21:31:00 +00001128 }
bellard93b6b2a2006-08-01 15:51:11 +00001129 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
bellardfaea38e2006-08-05 21:31:00 +00001130 if (backing_filename[0] != '\0') {
bellard93b6b2a2006-08-01 15:51:11 +00001131 path_combine(backing_filename2, sizeof(backing_filename2),
1132 filename, backing_filename);
ths5fafdf22007-09-16 21:08:06 +00001133 printf("backing file: %s (actual path: %s)\n",
bellard93b6b2a2006-08-01 15:51:11 +00001134 backing_filename,
1135 backing_filename2);
bellardfaea38e2006-08-05 21:31:00 +00001136 }
1137 dump_snapshots(bs);
bellardea2384d2004-08-01 21:59:26 +00001138 bdrv_delete(bs);
1139 return 0;
1140}
1141
aliguorif7b4a942009-01-07 17:40:15 +00001142#define SNAPSHOT_LIST 1
1143#define SNAPSHOT_CREATE 2
1144#define SNAPSHOT_APPLY 3
1145#define SNAPSHOT_DELETE 4
1146
Stuart Brady153859b2009-06-07 00:42:17 +01001147static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00001148{
1149 BlockDriverState *bs;
1150 QEMUSnapshotInfo sn;
1151 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001152 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00001153 int action = 0;
1154 qemu_timeval tv;
1155
Kevin Wolf710da702011-01-10 12:33:02 +01001156 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00001157 /* Parse commandline parameters */
1158 for(;;) {
1159 c = getopt(argc, argv, "la:c:d:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001160 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00001161 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001162 }
aliguorif7b4a942009-01-07 17:40:15 +00001163 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001164 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00001165 case 'h':
1166 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001167 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001168 case 'l':
1169 if (action) {
1170 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001171 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001172 }
1173 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02001174 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00001175 break;
1176 case 'a':
1177 if (action) {
1178 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001179 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001180 }
1181 action = SNAPSHOT_APPLY;
1182 snapshot_name = optarg;
1183 break;
1184 case 'c':
1185 if (action) {
1186 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001187 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001188 }
1189 action = SNAPSHOT_CREATE;
1190 snapshot_name = optarg;
1191 break;
1192 case 'd':
1193 if (action) {
1194 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001195 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001196 }
1197 action = SNAPSHOT_DELETE;
1198 snapshot_name = optarg;
1199 break;
1200 }
1201 }
1202
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001203 if (optind >= argc) {
aliguorif7b4a942009-01-07 17:40:15 +00001204 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001205 }
aliguorif7b4a942009-01-07 17:40:15 +00001206 filename = argv[optind++];
1207
1208 /* Open the image */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001209 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001210 if (!bs) {
1211 return 1;
1212 }
aliguorif7b4a942009-01-07 17:40:15 +00001213
1214 /* Perform the requested action */
1215 switch(action) {
1216 case SNAPSHOT_LIST:
1217 dump_snapshots(bs);
1218 break;
1219
1220 case SNAPSHOT_CREATE:
1221 memset(&sn, 0, sizeof(sn));
1222 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1223
1224 qemu_gettimeofday(&tv);
1225 sn.date_sec = tv.tv_sec;
1226 sn.date_nsec = tv.tv_usec * 1000;
1227
1228 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001229 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001230 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001231 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001232 }
aliguorif7b4a942009-01-07 17:40:15 +00001233 break;
1234
1235 case SNAPSHOT_APPLY:
1236 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001237 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001238 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001239 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001240 }
aliguorif7b4a942009-01-07 17:40:15 +00001241 break;
1242
1243 case SNAPSHOT_DELETE:
1244 ret = bdrv_snapshot_delete(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001245 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001246 error_report("Could not delete snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001247 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001248 }
aliguorif7b4a942009-01-07 17:40:15 +00001249 break;
1250 }
1251
1252 /* Cleanup */
1253 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001254 if (ret) {
1255 return 1;
1256 }
Stuart Brady153859b2009-06-07 00:42:17 +01001257 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001258}
1259
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001260static int img_rebase(int argc, char **argv)
1261{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001262 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001263 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001264 char *filename;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001265 const char *fmt, *cache, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001266 int c, flags, ret;
1267 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001268 int progress = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001269
1270 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001271 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001272 cache = BDRV_DEFAULT_CACHE;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001273 out_baseimg = NULL;
1274 out_basefmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001275 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001276 c = getopt(argc, argv, "uhf:F:b:pt:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001277 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001278 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001279 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001280 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001281 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001282 case 'h':
1283 help();
1284 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001285 case 'f':
1286 fmt = optarg;
1287 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001288 case 'F':
1289 out_basefmt = optarg;
1290 break;
1291 case 'b':
1292 out_baseimg = optarg;
1293 break;
1294 case 'u':
1295 unsafe = 1;
1296 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001297 case 'p':
1298 progress = 1;
1299 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001300 case 't':
1301 cache = optarg;
1302 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001303 }
1304 }
1305
Anthony Liguori9a9d9db2011-04-13 15:51:47 +01001306 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001307 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001308 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001309 filename = argv[optind++];
1310
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001311 qemu_progress_init(progress, 2.0);
1312 qemu_progress_print(0, 100);
1313
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001314 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01001315 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001316 if (ret < 0) {
1317 error_report("Invalid cache option: %s", cache);
1318 return -1;
1319 }
1320
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001321 /*
1322 * Open the images.
1323 *
1324 * Ignore the old backing file for unsafe rebase in case we want to correct
1325 * the reference to a renamed or moved backing file.
1326 */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001327 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001328 if (!bs) {
1329 return 1;
1330 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001331
1332 /* Find the right drivers for the backing files */
1333 old_backing_drv = NULL;
1334 new_backing_drv = NULL;
1335
1336 if (!unsafe && bs->backing_format[0] != '\0') {
1337 old_backing_drv = bdrv_find_format(bs->backing_format);
1338 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001339 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001340 ret = -1;
1341 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001342 }
1343 }
1344
1345 if (out_basefmt != NULL) {
1346 new_backing_drv = bdrv_find_format(out_basefmt);
1347 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001348 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001349 ret = -1;
1350 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001351 }
1352 }
1353
1354 /* For safe rebasing we need to compare old and new backing file */
1355 if (unsafe) {
1356 /* Make the compiler happy */
1357 bs_old_backing = NULL;
1358 bs_new_backing = NULL;
1359 } else {
1360 char backing_name[1024];
1361
1362 bs_old_backing = bdrv_new("old_backing");
1363 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001364 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1365 old_backing_drv);
1366 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001367 error_report("Could not open old backing file '%s'", backing_name);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001368 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001369 }
1370
1371 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfcdbae852010-08-17 18:58:55 +02001372 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001373 new_backing_drv);
1374 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001375 error_report("Could not open new backing file '%s'", out_baseimg);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001376 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001377 }
1378 }
1379
1380 /*
1381 * Check each unallocated cluster in the COW file. If it is unallocated,
1382 * accesses go to the backing file. We must therefore compare this cluster
1383 * in the old and new backing file, and if they differ we need to copy it
1384 * from the old backing file into the COW file.
1385 *
1386 * If qemu-img crashes during this step, no harm is done. The content of
1387 * the image is the same as the original one at any time.
1388 */
1389 if (!unsafe) {
1390 uint64_t num_sectors;
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001391 uint64_t old_backing_num_sectors;
1392 uint64_t new_backing_num_sectors;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001393 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02001394 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08001395 uint8_t * buf_old;
1396 uint8_t * buf_new;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001397 float local_progress;
TeLeMand6771bf2010-02-08 16:20:00 +08001398
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001399 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1400 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001401
1402 bdrv_get_geometry(bs, &num_sectors);
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001403 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1404 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001405
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001406 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +02001407 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001408 for (sector = 0; sector < num_sectors; sector += n) {
1409
1410 /* How many sectors can we handle with the next read? */
1411 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1412 n = (IO_BUF_SIZE / 512);
1413 } else {
1414 n = num_sectors - sector;
1415 }
1416
1417 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02001418 ret = bdrv_is_allocated(bs, sector, n, &n);
1419 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001420 continue;
1421 }
1422
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001423 /*
1424 * Read old and new backing file and take into consideration that
1425 * backing files may be smaller than the COW image.
1426 */
1427 if (sector >= old_backing_num_sectors) {
1428 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1429 } else {
1430 if (sector + n > old_backing_num_sectors) {
1431 n = old_backing_num_sectors - sector;
1432 }
1433
1434 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1435 if (ret < 0) {
1436 error_report("error while reading from old backing file");
1437 goto out;
1438 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001439 }
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01001440
1441 if (sector >= new_backing_num_sectors) {
1442 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1443 } else {
1444 if (sector + n > new_backing_num_sectors) {
1445 n = new_backing_num_sectors - sector;
1446 }
1447
1448 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1449 if (ret < 0) {
1450 error_report("error while reading from new backing file");
1451 goto out;
1452 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001453 }
1454
1455 /* If they differ, we need to write to the COW file */
1456 uint64_t written = 0;
1457
1458 while (written < n) {
1459 int pnum;
1460
1461 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01001462 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001463 {
1464 ret = bdrv_write(bs, sector + written,
1465 buf_old + written * 512, pnum);
1466 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001467 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001468 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001469 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001470 }
1471 }
1472
1473 written += pnum;
1474 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001475 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001476 }
TeLeMand6771bf2010-02-08 16:20:00 +08001477
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001478 qemu_vfree(buf_old);
1479 qemu_vfree(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001480 }
1481
1482 /*
1483 * Change the backing file. All clusters that are different from the old
1484 * backing file are overwritten in the COW file now, so the visible content
1485 * doesn't change when we switch the backing file.
1486 */
1487 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1488 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001489 error_report("Could not change the backing file to '%s': No "
1490 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001491 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001492 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001493 out_baseimg, strerror(-ret));
1494 }
1495
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001496 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001497 /*
1498 * TODO At this point it is possible to check if any clusters that are
1499 * allocated in the COW file are the same in the backing file. If so, they
1500 * could be dropped from the COW file. Don't do this before switching the
1501 * backing file, in case of a crash this would lead to corruption.
1502 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001503out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001504 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001505 /* Cleanup */
1506 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02001507 if (bs_old_backing != NULL) {
1508 bdrv_delete(bs_old_backing);
1509 }
1510 if (bs_new_backing != NULL) {
1511 bdrv_delete(bs_new_backing);
1512 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001513 }
1514
1515 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001516 if (ret) {
1517 return 1;
1518 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001519 return 0;
1520}
1521
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001522static int img_resize(int argc, char **argv)
1523{
1524 int c, ret, relative;
1525 const char *filename, *fmt, *size;
1526 int64_t n, total_size;
Jes Sorensen2a819982010-12-06 17:08:31 +01001527 BlockDriverState *bs = NULL;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001528 QEMUOptionParameter *param;
1529 QEMUOptionParameter resize_options[] = {
1530 {
1531 .name = BLOCK_OPT_SIZE,
1532 .type = OPT_SIZE,
1533 .help = "Virtual disk size"
1534 },
1535 { NULL }
1536 };
1537
Kevin Wolfe80fec72011-04-29 10:58:12 +02001538 /* Remove size from argv manually so that negative numbers are not treated
1539 * as options by getopt. */
1540 if (argc < 3) {
1541 help();
1542 return 1;
1543 }
1544
1545 size = argv[--argc];
1546
1547 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001548 fmt = NULL;
1549 for(;;) {
1550 c = getopt(argc, argv, "f:h");
1551 if (c == -1) {
1552 break;
1553 }
1554 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001555 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001556 case 'h':
1557 help();
1558 break;
1559 case 'f':
1560 fmt = optarg;
1561 break;
1562 }
1563 }
Kevin Wolfe80fec72011-04-29 10:58:12 +02001564 if (optind >= argc) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001565 help();
1566 }
1567 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001568
1569 /* Choose grow, shrink, or absolute resize mode */
1570 switch (size[0]) {
1571 case '+':
1572 relative = 1;
1573 size++;
1574 break;
1575 case '-':
1576 relative = -1;
1577 size++;
1578 break;
1579 default:
1580 relative = 0;
1581 break;
1582 }
1583
1584 /* Parse size */
1585 param = parse_option_parameters("", resize_options, NULL);
1586 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1587 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01001588 ret = -1;
1589 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001590 }
1591 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1592 free_option_parameters(param);
1593
1594 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001595 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01001596 ret = -1;
1597 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001598 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001599
1600 if (relative) {
1601 total_size = bdrv_getlength(bs) + n * relative;
1602 } else {
1603 total_size = n;
1604 }
1605 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001606 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001607 ret = -1;
1608 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001609 }
1610
1611 ret = bdrv_truncate(bs, total_size);
1612 switch (ret) {
1613 case 0:
1614 printf("Image resized.\n");
1615 break;
1616 case -ENOTSUP:
Kevin Wolf259b2172012-03-06 12:44:45 +01001617 error_report("This image does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001618 break;
1619 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01001620 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001621 break;
1622 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01001623 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001624 break;
1625 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001626out:
Jes Sorensen2a819982010-12-06 17:08:31 +01001627 if (bs) {
1628 bdrv_delete(bs);
1629 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001630 if (ret) {
1631 return 1;
1632 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001633 return 0;
1634}
1635
Anthony Liguoric227f092009-10-01 16:12:16 -05001636static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01001637#define DEF(option, callback, arg_string) \
1638 { option, callback },
1639#include "qemu-img-cmds.h"
1640#undef DEF
1641#undef GEN_DOCS
1642 { NULL, NULL, },
1643};
1644
bellardea2384d2004-08-01 21:59:26 +00001645int main(int argc, char **argv)
1646{
Anthony Liguoric227f092009-10-01 16:12:16 -05001647 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01001648 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00001649
Kevin Wolf53f76e52010-12-16 15:10:32 +01001650 error_set_progname(argv[0]);
1651
bellardea2384d2004-08-01 21:59:26 +00001652 bdrv_init();
1653 if (argc < 2)
1654 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001655 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00001656 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01001657
Zhi Yong Wu67d384e2012-02-19 22:24:35 +08001658 qemu_init_main_loop();
1659
Stuart Brady153859b2009-06-07 00:42:17 +01001660 /* find the command */
1661 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1662 if (!strcmp(cmdname, cmd->name)) {
1663 return cmd->handler(argc, argv);
1664 }
bellardea2384d2004-08-01 21:59:26 +00001665 }
Stuart Brady153859b2009-06-07 00:42:17 +01001666
1667 /* not found */
1668 help();
bellardea2384d2004-08-01 21:59:26 +00001669 return 0;
1670}