]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
qemu-io: Remove unused args_command
[qemu.git] / qemu-img.c
CommitLineData
ea2384d3 1/*
fb43f4dd 2 * QEMU disk image utility
5fafdf24 3 *
68d0f70e 4 * Copyright (c) 2003-2008 Fabrice Bellard
5fafdf24 5 *
ea2384d3
FB
6 * 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 */
c054b3fd
BC
24#include "qapi-visit.h"
25#include "qapi/qmp-output-visitor.h"
7b1b5d19 26#include "qapi/qmp/qjson.h"
faf07963 27#include "qemu-common.h"
1de7afc9
PB
28#include "qemu/option.h"
29#include "qemu/error-report.h"
30#include "qemu/osdep.h"
9c17d615 31#include "sysemu/sysemu.h"
737e150e 32#include "block/block_int.h"
f364ec65 33#include "block/qapi.h"
c054b3fd 34#include <getopt.h>
9230eaf6 35#include <stdio.h>
f382d43a 36#include <stdarg.h>
ea2384d3 37
e8445331
FB
38#ifdef _WIN32
39#include <windows.h>
40#endif
41
c227f099 42typedef struct img_cmd_t {
153859be
SB
43 const char *name;
44 int (*handler)(int argc, char **argv);
c227f099 45} img_cmd_t;
153859be 46
8599ea4c
FS
47enum {
48 OPTION_OUTPUT = 256,
49 OPTION_BACKING_CHAIN = 257,
50};
51
52typedef enum OutputFormat {
53 OFORMAT_JSON,
54 OFORMAT_HUMAN,
55} OutputFormat;
56
137519ce 57/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
adfe078e 58#define BDRV_O_FLAGS BDRV_O_CACHE_WB
661a0f71 59#define BDRV_DEFAULT_CACHE "writeback"
137519ce 60
ea2384d3
FB
61static void format_print(void *opaque, const char *name)
62{
63 printf(" %s", name);
64}
65
d2c639d6 66/* Please keep in synch with qemu-img.texi */
3f379ab1 67static void help(void)
ea2384d3 68{
e00291c0
PB
69 const char *help_msg =
70 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
3f020d70 71 "usage: qemu-img command [command options]\n"
72 "QEMU disk image utility\n"
73 "\n"
74 "Command syntax:\n"
153859be
SB
75#define DEF(option, callback, arg_string) \
76 " " arg_string "\n"
77#include "qemu-img-cmds.h"
78#undef DEF
79#undef GEN_DOCS
3f020d70 80 "\n"
81 "Command parameters:\n"
82 " 'filename' is a disk image filename\n"
83 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
661a0f71 84 " 'cache' is the cache mode used to write the output disk image, the valid\n"
80ccf93b
LY
85 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
86 " 'directsync' and 'unsafe' (default for convert)\n"
3f020d70 87 " 'size' is the disk image size in bytes. Optional suffixes\n"
88 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
89 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
90 " 'output_filename' is the destination disk image filename\n"
91 " 'output_fmt' is the destination format\n"
92 " 'options' is a comma separated list of format specific options in a\n"
93 " name=value format. Use -o ? for an overview of the options supported by the\n"
94 " used format\n"
95 " '-c' indicates that target image must be compressed (qcow format only)\n"
96 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
97 " match exactly. The image doesn't need a working backing file before\n"
98 " rebasing in this case (useful for renaming the backing file)\n"
99 " '-h' with or without a command shows this help and lists the supported formats\n"
6b837bc4 100 " '-p' show progress of command (only certain commands)\n"
f382d43a 101 " '-q' use Quiet mode - do not print any output (except errors)\n"
a22f123c
KW
102 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
103 " for qemu-img to create a sparse image during conversion\n"
c054b3fd 104 " '--output' takes the format in which the output must be done (human or json)\n"
3f020d70 105 "\n"
4534ff54
KW
106 "Parameters to check subcommand:\n"
107 " '-r' tries to repair any inconsistencies that are found during the check.\n"
108 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
109 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
0546b8c2 110 " hiding corruption that has already occurred.\n"
4534ff54 111 "\n"
3f020d70 112 "Parameters to snapshot subcommand:\n"
113 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
114 " '-a' applies a snapshot (revert disk to saved state)\n"
115 " '-c' creates a snapshot\n"
116 " '-d' deletes a snapshot\n"
d14ed18c
MR
117 " '-l' lists all snapshots in the given image\n"
118 "\n"
119 "Parameters to compare subcommand:\n"
120 " '-f' first image format\n"
121 " '-F' second image format\n"
122 " '-s' run in Strict mode - fail on different image size or sector allocation\n";
e00291c0
PB
123
124 printf("%s\nSupported formats:", help_msg);
ea2384d3
FB
125 bdrv_iterate_format(format_print, NULL);
126 printf("\n");
127 exit(1);
128}
129
f382d43a
MR
130static int qprintf(bool quiet, const char *fmt, ...)
131{
132 int ret = 0;
133 if (!quiet) {
134 va_list args;
135 va_start(args, fmt);
136 ret = vprintf(fmt, args);
137 va_end(args);
138 }
139 return ret;
140}
141
ea2384d3
FB
142#if defined(WIN32)
143/* XXX: put correct support for win32 */
144static int read_password(char *buf, int buf_size)
145{
146 int c, i;
147 printf("Password: ");
148 fflush(stdout);
149 i = 0;
150 for(;;) {
151 c = getchar();
152 if (c == '\n')
153 break;
154 if (i < (buf_size - 1))
155 buf[i++] = c;
156 }
157 buf[i] = '\0';
158 return 0;
159}
160
161#else
162
163#include <termios.h>
164
165static struct termios oldtty;
166
167static void term_exit(void)
168{
169 tcsetattr (0, TCSANOW, &oldtty);
170}
171
172static void term_init(void)
173{
174 struct termios tty;
175
176 tcgetattr (0, &tty);
177 oldtty = tty;
178
179 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
180 |INLCR|IGNCR|ICRNL|IXON);
181 tty.c_oflag |= OPOST;
182 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
183 tty.c_cflag &= ~(CSIZE|PARENB);
184 tty.c_cflag |= CS8;
185 tty.c_cc[VMIN] = 1;
186 tty.c_cc[VTIME] = 0;
3b46e624 187
ea2384d3
FB
188 tcsetattr (0, TCSANOW, &tty);
189
190 atexit(term_exit);
191}
192
3f379ab1 193static int read_password(char *buf, int buf_size)
ea2384d3
FB
194{
195 uint8_t ch;
196 int i, ret;
197
198 printf("password: ");
199 fflush(stdout);
200 term_init();
201 i = 0;
202 for(;;) {
203 ret = read(0, &ch, 1);
204 if (ret == -1) {
205 if (errno == EAGAIN || errno == EINTR) {
206 continue;
207 } else {
208 ret = -1;
209 break;
210 }
211 } else if (ret == 0) {
212 ret = -1;
213 break;
214 } else {
215 if (ch == '\r') {
216 ret = 0;
217 break;
218 }
219 if (i < (buf_size - 1))
220 buf[i++] = ch;
221 }
222 }
223 term_exit();
224 buf[i] = '\0';
225 printf("\n");
226 return ret;
227}
228#endif
229
4ac8aacd
JS
230static int print_block_option_help(const char *filename, const char *fmt)
231{
232 BlockDriver *drv, *proto_drv;
233 QEMUOptionParameter *create_options = NULL;
234
235 /* Find driver and parse its options */
236 drv = bdrv_find_format(fmt);
237 if (!drv) {
15654a6d 238 error_report("Unknown file format '%s'", fmt);
4ac8aacd
JS
239 return 1;
240 }
241
242 proto_drv = bdrv_find_protocol(filename);
243 if (!proto_drv) {
15654a6d 244 error_report("Unknown protocol '%s'", filename);
4ac8aacd
JS
245 return 1;
246 }
247
248 create_options = append_option_parameters(create_options,
249 drv->create_options);
250 create_options = append_option_parameters(create_options,
251 proto_drv->create_options);
252 print_option_help(create_options);
253 free_option_parameters(create_options);
254 return 0;
255}
256
75c23805 257static BlockDriverState *bdrv_new_open(const char *filename,
9bc378c1 258 const char *fmt,
f0536bb8 259 int flags,
f382d43a
MR
260 bool require_io,
261 bool quiet)
75c23805
FB
262{
263 BlockDriverState *bs;
264 BlockDriver *drv;
265 char password[256];
b9eaf9ec 266 int ret;
75c23805 267
b9eaf9ec 268 bs = bdrv_new("image");
ad717139 269
75c23805
FB
270 if (fmt) {
271 drv = bdrv_find_format(fmt);
c2abccec 272 if (!drv) {
15654a6d 273 error_report("Unknown file format '%s'", fmt);
c2abccec
MK
274 goto fail;
275 }
75c23805
FB
276 } else {
277 drv = NULL;
278 }
b9eaf9ec 279
de9c0cec 280 ret = bdrv_open(bs, filename, NULL, flags, drv);
b9eaf9ec
KW
281 if (ret < 0) {
282 error_report("Could not open '%s': %s", filename, strerror(-ret));
c2abccec 283 goto fail;
75c23805 284 }
b9eaf9ec 285
f0536bb8 286 if (bdrv_is_encrypted(bs) && require_io) {
f382d43a 287 qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
c2abccec 288 if (read_password(password, sizeof(password)) < 0) {
15654a6d 289 error_report("No password given");
c2abccec
MK
290 goto fail;
291 }
292 if (bdrv_set_key(bs, password) < 0) {
15654a6d 293 error_report("invalid password");
c2abccec
MK
294 goto fail;
295 }
75c23805
FB
296 }
297 return bs;
c2abccec
MK
298fail:
299 if (bs) {
300 bdrv_delete(bs);
301 }
302 return NULL;
75c23805
FB
303}
304
c2abccec 305static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
306 const char *base_filename,
307 const char *base_fmt)
efa84d43 308{
efa84d43
KW
309 if (base_filename) {
310 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
15654a6d
JS
311 error_report("Backing file not supported for file format '%s'",
312 fmt);
c2abccec 313 return -1;
efa84d43
KW
314 }
315 }
316 if (base_fmt) {
317 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
15654a6d
JS
318 error_report("Backing file format not supported for file "
319 "format '%s'", fmt);
c2abccec 320 return -1;
efa84d43
KW
321 }
322 }
c2abccec 323 return 0;
efa84d43
KW
324}
325
ea2384d3
FB
326static int img_create(int argc, char **argv)
327{
a9300911 328 int c;
1da7cfbd 329 uint64_t img_size = -1;
ea2384d3 330 const char *fmt = "raw";
9230eaf6 331 const char *base_fmt = NULL;
ea2384d3
FB
332 const char *filename;
333 const char *base_filename = NULL;
9ea2ea71 334 char *options = NULL;
9b37525a 335 Error *local_err = NULL;
f382d43a 336 bool quiet = false;
3b46e624 337
ea2384d3 338 for(;;) {
f382d43a 339 c = getopt(argc, argv, "F:b:f:he6o:q");
b8fb60da 340 if (c == -1) {
ea2384d3 341 break;
b8fb60da 342 }
ea2384d3 343 switch(c) {
ef87394c 344 case '?':
ea2384d3
FB
345 case 'h':
346 help();
347 break;
9230eaf6
AL
348 case 'F':
349 base_fmt = optarg;
350 break;
ea2384d3
FB
351 case 'b':
352 base_filename = optarg;
353 break;
354 case 'f':
355 fmt = optarg;
356 break;
357 case 'e':
9d42e15d 358 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
359 "encryption\' instead!");
360 return 1;
d8871c5a 361 case '6':
9d42e15d 362 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
363 "compat6\' instead!");
364 return 1;
9ea2ea71
KW
365 case 'o':
366 options = optarg;
367 break;
f382d43a
MR
368 case 'q':
369 quiet = true;
370 break;
ea2384d3
FB
371 }
372 }
9230eaf6 373
b50cbabc 374 /* Get the filename */
b8fb60da 375 if (optind >= argc) {
b50cbabc 376 help();
b8fb60da 377 }
b50cbabc
MK
378 filename = argv[optind++];
379
1da7cfbd
JS
380 /* Get image size, if specified */
381 if (optind < argc) {
70b4f4bb 382 int64_t sval;
e36b3695
MA
383 char *end;
384 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
385 if (sval < 0 || *end) {
79443397 386 if (sval == -ERANGE) {
387 error_report("Image size must be less than 8 EiB!");
388 } else {
389 error_report("Invalid image size specified! You may use k, M, "
390 "G or T suffixes for ");
391 error_report("kilobytes, megabytes, gigabytes and terabytes.");
392 }
a9300911 393 return 1;
1da7cfbd
JS
394 }
395 img_size = (uint64_t)sval;
396 }
397
c8057f95 398 if (options && is_help_option(options)) {
a9300911 399 return print_block_option_help(filename, fmt);
4ac8aacd
JS
400 }
401
9b37525a 402 bdrv_img_create(filename, fmt, base_filename, base_fmt,
f382d43a 403 options, img_size, BDRV_O_FLAGS, &local_err, quiet);
9b37525a
LC
404 if (error_is_set(&local_err)) {
405 error_report("%s", error_get_pretty(local_err));
406 error_free(local_err);
c2abccec
MK
407 return 1;
408 }
a9300911 409
ea2384d3
FB
410 return 0;
411}
412
f382d43a 413static void dump_json_image_check(ImageCheck *check, bool quiet)
8599ea4c
FS
414{
415 Error *errp = NULL;
416 QString *str;
417 QmpOutputVisitor *ov = qmp_output_visitor_new();
418 QObject *obj;
419 visit_type_ImageCheck(qmp_output_get_visitor(ov),
420 &check, NULL, &errp);
421 obj = qmp_output_get_qobject(ov);
422 str = qobject_to_json_pretty(obj);
423 assert(str != NULL);
f382d43a 424 qprintf(quiet, "%s\n", qstring_get_str(str));
8599ea4c
FS
425 qobject_decref(obj);
426 qmp_output_visitor_cleanup(ov);
427 QDECREF(str);
428}
429
f382d43a 430static void dump_human_image_check(ImageCheck *check, bool quiet)
8599ea4c
FS
431{
432 if (!(check->corruptions || check->leaks || check->check_errors)) {
f382d43a 433 qprintf(quiet, "No errors were found on the image.\n");
8599ea4c
FS
434 } else {
435 if (check->corruptions) {
f382d43a
MR
436 qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
437 "Data may be corrupted, or further writes to the image "
438 "may corrupt it.\n",
439 check->corruptions);
8599ea4c
FS
440 }
441
442 if (check->leaks) {
f382d43a
MR
443 qprintf(quiet,
444 "\n%" PRId64 " leaked clusters were found on the image.\n"
445 "This means waste of disk space, but no harm to data.\n",
446 check->leaks);
8599ea4c
FS
447 }
448
449 if (check->check_errors) {
f382d43a
MR
450 qprintf(quiet,
451 "\n%" PRId64
452 " internal errors have occurred during the check.\n",
453 check->check_errors);
8599ea4c
FS
454 }
455 }
456
457 if (check->total_clusters != 0 && check->allocated_clusters != 0) {
f382d43a
MR
458 qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
459 "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
460 check->allocated_clusters, check->total_clusters,
461 check->allocated_clusters * 100.0 / check->total_clusters,
462 check->fragmented_clusters * 100.0 / check->allocated_clusters,
463 check->compressed_clusters * 100.0 /
464 check->allocated_clusters);
8599ea4c
FS
465 }
466
467 if (check->image_end_offset) {
f382d43a
MR
468 qprintf(quiet,
469 "Image end offset: %" PRId64 "\n", check->image_end_offset);
8599ea4c
FS
470 }
471}
472
473static int collect_image_check(BlockDriverState *bs,
474 ImageCheck *check,
475 const char *filename,
476 const char *fmt,
477 int fix)
478{
479 int ret;
480 BdrvCheckResult result;
481
482 ret = bdrv_check(bs, &result, fix);
483 if (ret < 0) {
484 return ret;
485 }
486
487 check->filename = g_strdup(filename);
488 check->format = g_strdup(bdrv_get_format_name(bs));
489 check->check_errors = result.check_errors;
490 check->corruptions = result.corruptions;
491 check->has_corruptions = result.corruptions != 0;
492 check->leaks = result.leaks;
493 check->has_leaks = result.leaks != 0;
494 check->corruptions_fixed = result.corruptions_fixed;
495 check->has_corruptions_fixed = result.corruptions != 0;
496 check->leaks_fixed = result.leaks_fixed;
497 check->has_leaks_fixed = result.leaks != 0;
498 check->image_end_offset = result.image_end_offset;
499 check->has_image_end_offset = result.image_end_offset != 0;
500 check->total_clusters = result.bfi.total_clusters;
501 check->has_total_clusters = result.bfi.total_clusters != 0;
502 check->allocated_clusters = result.bfi.allocated_clusters;
503 check->has_allocated_clusters = result.bfi.allocated_clusters != 0;
504 check->fragmented_clusters = result.bfi.fragmented_clusters;
505 check->has_fragmented_clusters = result.bfi.fragmented_clusters != 0;
e6439d78
SH
506 check->compressed_clusters = result.bfi.compressed_clusters;
507 check->has_compressed_clusters = result.bfi.compressed_clusters != 0;
8599ea4c
FS
508
509 return 0;
510}
511
e076f338
KW
512/*
513 * Checks an image for consistency. Exit codes:
514 *
515 * 0 - Check completed, image is good
516 * 1 - Check not completed because of internal errors
517 * 2 - Check completed, image is corrupted
518 * 3 - Check completed, image has leaked clusters, but is good otherwise
519 */
1585969c
AL
520static int img_check(int argc, char **argv)
521{
522 int c, ret;
8599ea4c
FS
523 OutputFormat output_format = OFORMAT_HUMAN;
524 const char *filename, *fmt, *output;
1585969c 525 BlockDriverState *bs;
4534ff54 526 int fix = 0;
058f8f16 527 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
8599ea4c 528 ImageCheck *check;
f382d43a 529 bool quiet = false;
1585969c
AL
530
531 fmt = NULL;
8599ea4c 532 output = NULL;
1585969c 533 for(;;) {
8599ea4c
FS
534 int option_index = 0;
535 static const struct option long_options[] = {
536 {"help", no_argument, 0, 'h'},
537 {"format", required_argument, 0, 'f'},
538 {"repair", no_argument, 0, 'r'},
539 {"output", required_argument, 0, OPTION_OUTPUT},
540 {0, 0, 0, 0}
541 };
f382d43a 542 c = getopt_long(argc, argv, "f:hr:q",
8599ea4c 543 long_options, &option_index);
b8fb60da 544 if (c == -1) {
1585969c 545 break;
b8fb60da 546 }
1585969c 547 switch(c) {
ef87394c 548 case '?':
1585969c
AL
549 case 'h':
550 help();
551 break;
552 case 'f':
553 fmt = optarg;
554 break;
4534ff54
KW
555 case 'r':
556 flags |= BDRV_O_RDWR;
557
558 if (!strcmp(optarg, "leaks")) {
559 fix = BDRV_FIX_LEAKS;
560 } else if (!strcmp(optarg, "all")) {
561 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
562 } else {
563 help();
564 }
565 break;
8599ea4c
FS
566 case OPTION_OUTPUT:
567 output = optarg;
568 break;
f382d43a
MR
569 case 'q':
570 quiet = true;
571 break;
1585969c
AL
572 }
573 }
b8fb60da 574 if (optind >= argc) {
1585969c 575 help();
b8fb60da 576 }
1585969c
AL
577 filename = argv[optind++];
578
8599ea4c
FS
579 if (output && !strcmp(output, "json")) {
580 output_format = OFORMAT_JSON;
581 } else if (output && !strcmp(output, "human")) {
582 output_format = OFORMAT_HUMAN;
583 } else if (output) {
584 error_report("--output must be used with human or json as argument.");
585 return 1;
586 }
587
f382d43a 588 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
589 if (!bs) {
590 return 1;
591 }
8599ea4c
FS
592
593 check = g_new0(ImageCheck, 1);
594 ret = collect_image_check(bs, check, filename, fmt, fix);
e076f338
KW
595
596 if (ret == -ENOTSUP) {
8599ea4c
FS
597 if (output_format == OFORMAT_HUMAN) {
598 error_report("This image format does not support checks");
599 }
600 ret = 1;
601 goto fail;
e076f338
KW
602 }
603
8599ea4c
FS
604 if (check->corruptions_fixed || check->leaks_fixed) {
605 int corruptions_fixed, leaks_fixed;
ccf34716 606
8599ea4c
FS
607 leaks_fixed = check->leaks_fixed;
608 corruptions_fixed = check->corruptions_fixed;
e076f338 609
8599ea4c 610 if (output_format == OFORMAT_HUMAN) {
f382d43a
MR
611 qprintf(quiet,
612 "The following inconsistencies were found and repaired:\n\n"
613 " %" PRId64 " leaked clusters\n"
614 " %" PRId64 " corruptions\n\n"
615 "Double checking the fixed image now...\n",
616 check->leaks_fixed,
617 check->corruptions_fixed);
e076f338
KW
618 }
619
8599ea4c 620 ret = collect_image_check(bs, check, filename, fmt, 0);
1585969c 621
8599ea4c
FS
622 check->leaks_fixed = leaks_fixed;
623 check->corruptions_fixed = corruptions_fixed;
f8111c24
DXW
624 }
625
8599ea4c
FS
626 switch (output_format) {
627 case OFORMAT_HUMAN:
f382d43a 628 dump_human_image_check(check, quiet);
8599ea4c
FS
629 break;
630 case OFORMAT_JSON:
f382d43a 631 dump_json_image_check(check, quiet);
8599ea4c 632 break;
c6bb9ad1
FS
633 }
634
8599ea4c
FS
635 if (ret || check->check_errors) {
636 ret = 1;
637 goto fail;
c2abccec 638 }
e076f338 639
8599ea4c
FS
640 if (check->corruptions) {
641 ret = 2;
642 } else if (check->leaks) {
643 ret = 3;
e076f338 644 } else {
8599ea4c 645 ret = 0;
e076f338 646 }
8599ea4c
FS
647
648fail:
649 qapi_free_ImageCheck(check);
650 bdrv_delete(bs);
651
652 return ret;
1585969c
AL
653}
654
ea2384d3
FB
655static int img_commit(int argc, char **argv)
656{
661a0f71
FS
657 int c, ret, flags;
658 const char *filename, *fmt, *cache;
ea2384d3 659 BlockDriverState *bs;
f382d43a 660 bool quiet = false;
ea2384d3
FB
661
662 fmt = NULL;
661a0f71 663 cache = BDRV_DEFAULT_CACHE;
ea2384d3 664 for(;;) {
f382d43a 665 c = getopt(argc, argv, "f:ht:q");
b8fb60da 666 if (c == -1) {
ea2384d3 667 break;
b8fb60da 668 }
ea2384d3 669 switch(c) {
ef87394c 670 case '?':
ea2384d3
FB
671 case 'h':
672 help();
673 break;
674 case 'f':
675 fmt = optarg;
676 break;
661a0f71
FS
677 case 't':
678 cache = optarg;
679 break;
f382d43a
MR
680 case 'q':
681 quiet = true;
682 break;
ea2384d3
FB
683 }
684 }
b8fb60da 685 if (optind >= argc) {
ea2384d3 686 help();
b8fb60da 687 }
ea2384d3
FB
688 filename = argv[optind++];
689
661a0f71 690 flags = BDRV_O_RDWR;
c3993cdc 691 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
692 if (ret < 0) {
693 error_report("Invalid cache option: %s", cache);
694 return -1;
695 }
696
f382d43a 697 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
698 if (!bs) {
699 return 1;
700 }
ea2384d3
FB
701 ret = bdrv_commit(bs);
702 switch(ret) {
703 case 0:
f382d43a 704 qprintf(quiet, "Image committed.\n");
ea2384d3
FB
705 break;
706 case -ENOENT:
15654a6d 707 error_report("No disk inserted");
ea2384d3
FB
708 break;
709 case -EACCES:
15654a6d 710 error_report("Image is read-only");
ea2384d3
FB
711 break;
712 case -ENOTSUP:
15654a6d 713 error_report("Image is already committed");
ea2384d3
FB
714 break;
715 default:
15654a6d 716 error_report("Error while committing image");
ea2384d3
FB
717 break;
718 }
719
720 bdrv_delete(bs);
c2abccec
MK
721 if (ret) {
722 return 1;
723 }
ea2384d3
FB
724 return 0;
725}
726
f58c7b35
TS
727/*
728 * Returns true iff the first sector pointed to by 'buf' contains at least
729 * a non-NUL byte.
730 *
731 * 'pnum' is set to the number of sectors (including and immediately following
732 * the first one) that are known to be in the same allocated/unallocated state.
733 */
ea2384d3
FB
734static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
735{
1a6d39fd
SH
736 bool is_zero;
737 int i;
ea2384d3
FB
738
739 if (n <= 0) {
740 *pnum = 0;
741 return 0;
742 }
1a6d39fd 743 is_zero = buffer_is_zero(buf, 512);
ea2384d3
FB
744 for(i = 1; i < n; i++) {
745 buf += 512;
1a6d39fd 746 if (is_zero != buffer_is_zero(buf, 512)) {
ea2384d3 747 break;
1a6d39fd 748 }
ea2384d3
FB
749 }
750 *pnum = i;
1a6d39fd 751 return !is_zero;
ea2384d3
FB
752}
753
a22f123c
KW
754/*
755 * Like is_allocated_sectors, but if the buffer starts with a used sector,
756 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
757 * breaking up write requests for only small sparse areas.
758 */
759static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
760 int min)
761{
762 int ret;
763 int num_checked, num_used;
764
765 if (n < min) {
766 min = n;
767 }
768
769 ret = is_allocated_sectors(buf, n, pnum);
770 if (!ret) {
771 return ret;
772 }
773
774 num_used = *pnum;
775 buf += BDRV_SECTOR_SIZE * *pnum;
776 n -= *pnum;
777 num_checked = num_used;
778
779 while (n > 0) {
780 ret = is_allocated_sectors(buf, n, pnum);
781
782 buf += BDRV_SECTOR_SIZE * *pnum;
783 n -= *pnum;
784 num_checked += *pnum;
785 if (ret) {
786 num_used = num_checked;
787 } else if (*pnum >= min) {
788 break;
789 }
790 }
791
792 *pnum = num_used;
793 return 1;
794}
795
3e85c6fd
KW
796/*
797 * Compares two buffers sector by sector. Returns 0 if the first sector of both
798 * buffers matches, non-zero otherwise.
799 *
800 * pnum is set to the number of sectors (including and immediately following
801 * the first one) that are known to have the same comparison result
802 */
803static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
804 int *pnum)
805{
806 int res, i;
807
808 if (n <= 0) {
809 *pnum = 0;
810 return 0;
811 }
812
813 res = !!memcmp(buf1, buf2, 512);
814 for(i = 1; i < n; i++) {
815 buf1 += 512;
816 buf2 += 512;
817
818 if (!!memcmp(buf1, buf2, 512) != res) {
819 break;
820 }
821 }
822
823 *pnum = i;
824 return res;
825}
826
80ee15a6 827#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3 828
d14ed18c
MR
829static int64_t sectors_to_bytes(int64_t sectors)
830{
831 return sectors << BDRV_SECTOR_BITS;
832}
833
834static int64_t sectors_to_process(int64_t total, int64_t from)
835{
836 return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
837}
838
839/*
840 * Check if passed sectors are empty (not allocated or contain only 0 bytes)
841 *
842 * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
843 * data and negative value on error.
844 *
845 * @param bs: Driver used for accessing file
846 * @param sect_num: Number of first sector to check
847 * @param sect_count: Number of sectors to check
848 * @param filename: Name of disk file we are checking (logging purpose)
849 * @param buffer: Allocated buffer for storing read data
850 * @param quiet: Flag for quiet mode
851 */
852static int check_empty_sectors(BlockDriverState *bs, int64_t sect_num,
853 int sect_count, const char *filename,
854 uint8_t *buffer, bool quiet)
855{
856 int pnum, ret = 0;
857 ret = bdrv_read(bs, sect_num, buffer, sect_count);
858 if (ret < 0) {
859 error_report("Error while reading offset %" PRId64 " of %s: %s",
860 sectors_to_bytes(sect_num), filename, strerror(-ret));
861 return ret;
862 }
863 ret = is_allocated_sectors(buffer, sect_count, &pnum);
864 if (ret || pnum != sect_count) {
865 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
866 sectors_to_bytes(ret ? sect_num : sect_num + pnum));
867 return 1;
868 }
869
870 return 0;
871}
872
873/*
874 * Compares two images. Exit codes:
875 *
876 * 0 - Images are identical
877 * 1 - Images differ
878 * >1 - Error occurred
879 */
880static int img_compare(int argc, char **argv)
881{
882 const char *fmt1 = NULL, *fmt2 = NULL, *filename1, *filename2;
883 BlockDriverState *bs1, *bs2;
884 int64_t total_sectors1, total_sectors2;
885 uint8_t *buf1 = NULL, *buf2 = NULL;
886 int pnum1, pnum2;
887 int allocated1, allocated2;
888 int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
889 bool progress = false, quiet = false, strict = false;
890 int64_t total_sectors;
891 int64_t sector_num = 0;
892 int64_t nb_sectors;
893 int c, pnum;
894 uint64_t bs_sectors;
895 uint64_t progress_base;
896
897 for (;;) {
898 c = getopt(argc, argv, "hpf:F:sq");
899 if (c == -1) {
900 break;
901 }
902 switch (c) {
903 case '?':
904 case 'h':
905 help();
906 break;
907 case 'f':
908 fmt1 = optarg;
909 break;
910 case 'F':
911 fmt2 = optarg;
912 break;
913 case 'p':
914 progress = true;
915 break;
916 case 'q':
917 quiet = true;
918 break;
919 case 's':
920 strict = true;
921 break;
922 }
923 }
924
925 /* Progress is not shown in Quiet mode */
926 if (quiet) {
927 progress = false;
928 }
929
930
931 if (optind > argc - 2) {
932 help();
933 }
934 filename1 = argv[optind++];
935 filename2 = argv[optind++];
936
937 /* Initialize before goto out */
938 qemu_progress_init(progress, 2.0);
939
940 bs1 = bdrv_new_open(filename1, fmt1, BDRV_O_FLAGS, true, quiet);
941 if (!bs1) {
942 error_report("Can't open file %s", filename1);
943 ret = 2;
944 goto out3;
945 }
946
947 bs2 = bdrv_new_open(filename2, fmt2, BDRV_O_FLAGS, true, quiet);
948 if (!bs2) {
949 error_report("Can't open file %s", filename2);
950 ret = 2;
951 goto out2;
952 }
953
954 buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
955 buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
956 bdrv_get_geometry(bs1, &bs_sectors);
957 total_sectors1 = bs_sectors;
958 bdrv_get_geometry(bs2, &bs_sectors);
959 total_sectors2 = bs_sectors;
960 total_sectors = MIN(total_sectors1, total_sectors2);
961 progress_base = MAX(total_sectors1, total_sectors2);
962
963 qemu_progress_print(0, 100);
964
965 if (strict && total_sectors1 != total_sectors2) {
966 ret = 1;
967 qprintf(quiet, "Strict mode: Image size mismatch!\n");
968 goto out;
969 }
970
971 for (;;) {
972 nb_sectors = sectors_to_process(total_sectors, sector_num);
973 if (nb_sectors <= 0) {
974 break;
975 }
976 allocated1 = bdrv_is_allocated_above(bs1, NULL, sector_num, nb_sectors,
977 &pnum1);
978 if (allocated1 < 0) {
979 ret = 3;
980 error_report("Sector allocation test failed for %s", filename1);
981 goto out;
982 }
983
984 allocated2 = bdrv_is_allocated_above(bs2, NULL, sector_num, nb_sectors,
985 &pnum2);
986 if (allocated2 < 0) {
987 ret = 3;
988 error_report("Sector allocation test failed for %s", filename2);
989 goto out;
990 }
991 nb_sectors = MIN(pnum1, pnum2);
992
993 if (allocated1 == allocated2) {
994 if (allocated1) {
995 ret = bdrv_read(bs1, sector_num, buf1, nb_sectors);
996 if (ret < 0) {
997 error_report("Error while reading offset %" PRId64 " of %s:"
998 " %s", sectors_to_bytes(sector_num), filename1,
999 strerror(-ret));
1000 ret = 4;
1001 goto out;
1002 }
1003 ret = bdrv_read(bs2, sector_num, buf2, nb_sectors);
1004 if (ret < 0) {
1005 error_report("Error while reading offset %" PRId64
1006 " of %s: %s", sectors_to_bytes(sector_num),
1007 filename2, strerror(-ret));
1008 ret = 4;
1009 goto out;
1010 }
1011 ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
1012 if (ret || pnum != nb_sectors) {
1013 ret = 1;
1014 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1015 sectors_to_bytes(
1016 ret ? sector_num : sector_num + pnum));
1017 goto out;
1018 }
1019 }
1020 } else {
1021 if (strict) {
1022 ret = 1;
1023 qprintf(quiet, "Strict mode: Offset %" PRId64
1024 " allocation mismatch!\n",
1025 sectors_to_bytes(sector_num));
1026 goto out;
1027 }
1028
1029 if (allocated1) {
1030 ret = check_empty_sectors(bs1, sector_num, nb_sectors,
1031 filename1, buf1, quiet);
1032 } else {
1033 ret = check_empty_sectors(bs2, sector_num, nb_sectors,
1034 filename2, buf1, quiet);
1035 }
1036 if (ret) {
1037 if (ret < 0) {
1038 ret = 4;
1039 error_report("Error while reading offset %" PRId64 ": %s",
1040 sectors_to_bytes(sector_num), strerror(-ret));
1041 }
1042 goto out;
1043 }
1044 }
1045 sector_num += nb_sectors;
1046 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1047 }
1048
1049 if (total_sectors1 != total_sectors2) {
1050 BlockDriverState *bs_over;
1051 int64_t total_sectors_over;
1052 const char *filename_over;
1053
1054 qprintf(quiet, "Warning: Image size mismatch!\n");
1055 if (total_sectors1 > total_sectors2) {
1056 total_sectors_over = total_sectors1;
1057 bs_over = bs1;
1058 filename_over = filename1;
1059 } else {
1060 total_sectors_over = total_sectors2;
1061 bs_over = bs2;
1062 filename_over = filename2;
1063 }
1064
1065 for (;;) {
1066 nb_sectors = sectors_to_process(total_sectors_over, sector_num);
1067 if (nb_sectors <= 0) {
1068 break;
1069 }
1070 ret = bdrv_is_allocated_above(bs_over, NULL, sector_num,
1071 nb_sectors, &pnum);
1072 if (ret < 0) {
1073 ret = 3;
1074 error_report("Sector allocation test failed for %s",
1075 filename_over);
1076 goto out;
1077
1078 }
1079 nb_sectors = pnum;
1080 if (ret) {
1081 ret = check_empty_sectors(bs_over, sector_num, nb_sectors,
1082 filename_over, buf1, quiet);
1083 if (ret) {
1084 if (ret < 0) {
1085 ret = 4;
1086 error_report("Error while reading offset %" PRId64
1087 " of %s: %s", sectors_to_bytes(sector_num),
1088 filename_over, strerror(-ret));
1089 }
1090 goto out;
1091 }
1092 }
1093 sector_num += nb_sectors;
1094 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1095 }
1096 }
1097
1098 qprintf(quiet, "Images are identical.\n");
1099 ret = 0;
1100
1101out:
1102 bdrv_delete(bs2);
1103 qemu_vfree(buf1);
1104 qemu_vfree(buf2);
1105out2:
1106 bdrv_delete(bs1);
1107out3:
1108 qemu_progress_end();
1109 return ret;
1110}
1111
ea2384d3
FB
1112static int img_convert(int argc, char **argv)
1113{
eec77d9e 1114 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
661a0f71
FS
1115 int progress = 0, flags;
1116 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
b50cbabc 1117 BlockDriver *drv, *proto_drv;
c2abccec 1118 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
1119 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
1120 uint64_t bs_sectors;
c2abccec 1121 uint8_t * buf = NULL;
ea2384d3 1122 const uint8_t *buf1;
faea38e7 1123 BlockDriverInfo bdi;
b50cbabc 1124 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 1125 QEMUOptionParameter *out_baseimg_param;
efa84d43 1126 char *options = NULL;
51ef6727 1127 const char *snapshot_name = NULL;
1f710495 1128 float local_progress = 0;
a22f123c 1129 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
f382d43a 1130 bool quiet = false;
ea2384d3
FB
1131
1132 fmt = NULL;
1133 out_fmt = "raw";
661a0f71 1134 cache = "unsafe";
f58c7b35 1135 out_baseimg = NULL;
eec77d9e 1136 compress = 0;
ea2384d3 1137 for(;;) {
f382d43a 1138 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:q");
b8fb60da 1139 if (c == -1) {
ea2384d3 1140 break;
b8fb60da 1141 }
ea2384d3 1142 switch(c) {
ef87394c 1143 case '?':
ea2384d3
FB
1144 case 'h':
1145 help();
1146 break;
1147 case 'f':
1148 fmt = optarg;
1149 break;
1150 case 'O':
1151 out_fmt = optarg;
1152 break;
f58c7b35
TS
1153 case 'B':
1154 out_baseimg = optarg;
1155 break;
ea2384d3 1156 case 'c':
eec77d9e 1157 compress = 1;
ea2384d3
FB
1158 break;
1159 case 'e':
9d42e15d 1160 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
1161 "encryption\' instead!");
1162 return 1;
ec36ba14 1163 case '6':
9d42e15d 1164 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
1165 "compat6\' instead!");
1166 return 1;
efa84d43
KW
1167 case 'o':
1168 options = optarg;
1169 break;
51ef6727 1170 case 's':
1171 snapshot_name = optarg;
1172 break;
a22f123c
KW
1173 case 'S':
1174 {
1175 int64_t sval;
e36b3695
MA
1176 char *end;
1177 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
1178 if (sval < 0 || *end) {
a22f123c
KW
1179 error_report("Invalid minimum zero buffer size for sparse output specified");
1180 return 1;
1181 }
1182
1183 min_sparse = sval / BDRV_SECTOR_SIZE;
1184 break;
1185 }
6b837bc4
JS
1186 case 'p':
1187 progress = 1;
1188 break;
661a0f71
FS
1189 case 't':
1190 cache = optarg;
1191 break;
f382d43a
MR
1192 case 'q':
1193 quiet = true;
1194 break;
ea2384d3
FB
1195 }
1196 }
3b46e624 1197
f382d43a
MR
1198 if (quiet) {
1199 progress = 0;
1200 }
1201
926c2d23 1202 bs_n = argc - optind - 1;
b8fb60da
JS
1203 if (bs_n < 1) {
1204 help();
1205 }
926c2d23
AZ
1206
1207 out_filename = argv[argc - 1];
f58c7b35 1208
fa170c14
CA
1209 /* Initialize before goto out */
1210 qemu_progress_init(progress, 2.0);
1211
c8057f95 1212 if (options && is_help_option(options)) {
4ac8aacd
JS
1213 ret = print_block_option_help(out_filename, out_fmt);
1214 goto out;
1215 }
1216
c2abccec 1217 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
1218 error_report("-B makes no sense when concatenating multiple input "
1219 "images");
31ca34b8
JS
1220 ret = -1;
1221 goto out;
c2abccec 1222 }
f8111c24 1223
6b837bc4
JS
1224 qemu_progress_print(0, 100);
1225
7267c094 1226 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
1227
1228 total_sectors = 0;
1229 for (bs_i = 0; bs_i < bs_n; bs_i++) {
f382d43a
MR
1230 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true,
1231 quiet);
c2abccec 1232 if (!bs[bs_i]) {
15654a6d 1233 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
1234 ret = -1;
1235 goto out;
1236 }
926c2d23
AZ
1237 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1238 total_sectors += bs_sectors;
1239 }
ea2384d3 1240
51ef6727 1241 if (snapshot_name != NULL) {
1242 if (bs_n > 1) {
6daf194d 1243 error_report("No support for concatenating multiple snapshot");
51ef6727 1244 ret = -1;
1245 goto out;
1246 }
1247 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
6daf194d 1248 error_report("Failed to load snapshot");
51ef6727 1249 ret = -1;
1250 goto out;
1251 }
1252 }
1253
efa84d43 1254 /* Find driver and parse its options */
ea2384d3 1255 drv = bdrv_find_format(out_fmt);
c2abccec 1256 if (!drv) {
15654a6d 1257 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
1258 ret = -1;
1259 goto out;
1260 }
efa84d43 1261
b50cbabc 1262 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 1263 if (!proto_drv) {
15654a6d 1264 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
1265 ret = -1;
1266 goto out;
1267 }
b50cbabc
MK
1268
1269 create_options = append_option_parameters(create_options,
1270 drv->create_options);
1271 create_options = append_option_parameters(create_options,
1272 proto_drv->create_options);
db08adf5 1273
efa84d43 1274 if (options) {
b50cbabc 1275 param = parse_option_parameters(options, create_options, param);
efa84d43 1276 if (param == NULL) {
15654a6d 1277 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
1278 ret = -1;
1279 goto out;
efa84d43
KW
1280 }
1281 } else {
b50cbabc 1282 param = parse_option_parameters("", create_options, param);
efa84d43
KW
1283 }
1284
1285 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 1286 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
1287 if (ret < 0) {
1288 goto out;
1289 }
efa84d43 1290
a18953fb
KW
1291 /* Get backing file name if -o backing_file was used */
1292 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
1293 if (out_baseimg_param) {
1294 out_baseimg = out_baseimg_param->value.s;
1295 }
1296
efa84d43 1297 /* Check if compression is supported */
eec77d9e 1298 if (compress) {
efa84d43
KW
1299 QEMUOptionParameter *encryption =
1300 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
41521fa4
KW
1301 QEMUOptionParameter *preallocation =
1302 get_option_parameter(param, BLOCK_OPT_PREALLOC);
efa84d43
KW
1303
1304 if (!drv->bdrv_write_compressed) {
15654a6d 1305 error_report("Compression not supported for this file format");
c2abccec
MK
1306 ret = -1;
1307 goto out;
efa84d43
KW
1308 }
1309
1310 if (encryption && encryption->value.n) {
15654a6d
JS
1311 error_report("Compression and encryption not supported at "
1312 "the same time");
c2abccec
MK
1313 ret = -1;
1314 goto out;
efa84d43 1315 }
41521fa4
KW
1316
1317 if (preallocation && preallocation->value.s
1318 && strcmp(preallocation->value.s, "off"))
1319 {
1320 error_report("Compression and preallocation not supported at "
1321 "the same time");
1322 ret = -1;
1323 goto out;
1324 }
efa84d43
KW
1325 }
1326
1327 /* Create the new image */
1328 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
1329 if (ret < 0) {
1330 if (ret == -ENOTSUP) {
15654a6d
JS
1331 error_report("Formatting not supported for file format '%s'",
1332 out_fmt);
6e9ea0c0 1333 } else if (ret == -EFBIG) {
15654a6d
JS
1334 error_report("The image size is too large for file format '%s'",
1335 out_fmt);
ea2384d3 1336 } else {
15654a6d
JS
1337 error_report("%s: error while converting %s: %s",
1338 out_filename, out_fmt, strerror(-ret));
ea2384d3 1339 }
c2abccec 1340 goto out;
ea2384d3 1341 }
3b46e624 1342
661a0f71 1343 flags = BDRV_O_RDWR;
c3993cdc 1344 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
1345 if (ret < 0) {
1346 error_report("Invalid cache option: %s", cache);
1347 return -1;
1348 }
1349
f382d43a 1350 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true, quiet);
c2abccec
MK
1351 if (!out_bs) {
1352 ret = -1;
1353 goto out;
1354 }
ea2384d3 1355
926c2d23
AZ
1356 bs_i = 0;
1357 bs_offset = 0;
1358 bdrv_get_geometry(bs[0], &bs_sectors);
bb1c0597 1359 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
926c2d23 1360
eec77d9e 1361 if (compress) {
c2abccec
MK
1362 ret = bdrv_get_info(out_bs, &bdi);
1363 if (ret < 0) {
15654a6d 1364 error_report("could not get block driver info");
c2abccec
MK
1365 goto out;
1366 }
faea38e7 1367 cluster_size = bdi.cluster_size;
c2abccec 1368 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 1369 error_report("invalid cluster size");
c2abccec
MK
1370 ret = -1;
1371 goto out;
1372 }
ea2384d3
FB
1373 cluster_sectors = cluster_size >> 9;
1374 sector_num = 0;
6b837bc4
JS
1375
1376 nb_sectors = total_sectors;
1f710495
KW
1377 if (nb_sectors != 0) {
1378 local_progress = (float)100 /
1379 (nb_sectors / MIN(nb_sectors, cluster_sectors));
1380 }
6b837bc4 1381
ea2384d3 1382 for(;;) {
926c2d23
AZ
1383 int64_t bs_num;
1384 int remainder;
1385 uint8_t *buf2;
1386
ea2384d3
FB
1387 nb_sectors = total_sectors - sector_num;
1388 if (nb_sectors <= 0)
1389 break;
1390 if (nb_sectors >= cluster_sectors)
1391 n = cluster_sectors;
1392 else
1393 n = nb_sectors;
926c2d23
AZ
1394
1395 bs_num = sector_num - bs_offset;
1396 assert (bs_num >= 0);
1397 remainder = n;
1398 buf2 = buf;
1399 while (remainder > 0) {
1400 int nlow;
1401 while (bs_num == bs_sectors) {
1402 bs_i++;
1403 assert (bs_i < bs_n);
1404 bs_offset += bs_sectors;
1405 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1406 bs_num = 0;
0bfcd599
BS
1407 /* printf("changing part: sector_num=%" PRId64 ", "
1408 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
1409 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
1410 }
1411 assert (bs_num < bs_sectors);
1412
1413 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
1414
c2abccec
MK
1415 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
1416 if (ret < 0) {
3fba9d81
SH
1417 error_report("error while reading sector %" PRId64 ": %s",
1418 bs_num, strerror(-ret));
c2abccec
MK
1419 goto out;
1420 }
926c2d23
AZ
1421
1422 buf2 += nlow * 512;
1423 bs_num += nlow;
1424
1425 remainder -= nlow;
1426 }
1427 assert (remainder == 0);
1428
54f106d5
SH
1429 if (!buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)) {
1430 ret = bdrv_write_compressed(out_bs, sector_num, buf, n);
c2abccec 1431 if (ret != 0) {
3fba9d81
SH
1432 error_report("error while compressing sector %" PRId64
1433 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1434 goto out;
1435 }
ea2384d3
FB
1436 }
1437 sector_num += n;
6b837bc4 1438 qemu_progress_print(local_progress, 100);
ea2384d3 1439 }
faea38e7
FB
1440 /* signal EOF to align */
1441 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 1442 } else {
f2feebbd
KW
1443 int has_zero_init = bdrv_has_zero_init(out_bs);
1444
f58c7b35 1445 sector_num = 0; // total number of sectors converted so far
6b837bc4 1446 nb_sectors = total_sectors - sector_num;
1f710495
KW
1447 if (nb_sectors != 0) {
1448 local_progress = (float)100 /
1449 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
1450 }
6b837bc4 1451
ea2384d3
FB
1452 for(;;) {
1453 nb_sectors = total_sectors - sector_num;
b8fb60da 1454 if (nb_sectors <= 0) {
ea2384d3 1455 break;
b8fb60da
JS
1456 }
1457 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 1458 n = (IO_BUF_SIZE / 512);
b8fb60da 1459 } else {
ea2384d3 1460 n = nb_sectors;
b8fb60da 1461 }
926c2d23
AZ
1462
1463 while (sector_num - bs_offset >= bs_sectors) {
1464 bs_i ++;
1465 assert (bs_i < bs_n);
1466 bs_offset += bs_sectors;
1467 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
1468 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1469 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
1470 sector_num, bs_i, bs_offset, bs_sectors); */
1471 }
1472
b8fb60da 1473 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 1474 n = bs_offset + bs_sectors - sector_num;
b8fb60da 1475 }
926c2d23 1476
f2feebbd 1477 if (has_zero_init) {
d032044f
AS
1478 /* If the output image is being created as a copy on write image,
1479 assume that sectors which are unallocated in the input image
1480 are present in both the output's and input's base images (no
1481 need to copy them). */
1482 if (out_baseimg) {
1483 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1484 n, &n1)) {
1485 sector_num += n1;
1486 continue;
1487 }
1488 /* The next 'n1' sectors are allocated in the input image. Copy
1489 only those as they may be followed by unallocated sectors. */
1490 n = n1;
93c65b47 1491 }
93c65b47
AL
1492 } else {
1493 n1 = n;
f58c7b35
TS
1494 }
1495
c2abccec
MK
1496 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1497 if (ret < 0) {
3fba9d81
SH
1498 error_report("error while reading sector %" PRId64 ": %s",
1499 sector_num - bs_offset, strerror(-ret));
c2abccec
MK
1500 goto out;
1501 }
ea2384d3
FB
1502 /* NOTE: at the same time we convert, we do not write zero
1503 sectors to have a chance to compress the image. Ideally, we
1504 should add a specific call to have the info to go faster */
1505 buf1 = buf;
1506 while (n > 0) {
f58c7b35
TS
1507 /* If the output image is being created as a copy on write image,
1508 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
1509 because they may differ from the sectors in the base image.
1510
1511 If the output is to a host device, we also write out
1512 sectors that are entirely 0, since whatever data was
1513 already there is garbage, not 0s. */
f2feebbd 1514 if (!has_zero_init || out_baseimg ||
a22f123c 1515 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
c2abccec
MK
1516 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1517 if (ret < 0) {
3fba9d81
SH
1518 error_report("error while writing sector %" PRId64
1519 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1520 goto out;
1521 }
ea2384d3
FB
1522 }
1523 sector_num += n1;
1524 n -= n1;
1525 buf1 += n1 * 512;
1526 }
6b837bc4 1527 qemu_progress_print(local_progress, 100);
ea2384d3
FB
1528 }
1529 }
c2abccec 1530out:
6b837bc4 1531 qemu_progress_end();
c2abccec
MK
1532 free_option_parameters(create_options);
1533 free_option_parameters(param);
bb1c0597 1534 qemu_vfree(buf);
c2abccec
MK
1535 if (out_bs) {
1536 bdrv_delete(out_bs);
1537 }
31ca34b8
JS
1538 if (bs) {
1539 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1540 if (bs[bs_i]) {
1541 bdrv_delete(bs[bs_i]);
1542 }
c2abccec 1543 }
7267c094 1544 g_free(bs);
c2abccec 1545 }
c2abccec
MK
1546 if (ret) {
1547 return 1;
1548 }
ea2384d3
FB
1549 return 0;
1550}
1551
57d1a2b6 1552
faea38e7
FB
1553static void dump_snapshots(BlockDriverState *bs)
1554{
1555 QEMUSnapshotInfo *sn_tab, *sn;
1556 int nb_sns, i;
faea38e7
FB
1557
1558 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1559 if (nb_sns <= 0)
1560 return;
1561 printf("Snapshot list:\n");
5b917044
WX
1562 bdrv_snapshot_dump(fprintf, stdout, NULL);
1563 printf("\n");
faea38e7
FB
1564 for(i = 0; i < nb_sns; i++) {
1565 sn = &sn_tab[i];
5b917044
WX
1566 bdrv_snapshot_dump(fprintf, stdout, sn);
1567 printf("\n");
faea38e7 1568 }
7267c094 1569 g_free(sn_tab);
faea38e7
FB
1570}
1571
9699bf0d
SH
1572static void dump_json_image_info_list(ImageInfoList *list)
1573{
1574 Error *errp = NULL;
1575 QString *str;
1576 QmpOutputVisitor *ov = qmp_output_visitor_new();
1577 QObject *obj;
1578 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1579 &list, NULL, &errp);
1580 obj = qmp_output_get_qobject(ov);
1581 str = qobject_to_json_pretty(obj);
1582 assert(str != NULL);
1583 printf("%s\n", qstring_get_str(str));
1584 qobject_decref(obj);
1585 qmp_output_visitor_cleanup(ov);
1586 QDECREF(str);
1587}
1588
c054b3fd
BC
1589static void dump_json_image_info(ImageInfo *info)
1590{
1591 Error *errp = NULL;
1592 QString *str;
1593 QmpOutputVisitor *ov = qmp_output_visitor_new();
1594 QObject *obj;
1595 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1596 &info, NULL, &errp);
1597 obj = qmp_output_get_qobject(ov);
1598 str = qobject_to_json_pretty(obj);
1599 assert(str != NULL);
1600 printf("%s\n", qstring_get_str(str));
1601 qobject_decref(obj);
1602 qmp_output_visitor_cleanup(ov);
1603 QDECREF(str);
1604}
1605
9699bf0d
SH
1606static void dump_human_image_info_list(ImageInfoList *list)
1607{
1608 ImageInfoList *elem;
1609 bool delim = false;
1610
1611 for (elem = list; elem; elem = elem->next) {
1612 if (delim) {
1613 printf("\n");
1614 }
1615 delim = true;
1616
5b917044 1617 bdrv_image_info_dump(fprintf, stdout, elem->value);
9699bf0d
SH
1618 }
1619}
1620
1621static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1622{
1623 return strcmp(a, b) == 0;
1624}
1625
1626/**
1627 * Open an image file chain and return an ImageInfoList
1628 *
1629 * @filename: topmost image filename
1630 * @fmt: topmost image format (may be NULL to autodetect)
1631 * @chain: true - enumerate entire backing file chain
1632 * false - only topmost image file
1633 *
1634 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1635 * image file. If there was an error a message will have been printed to
1636 * stderr.
1637 */
1638static ImageInfoList *collect_image_info_list(const char *filename,
1639 const char *fmt,
1640 bool chain)
1641{
1642 ImageInfoList *head = NULL;
1643 ImageInfoList **last = &head;
1644 GHashTable *filenames;
1645
1646 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1647
1648 while (filename) {
1649 BlockDriverState *bs;
1650 ImageInfo *info;
1651 ImageInfoList *elem;
1652
1653 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1654 error_report("Backing file '%s' creates an infinite loop.",
1655 filename);
1656 goto err;
1657 }
1658 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1659
1660 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
f382d43a 1661 false, false);
9699bf0d
SH
1662 if (!bs) {
1663 goto err;
1664 }
1665
1666 info = g_new0(ImageInfo, 1);
f364ec65
WX
1667 bdrv_collect_image_info(bs, info, filename);
1668 bdrv_collect_snapshots(bs, info);
9699bf0d
SH
1669
1670 elem = g_new0(ImageInfoList, 1);
1671 elem->value = info;
1672 *last = elem;
1673 last = &elem->next;
1674
1675 bdrv_delete(bs);
1676
1677 filename = fmt = NULL;
1678 if (chain) {
1679 if (info->has_full_backing_filename) {
1680 filename = info->full_backing_filename;
1681 } else if (info->has_backing_filename) {
1682 filename = info->backing_filename;
1683 }
1684 if (info->has_backing_filename_format) {
1685 fmt = info->backing_filename_format;
1686 }
1687 }
1688 }
1689 g_hash_table_destroy(filenames);
1690 return head;
1691
1692err:
1693 qapi_free_ImageInfoList(head);
1694 g_hash_table_destroy(filenames);
1695 return NULL;
1696}
1697
c054b3fd
BC
1698static int img_info(int argc, char **argv)
1699{
1700 int c;
1701 OutputFormat output_format = OFORMAT_HUMAN;
9699bf0d 1702 bool chain = false;
c054b3fd 1703 const char *filename, *fmt, *output;
9699bf0d 1704 ImageInfoList *list;
c054b3fd 1705
ea2384d3 1706 fmt = NULL;
c054b3fd 1707 output = NULL;
ea2384d3 1708 for(;;) {
c054b3fd
BC
1709 int option_index = 0;
1710 static const struct option long_options[] = {
1711 {"help", no_argument, 0, 'h'},
1712 {"format", required_argument, 0, 'f'},
1713 {"output", required_argument, 0, OPTION_OUTPUT},
9699bf0d 1714 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
c054b3fd
BC
1715 {0, 0, 0, 0}
1716 };
1717 c = getopt_long(argc, argv, "f:h",
1718 long_options, &option_index);
b8fb60da 1719 if (c == -1) {
ea2384d3 1720 break;
b8fb60da 1721 }
ea2384d3 1722 switch(c) {
ef87394c 1723 case '?':
ea2384d3
FB
1724 case 'h':
1725 help();
1726 break;
1727 case 'f':
1728 fmt = optarg;
1729 break;
c054b3fd
BC
1730 case OPTION_OUTPUT:
1731 output = optarg;
1732 break;
9699bf0d
SH
1733 case OPTION_BACKING_CHAIN:
1734 chain = true;
1735 break;
ea2384d3
FB
1736 }
1737 }
b8fb60da 1738 if (optind >= argc) {
ea2384d3 1739 help();
b8fb60da 1740 }
ea2384d3
FB
1741 filename = argv[optind++];
1742
c054b3fd
BC
1743 if (output && !strcmp(output, "json")) {
1744 output_format = OFORMAT_JSON;
1745 } else if (output && !strcmp(output, "human")) {
1746 output_format = OFORMAT_HUMAN;
1747 } else if (output) {
1748 error_report("--output must be used with human or json as argument.");
c2abccec
MK
1749 return 1;
1750 }
c054b3fd 1751
9699bf0d
SH
1752 list = collect_image_info_list(filename, fmt, chain);
1753 if (!list) {
c2abccec 1754 return 1;
faea38e7 1755 }
c054b3fd 1756
c054b3fd
BC
1757 switch (output_format) {
1758 case OFORMAT_HUMAN:
9699bf0d 1759 dump_human_image_info_list(list);
c054b3fd
BC
1760 break;
1761 case OFORMAT_JSON:
9699bf0d
SH
1762 if (chain) {
1763 dump_json_image_info_list(list);
1764 } else {
1765 dump_json_image_info(list->value);
1766 }
c054b3fd 1767 break;
faea38e7 1768 }
c054b3fd 1769
9699bf0d 1770 qapi_free_ImageInfoList(list);
ea2384d3
FB
1771 return 0;
1772}
1773
f7b4a940
AL
1774#define SNAPSHOT_LIST 1
1775#define SNAPSHOT_CREATE 2
1776#define SNAPSHOT_APPLY 3
1777#define SNAPSHOT_DELETE 4
1778
153859be 1779static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1780{
1781 BlockDriverState *bs;
1782 QEMUSnapshotInfo sn;
1783 char *filename, *snapshot_name = NULL;
c2abccec 1784 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
1785 int action = 0;
1786 qemu_timeval tv;
f382d43a 1787 bool quiet = false;
f7b4a940 1788
710da702 1789 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
f7b4a940
AL
1790 /* Parse commandline parameters */
1791 for(;;) {
f382d43a 1792 c = getopt(argc, argv, "la:c:d:hq");
b8fb60da 1793 if (c == -1) {
f7b4a940 1794 break;
b8fb60da 1795 }
f7b4a940 1796 switch(c) {
ef87394c 1797 case '?':
f7b4a940
AL
1798 case 'h':
1799 help();
153859be 1800 return 0;
f7b4a940
AL
1801 case 'l':
1802 if (action) {
1803 help();
153859be 1804 return 0;
f7b4a940
AL
1805 }
1806 action = SNAPSHOT_LIST;
f5edb014 1807 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
1808 break;
1809 case 'a':
1810 if (action) {
1811 help();
153859be 1812 return 0;
f7b4a940
AL
1813 }
1814 action = SNAPSHOT_APPLY;
1815 snapshot_name = optarg;
1816 break;
1817 case 'c':
1818 if (action) {
1819 help();
153859be 1820 return 0;
f7b4a940
AL
1821 }
1822 action = SNAPSHOT_CREATE;
1823 snapshot_name = optarg;
1824 break;
1825 case 'd':
1826 if (action) {
1827 help();
153859be 1828 return 0;
f7b4a940
AL
1829 }
1830 action = SNAPSHOT_DELETE;
1831 snapshot_name = optarg;
1832 break;
f382d43a
MR
1833 case 'q':
1834 quiet = true;
1835 break;
f7b4a940
AL
1836 }
1837 }
1838
b8fb60da 1839 if (optind >= argc) {
f7b4a940 1840 help();
b8fb60da 1841 }
f7b4a940
AL
1842 filename = argv[optind++];
1843
1844 /* Open the image */
f382d43a 1845 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true, quiet);
c2abccec
MK
1846 if (!bs) {
1847 return 1;
1848 }
f7b4a940
AL
1849
1850 /* Perform the requested action */
1851 switch(action) {
1852 case SNAPSHOT_LIST:
1853 dump_snapshots(bs);
1854 break;
1855
1856 case SNAPSHOT_CREATE:
1857 memset(&sn, 0, sizeof(sn));
1858 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1859
1860 qemu_gettimeofday(&tv);
1861 sn.date_sec = tv.tv_sec;
1862 sn.date_nsec = tv.tv_usec * 1000;
1863
1864 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 1865 if (ret) {
15654a6d 1866 error_report("Could not create snapshot '%s': %d (%s)",
f7b4a940 1867 snapshot_name, ret, strerror(-ret));
b8fb60da 1868 }
f7b4a940
AL
1869 break;
1870
1871 case SNAPSHOT_APPLY:
1872 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 1873 if (ret) {
15654a6d 1874 error_report("Could not apply snapshot '%s': %d (%s)",
f7b4a940 1875 snapshot_name, ret, strerror(-ret));
b8fb60da 1876 }
f7b4a940
AL
1877 break;
1878
1879 case SNAPSHOT_DELETE:
1880 ret = bdrv_snapshot_delete(bs, snapshot_name);
b8fb60da 1881 if (ret) {
15654a6d 1882 error_report("Could not delete snapshot '%s': %d (%s)",
f7b4a940 1883 snapshot_name, ret, strerror(-ret));
b8fb60da 1884 }
f7b4a940
AL
1885 break;
1886 }
1887
1888 /* Cleanup */
1889 bdrv_delete(bs);
c2abccec
MK
1890 if (ret) {
1891 return 1;
1892 }
153859be 1893 return 0;
f7b4a940
AL
1894}
1895
3e85c6fd
KW
1896static int img_rebase(int argc, char **argv)
1897{
c2abccec 1898 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 1899 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 1900 char *filename;
661a0f71 1901 const char *fmt, *cache, *out_basefmt, *out_baseimg;
3e85c6fd
KW
1902 int c, flags, ret;
1903 int unsafe = 0;
6b837bc4 1904 int progress = 0;
f382d43a 1905 bool quiet = false;
3e85c6fd
KW
1906
1907 /* Parse commandline parameters */
e53dbee0 1908 fmt = NULL;
661a0f71 1909 cache = BDRV_DEFAULT_CACHE;
3e85c6fd
KW
1910 out_baseimg = NULL;
1911 out_basefmt = NULL;
3e85c6fd 1912 for(;;) {
f382d43a 1913 c = getopt(argc, argv, "uhf:F:b:pt:q");
b8fb60da 1914 if (c == -1) {
3e85c6fd 1915 break;
b8fb60da 1916 }
3e85c6fd 1917 switch(c) {
ef87394c 1918 case '?':
3e85c6fd
KW
1919 case 'h':
1920 help();
1921 return 0;
e53dbee0
KW
1922 case 'f':
1923 fmt = optarg;
1924 break;
3e85c6fd
KW
1925 case 'F':
1926 out_basefmt = optarg;
1927 break;
1928 case 'b':
1929 out_baseimg = optarg;
1930 break;
1931 case 'u':
1932 unsafe = 1;
1933 break;
6b837bc4
JS
1934 case 'p':
1935 progress = 1;
1936 break;
661a0f71
FS
1937 case 't':
1938 cache = optarg;
1939 break;
f382d43a
MR
1940 case 'q':
1941 quiet = true;
1942 break;
3e85c6fd
KW
1943 }
1944 }
1945
f382d43a
MR
1946 if (quiet) {
1947 progress = 0;
1948 }
1949
9a9d9dba 1950 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
3e85c6fd 1951 help();
b8fb60da 1952 }
3e85c6fd
KW
1953 filename = argv[optind++];
1954
6b837bc4
JS
1955 qemu_progress_init(progress, 2.0);
1956 qemu_progress_print(0, 100);
1957
661a0f71 1958 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
c3993cdc 1959 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
1960 if (ret < 0) {
1961 error_report("Invalid cache option: %s", cache);
1962 return -1;
1963 }
1964
3e85c6fd
KW
1965 /*
1966 * Open the images.
1967 *
1968 * Ignore the old backing file for unsafe rebase in case we want to correct
1969 * the reference to a renamed or moved backing file.
1970 */
f382d43a 1971 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
1972 if (!bs) {
1973 return 1;
1974 }
3e85c6fd
KW
1975
1976 /* Find the right drivers for the backing files */
1977 old_backing_drv = NULL;
1978 new_backing_drv = NULL;
1979
1980 if (!unsafe && bs->backing_format[0] != '\0') {
1981 old_backing_drv = bdrv_find_format(bs->backing_format);
1982 if (old_backing_drv == NULL) {
15654a6d 1983 error_report("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
1984 ret = -1;
1985 goto out;
3e85c6fd
KW
1986 }
1987 }
1988
1989 if (out_basefmt != NULL) {
1990 new_backing_drv = bdrv_find_format(out_basefmt);
1991 if (new_backing_drv == NULL) {
15654a6d 1992 error_report("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
1993 ret = -1;
1994 goto out;
3e85c6fd
KW
1995 }
1996 }
1997
1998 /* For safe rebasing we need to compare old and new backing file */
1999 if (unsafe) {
2000 /* Make the compiler happy */
2001 bs_old_backing = NULL;
2002 bs_new_backing = NULL;
2003 } else {
2004 char backing_name[1024];
2005
2006 bs_old_backing = bdrv_new("old_backing");
2007 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
de9c0cec 2008 ret = bdrv_open(bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
c2abccec
MK
2009 old_backing_drv);
2010 if (ret) {
15654a6d 2011 error_report("Could not open old backing file '%s'", backing_name);
c2abccec 2012 goto out;
3e85c6fd 2013 }
a616673d
AB
2014 if (out_baseimg[0]) {
2015 bs_new_backing = bdrv_new("new_backing");
de9c0cec 2016 ret = bdrv_open(bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
c2abccec 2017 new_backing_drv);
a616673d
AB
2018 if (ret) {
2019 error_report("Could not open new backing file '%s'",
2020 out_baseimg);
2021 goto out;
2022 }
3e85c6fd
KW
2023 }
2024 }
2025
2026 /*
2027 * Check each unallocated cluster in the COW file. If it is unallocated,
2028 * accesses go to the backing file. We must therefore compare this cluster
2029 * in the old and new backing file, and if they differ we need to copy it
2030 * from the old backing file into the COW file.
2031 *
2032 * If qemu-img crashes during this step, no harm is done. The content of
2033 * the image is the same as the original one at any time.
2034 */
2035 if (!unsafe) {
2036 uint64_t num_sectors;
87a1b3e3 2037 uint64_t old_backing_num_sectors;
a616673d 2038 uint64_t new_backing_num_sectors = 0;
3e85c6fd 2039 uint64_t sector;
cc60e327 2040 int n;
d6771bfa
T
2041 uint8_t * buf_old;
2042 uint8_t * buf_new;
1f710495 2043 float local_progress = 0;
d6771bfa 2044
bb1c0597
KW
2045 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
2046 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
3e85c6fd
KW
2047
2048 bdrv_get_geometry(bs, &num_sectors);
87a1b3e3 2049 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
a616673d
AB
2050 if (bs_new_backing) {
2051 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
2052 }
3e85c6fd 2053
1f710495
KW
2054 if (num_sectors != 0) {
2055 local_progress = (float)100 /
2056 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2057 }
2058
3e85c6fd
KW
2059 for (sector = 0; sector < num_sectors; sector += n) {
2060
2061 /* How many sectors can we handle with the next read? */
2062 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2063 n = (IO_BUF_SIZE / 512);
2064 } else {
2065 n = num_sectors - sector;
2066 }
2067
2068 /* If the cluster is allocated, we don't need to take action */
cc60e327
KW
2069 ret = bdrv_is_allocated(bs, sector, n, &n);
2070 if (ret) {
3e85c6fd
KW
2071 continue;
2072 }
2073
87a1b3e3
KW
2074 /*
2075 * Read old and new backing file and take into consideration that
2076 * backing files may be smaller than the COW image.
2077 */
2078 if (sector >= old_backing_num_sectors) {
2079 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2080 } else {
2081 if (sector + n > old_backing_num_sectors) {
2082 n = old_backing_num_sectors - sector;
2083 }
2084
2085 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
2086 if (ret < 0) {
2087 error_report("error while reading from old backing file");
2088 goto out;
2089 }
3e85c6fd 2090 }
87a1b3e3 2091
a616673d 2092 if (sector >= new_backing_num_sectors || !bs_new_backing) {
87a1b3e3
KW
2093 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2094 } else {
2095 if (sector + n > new_backing_num_sectors) {
2096 n = new_backing_num_sectors - sector;
2097 }
2098
2099 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
2100 if (ret < 0) {
2101 error_report("error while reading from new backing file");
2102 goto out;
2103 }
3e85c6fd
KW
2104 }
2105
2106 /* If they differ, we need to write to the COW file */
2107 uint64_t written = 0;
2108
2109 while (written < n) {
2110 int pnum;
2111
2112 if (compare_sectors(buf_old + written * 512,
60b1bd4f 2113 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
2114 {
2115 ret = bdrv_write(bs, sector + written,
2116 buf_old + written * 512, pnum);
2117 if (ret < 0) {
15654a6d 2118 error_report("Error while writing to COW image: %s",
3e85c6fd 2119 strerror(-ret));
c2abccec 2120 goto out;
3e85c6fd
KW
2121 }
2122 }
2123
2124 written += pnum;
2125 }
6b837bc4 2126 qemu_progress_print(local_progress, 100);
3e85c6fd 2127 }
d6771bfa 2128
bb1c0597
KW
2129 qemu_vfree(buf_old);
2130 qemu_vfree(buf_new);
3e85c6fd
KW
2131 }
2132
2133 /*
2134 * Change the backing file. All clusters that are different from the old
2135 * backing file are overwritten in the COW file now, so the visible content
2136 * doesn't change when we switch the backing file.
2137 */
a616673d
AB
2138 if (out_baseimg && *out_baseimg) {
2139 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2140 } else {
2141 ret = bdrv_change_backing_file(bs, NULL, NULL);
2142 }
2143
3e85c6fd 2144 if (ret == -ENOSPC) {
15654a6d
JS
2145 error_report("Could not change the backing file to '%s': No "
2146 "space left in the file header", out_baseimg);
3e85c6fd 2147 } else if (ret < 0) {
15654a6d 2148 error_report("Could not change the backing file to '%s': %s",
3e85c6fd
KW
2149 out_baseimg, strerror(-ret));
2150 }
2151
6b837bc4 2152 qemu_progress_print(100, 0);
3e85c6fd
KW
2153 /*
2154 * TODO At this point it is possible to check if any clusters that are
2155 * allocated in the COW file are the same in the backing file. If so, they
2156 * could be dropped from the COW file. Don't do this before switching the
2157 * backing file, in case of a crash this would lead to corruption.
2158 */
c2abccec 2159out:
6b837bc4 2160 qemu_progress_end();
3e85c6fd
KW
2161 /* Cleanup */
2162 if (!unsafe) {
eb863add
KW
2163 if (bs_old_backing != NULL) {
2164 bdrv_delete(bs_old_backing);
2165 }
2166 if (bs_new_backing != NULL) {
2167 bdrv_delete(bs_new_backing);
2168 }
3e85c6fd
KW
2169 }
2170
2171 bdrv_delete(bs);
c2abccec
MK
2172 if (ret) {
2173 return 1;
2174 }
3e85c6fd
KW
2175 return 0;
2176}
2177
ae6b0ed6
SH
2178static int img_resize(int argc, char **argv)
2179{
2180 int c, ret, relative;
2181 const char *filename, *fmt, *size;
2182 int64_t n, total_size;
f382d43a 2183 bool quiet = false;
2a81998a 2184 BlockDriverState *bs = NULL;
20caf0f7
DXW
2185 QemuOpts *param;
2186 static QemuOptsList resize_options = {
2187 .name = "resize_options",
2188 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2189 .desc = {
2190 {
2191 .name = BLOCK_OPT_SIZE,
2192 .type = QEMU_OPT_SIZE,
2193 .help = "Virtual disk size"
2194 }, {
2195 /* end of list */
2196 }
ae6b0ed6 2197 },
ae6b0ed6
SH
2198 };
2199
e80fec7f
KW
2200 /* Remove size from argv manually so that negative numbers are not treated
2201 * as options by getopt. */
2202 if (argc < 3) {
2203 help();
2204 return 1;
2205 }
2206
2207 size = argv[--argc];
2208
2209 /* Parse getopt arguments */
ae6b0ed6
SH
2210 fmt = NULL;
2211 for(;;) {
f382d43a 2212 c = getopt(argc, argv, "f:hq");
ae6b0ed6
SH
2213 if (c == -1) {
2214 break;
2215 }
2216 switch(c) {
ef87394c 2217 case '?':
ae6b0ed6
SH
2218 case 'h':
2219 help();
2220 break;
2221 case 'f':
2222 fmt = optarg;
2223 break;
f382d43a
MR
2224 case 'q':
2225 quiet = true;
2226 break;
ae6b0ed6
SH
2227 }
2228 }
e80fec7f 2229 if (optind >= argc) {
ae6b0ed6
SH
2230 help();
2231 }
2232 filename = argv[optind++];
ae6b0ed6
SH
2233
2234 /* Choose grow, shrink, or absolute resize mode */
2235 switch (size[0]) {
2236 case '+':
2237 relative = 1;
2238 size++;
2239 break;
2240 case '-':
2241 relative = -1;
2242 size++;
2243 break;
2244 default:
2245 relative = 0;
2246 break;
2247 }
2248
2249 /* Parse size */
e478b448 2250 param = qemu_opts_create_nofail(&resize_options);
20caf0f7 2251 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
ae6b0ed6 2252 /* Error message already printed when size parsing fails */
2a81998a 2253 ret = -1;
20caf0f7 2254 qemu_opts_del(param);
2a81998a 2255 goto out;
ae6b0ed6 2256 }
20caf0f7
DXW
2257 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2258 qemu_opts_del(param);
ae6b0ed6 2259
f382d43a 2260 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
c2abccec 2261 if (!bs) {
2a81998a
JS
2262 ret = -1;
2263 goto out;
c2abccec 2264 }
ae6b0ed6
SH
2265
2266 if (relative) {
2267 total_size = bdrv_getlength(bs) + n * relative;
2268 } else {
2269 total_size = n;
2270 }
2271 if (total_size <= 0) {
15654a6d 2272 error_report("New image size must be positive");
c2abccec
MK
2273 ret = -1;
2274 goto out;
ae6b0ed6
SH
2275 }
2276
2277 ret = bdrv_truncate(bs, total_size);
2278 switch (ret) {
2279 case 0:
f382d43a 2280 qprintf(quiet, "Image resized.\n");
ae6b0ed6
SH
2281 break;
2282 case -ENOTSUP:
259b2173 2283 error_report("This image does not support resize");
ae6b0ed6
SH
2284 break;
2285 case -EACCES:
15654a6d 2286 error_report("Image is read-only");
ae6b0ed6
SH
2287 break;
2288 default:
15654a6d 2289 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
2290 break;
2291 }
c2abccec 2292out:
2a81998a
JS
2293 if (bs) {
2294 bdrv_delete(bs);
2295 }
c2abccec
MK
2296 if (ret) {
2297 return 1;
2298 }
ae6b0ed6
SH
2299 return 0;
2300}
2301
c227f099 2302static const img_cmd_t img_cmds[] = {
153859be
SB
2303#define DEF(option, callback, arg_string) \
2304 { option, callback },
2305#include "qemu-img-cmds.h"
2306#undef DEF
2307#undef GEN_DOCS
2308 { NULL, NULL, },
2309};
2310
ea2384d3
FB
2311int main(int argc, char **argv)
2312{
c227f099 2313 const img_cmd_t *cmd;
153859be 2314 const char *cmdname;
ea2384d3 2315
53f76e58
KW
2316 error_set_progname(argv[0]);
2317
2592c59a 2318 qemu_init_main_loop();
ea2384d3
FB
2319 bdrv_init();
2320 if (argc < 2)
2321 help();
153859be 2322 cmdname = argv[1];
8f9b157e 2323 argc--; argv++;
153859be
SB
2324
2325 /* find the command */
2326 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2327 if (!strcmp(cmdname, cmd->name)) {
2328 return cmd->handler(argc, argv);
2329 }
ea2384d3 2330 }
153859be
SB
2331
2332 /* not found */
2333 help();
ea2384d3
FB
2334 return 0;
2335}