1 /* 2 * QEMU disk image utility 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * 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 */ 24 25 #include "qemu/osdep.h" 26 #include <getopt.h> 27 28 #include "qemu-common.h" 29 #include "qemu-version.h" 30 #include "qapi/error.h" 31 #include "qapi/qapi-commands-block-core.h" 32 #include "qapi/qapi-visit-block-core.h" 33 #include "qapi/qobject-output-visitor.h" 34 #include "qapi/qmp/qjson.h" 35 #include "qapi/qmp/qdict.h" 36 #include "qemu/cutils.h" 37 #include "qemu/config-file.h" 38 #include "qemu/option.h" 39 #include "qemu/error-report.h" 40 #include "qemu/log.h" 41 #include "qemu/main-loop.h" 42 #include "qemu/module.h" 43 #include "qemu/sockets.h" 44 #include "qemu/units.h" 45 #include "qom/object_interfaces.h" 46 #include "sysemu/block-backend.h" 47 #include "block/block_int.h" 48 #include "block/blockjob.h" 49 #include "block/qapi.h" 50 #include "crypto/init.h" 51 #include "trace/control.h" 52 #include "qemu/throttle.h" 53 #include "block/throttle-groups.h" 54 55 #define QEMU_IMG_VERSION "qemu-img version " QEMU_FULL_VERSION \ 56 "\n" QEMU_COPYRIGHT "\n" 57 58 typedef struct img_cmd_t { 59 const char *name; 60 int (*handler)(int argc, char **argv); 61 } img_cmd_t; 62 63 enum { 64 OPTION_OUTPUT = 256, 65 OPTION_BACKING_CHAIN = 257, 66 OPTION_OBJECT = 258, 67 OPTION_IMAGE_OPTS = 259, 68 OPTION_PATTERN = 260, 69 OPTION_FLUSH_INTERVAL = 261, 70 OPTION_NO_DRAIN = 262, 71 OPTION_TARGET_IMAGE_OPTS = 263, 72 OPTION_SIZE = 264, 73 OPTION_PREALLOCATION = 265, 74 OPTION_SHRINK = 266, 75 OPTION_SALVAGE = 267, 76 OPTION_TARGET_IS_ZERO = 268, 77 OPTION_ADD = 269, 78 OPTION_REMOVE = 270, 79 OPTION_CLEAR = 271, 80 OPTION_ENABLE = 272, 81 OPTION_DISABLE = 273, 82 OPTION_MERGE = 274, 83 OPTION_BITMAPS = 275, 84 OPTION_FORCE = 276, 85 }; 86 87 typedef enum OutputFormat { 88 OFORMAT_JSON, 89 OFORMAT_HUMAN, 90 } OutputFormat; 91 92 /* Default to cache=writeback as data integrity is not important for qemu-img */ 93 #define BDRV_DEFAULT_CACHE "writeback" 94 95 static void format_print(void *opaque, const char *name) 96 { 97 printf(" %s", name); 98 } 99 100 static void QEMU_NORETURN GCC_FMT_ATTR(1, 2) error_exit(const char *fmt, ...) 101 { 102 va_list ap; 103 104 va_start(ap, fmt); 105 error_vreport(fmt, ap); 106 va_end(ap); 107 108 error_printf("Try 'qemu-img --help' for more information\n"); 109 exit(EXIT_FAILURE); 110 } 111 112 static void QEMU_NORETURN missing_argument(const char *option) 113 { 114 error_exit("missing argument for option '%s'", option); 115 } 116 117 static void QEMU_NORETURN unrecognized_option(const char *option) 118 { 119 error_exit("unrecognized option '%s'", option); 120 } 121 122 /* Please keep in synch with docs/tools/qemu-img.rst */ 123 static void QEMU_NORETURN help(void) 124 { 125 const char *help_msg = 126 QEMU_IMG_VERSION 127 "usage: qemu-img [standard options] command [command options]\n" 128 "QEMU disk image utility\n" 129 "\n" 130 " '-h', '--help' display this help and exit\n" 131 " '-V', '--version' output version information and exit\n" 132 " '-T', '--trace' [[enable=]<pattern>][,events=<file>][,file=<file>]\n" 133 " specify tracing options\n" 134 "\n" 135 "Command syntax:\n" 136 #define DEF(option, callback, arg_string) \ 137 " " arg_string "\n" 138 #include "qemu-img-cmds.h" 139 #undef DEF 140 "\n" 141 "Command parameters:\n" 142 " 'filename' is a disk image filename\n" 143 " 'objectdef' is a QEMU user creatable object definition. See the qemu(1)\n" 144 " manual page for a description of the object properties. The most common\n" 145 " object type is a 'secret', which is used to supply passwords and/or\n" 146 " encryption keys.\n" 147 " 'fmt' is the disk image format. It is guessed automatically in most cases\n" 148 " 'cache' is the cache mode used to write the output disk image, the valid\n" 149 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n" 150 " 'directsync' and 'unsafe' (default for convert)\n" 151 " 'src_cache' is the cache mode used to read input disk images, the valid\n" 152 " options are the same as for the 'cache' option\n" 153 " 'size' is the disk image size in bytes. Optional suffixes\n" 154 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n" 155 " 'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P) are\n" 156 " supported. 'b' is ignored.\n" 157 " 'output_filename' is the destination disk image filename\n" 158 " 'output_fmt' is the destination format\n" 159 " 'options' is a comma separated list of format specific options in a\n" 160 " name=value format. Use -o ? for an overview of the options supported by the\n" 161 " used format\n" 162 " 'snapshot_param' is param used for internal snapshot, format\n" 163 " is 'snapshot.id=[ID],snapshot.name=[NAME]', or\n" 164 " '[ID_OR_NAME]'\n" 165 " '-c' indicates that target image must be compressed (qcow format only)\n" 166 " '-u' allows unsafe backing chains. For rebasing, it is assumed that old and\n" 167 " new backing file match exactly. The image doesn't need a working\n" 168 " backing file before rebasing in this case (useful for renaming the\n" 169 " backing file). For image creation, allow creating without attempting\n" 170 " to open the backing file.\n" 171 " '-h' with or without a command shows this help and lists the supported formats\n" 172 " '-p' show progress of command (only certain commands)\n" 173 " '-q' use Quiet mode - do not print any output (except errors)\n" 174 " '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n" 175 " contain only zeros for qemu-img to create a sparse image during\n" 176 " conversion. If the number of bytes is 0, the source will not be scanned for\n" 177 " unallocated or zero sectors, and the destination image will always be\n" 178 " fully allocated\n" 179 " '--output' takes the format in which the output must be done (human or json)\n" 180 " '-n' skips the target volume creation (useful if the volume is created\n" 181 " prior to running qemu-img)\n" 182 "\n" 183 "Parameters to bitmap subcommand:\n" 184 " 'bitmap' is the name of the bitmap to manipulate, through one or more\n" 185 " actions from '--add', '--remove', '--clear', '--enable', '--disable',\n" 186 " or '--merge source'\n" 187 " '-g granularity' sets the granularity for '--add' actions\n" 188 " '-b source' and '-F src_fmt' tell '--merge' actions to find the source\n" 189 " bitmaps from an alternative file\n" 190 "\n" 191 "Parameters to check subcommand:\n" 192 " '-r' tries to repair any inconsistencies that are found during the check.\n" 193 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n" 194 " kinds of errors, with a higher risk of choosing the wrong fix or\n" 195 " hiding corruption that has already occurred.\n" 196 "\n" 197 "Parameters to convert subcommand:\n" 198 " '--bitmaps' copies all top-level persistent bitmaps to destination\n" 199 " '-m' specifies how many coroutines work in parallel during the convert\n" 200 " process (defaults to 8)\n" 201 " '-W' allow to write to the target out of order rather than sequential\n" 202 "\n" 203 "Parameters to snapshot subcommand:\n" 204 " 'snapshot' is the name of the snapshot to create, apply or delete\n" 205 " '-a' applies a snapshot (revert disk to saved state)\n" 206 " '-c' creates a snapshot\n" 207 " '-d' deletes a snapshot\n" 208 " '-l' lists all snapshots in the given image\n" 209 "\n" 210 "Parameters to compare subcommand:\n" 211 " '-f' first image format\n" 212 " '-F' second image format\n" 213 " '-s' run in Strict mode - fail on different image size or sector allocation\n" 214 "\n" 215 "Parameters to dd subcommand:\n" 216 " 'bs=BYTES' read and write up to BYTES bytes at a time " 217 "(default: 512)\n" 218 " 'count=N' copy only N input blocks\n" 219 " 'if=FILE' read from FILE\n" 220 " 'of=FILE' write to FILE\n" 221 " 'skip=N' skip N bs-sized blocks at the start of input\n"; 222 223 printf("%s\nSupported formats:", help_msg); 224 bdrv_iterate_format(format_print, NULL, false); 225 printf("\n\n" QEMU_HELP_BOTTOM "\n"); 226 exit(EXIT_SUCCESS); 227 } 228 229 /* 230 * Is @optarg safe for accumulate_options()? 231 * It is when multiple of them can be joined together separated by ','. 232 * To make that work, @optarg must not start with ',' (or else a 233 * separating ',' preceding it gets escaped), and it must not end with 234 * an odd number of ',' (or else a separating ',' following it gets 235 * escaped), or be empty (or else a separating ',' preceding it can 236 * escape a separating ',' following it). 237 * 238 */ 239 static bool is_valid_option_list(const char *optarg) 240 { 241 size_t len = strlen(optarg); 242 size_t i; 243 244 if (!optarg[0] || optarg[0] == ',') { 245 return false; 246 } 247 248 for (i = len; i > 0 && optarg[i - 1] == ','; i--) { 249 } 250 if ((len - i) % 2) { 251 return false; 252 } 253 254 return true; 255 } 256 257 static int accumulate_options(char **options, char *optarg) 258 { 259 char *new_options; 260 261 if (!is_valid_option_list(optarg)) { 262 error_report("Invalid option list: %s", optarg); 263 return -1; 264 } 265 266 if (!*options) { 267 *options = g_strdup(optarg); 268 } else { 269 new_options = g_strdup_printf("%s,%s", *options, optarg); 270 g_free(*options); 271 *options = new_options; 272 } 273 return 0; 274 } 275 276 static QemuOptsList qemu_source_opts = { 277 .name = "source", 278 .implied_opt_name = "file", 279 .head = QTAILQ_HEAD_INITIALIZER(qemu_source_opts.head), 280 .desc = { 281 { } 282 }, 283 }; 284 285 static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...) 286 { 287 int ret = 0; 288 if (!quiet) { 289 va_list args; 290 va_start(args, fmt); 291 ret = vprintf(fmt, args); 292 va_end(args); 293 } 294 return ret; 295 } 296 297 298 static int print_block_option_help(const char *filename, const char *fmt) 299 { 300 BlockDriver *drv, *proto_drv; 301 QemuOptsList *create_opts = NULL; 302 Error *local_err = NULL; 303 304 /* Find driver and parse its options */ 305 drv = bdrv_find_format(fmt); 306 if (!drv) { 307 error_report("Unknown file format '%s'", fmt); 308 return 1; 309 } 310 311 if (!drv->create_opts) { 312 error_report("Format driver '%s' does not support image creation", fmt); 313 return 1; 314 } 315 316 create_opts = qemu_opts_append(create_opts, drv->create_opts); 317 if (filename) { 318 proto_drv = bdrv_find_protocol(filename, true, &local_err); 319 if (!proto_drv) { 320 error_report_err(local_err); 321 qemu_opts_free(create_opts); 322 return 1; 323 } 324 if (!proto_drv->create_opts) { 325 error_report("Protocol driver '%s' does not support image creation", 326 proto_drv->format_name); 327 qemu_opts_free(create_opts); 328 return 1; 329 } 330 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts); 331 } 332 333 if (filename) { 334 printf("Supported options:\n"); 335 } else { 336 printf("Supported %s options:\n", fmt); 337 } 338 qemu_opts_print_help(create_opts, false); 339 qemu_opts_free(create_opts); 340 341 if (!filename) { 342 printf("\n" 343 "The protocol level may support further options.\n" 344 "Specify the target filename to include those options.\n"); 345 } 346 347 return 0; 348 } 349 350 351 static BlockBackend *img_open_opts(const char *optstr, 352 QemuOpts *opts, int flags, bool writethrough, 353 bool quiet, bool force_share) 354 { 355 QDict *options; 356 Error *local_err = NULL; 357 BlockBackend *blk; 358 options = qemu_opts_to_qdict(opts, NULL); 359 if (force_share) { 360 if (qdict_haskey(options, BDRV_OPT_FORCE_SHARE) 361 && strcmp(qdict_get_str(options, BDRV_OPT_FORCE_SHARE), "on")) { 362 error_report("--force-share/-U conflicts with image options"); 363 qobject_unref(options); 364 return NULL; 365 } 366 qdict_put_str(options, BDRV_OPT_FORCE_SHARE, "on"); 367 } 368 blk = blk_new_open(NULL, NULL, options, flags, &local_err); 369 if (!blk) { 370 error_reportf_err(local_err, "Could not open '%s': ", optstr); 371 return NULL; 372 } 373 blk_set_enable_write_cache(blk, !writethrough); 374 375 return blk; 376 } 377 378 static BlockBackend *img_open_file(const char *filename, 379 QDict *options, 380 const char *fmt, int flags, 381 bool writethrough, bool quiet, 382 bool force_share) 383 { 384 BlockBackend *blk; 385 Error *local_err = NULL; 386 387 if (!options) { 388 options = qdict_new(); 389 } 390 if (fmt) { 391 qdict_put_str(options, "driver", fmt); 392 } 393 394 if (force_share) { 395 qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true); 396 } 397 blk = blk_new_open(filename, NULL, options, flags, &local_err); 398 if (!blk) { 399 error_reportf_err(local_err, "Could not open '%s': ", filename); 400 return NULL; 401 } 402 blk_set_enable_write_cache(blk, !writethrough); 403 404 return blk; 405 } 406 407 408 static int img_add_key_secrets(void *opaque, 409 const char *name, const char *value, 410 Error **errp) 411 { 412 QDict *options = opaque; 413 414 if (g_str_has_suffix(name, "key-secret")) { 415 qdict_put_str(options, name, value); 416 } 417 418 return 0; 419 } 420 421 422 static BlockBackend *img_open(bool image_opts, 423 const char *filename, 424 const char *fmt, int flags, bool writethrough, 425 bool quiet, bool force_share) 426 { 427 BlockBackend *blk; 428 if (image_opts) { 429 QemuOpts *opts; 430 if (fmt) { 431 error_report("--image-opts and --format are mutually exclusive"); 432 return NULL; 433 } 434 opts = qemu_opts_parse_noisily(qemu_find_opts("source"), 435 filename, true); 436 if (!opts) { 437 return NULL; 438 } 439 blk = img_open_opts(filename, opts, flags, writethrough, quiet, 440 force_share); 441 } else { 442 blk = img_open_file(filename, NULL, fmt, flags, writethrough, quiet, 443 force_share); 444 } 445 return blk; 446 } 447 448 449 static int add_old_style_options(const char *fmt, QemuOpts *opts, 450 const char *base_filename, 451 const char *base_fmt) 452 { 453 if (base_filename) { 454 if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, 455 NULL)) { 456 error_report("Backing file not supported for file format '%s'", 457 fmt); 458 return -1; 459 } 460 } 461 if (base_fmt) { 462 if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) { 463 error_report("Backing file format not supported for file " 464 "format '%s'", fmt); 465 return -1; 466 } 467 } 468 return 0; 469 } 470 471 static int64_t cvtnum_full(const char *name, const char *value, int64_t min, 472 int64_t max) 473 { 474 int err; 475 uint64_t res; 476 477 err = qemu_strtosz(value, NULL, &res); 478 if (err < 0 && err != -ERANGE) { 479 error_report("Invalid %s specified. You may use " 480 "k, M, G, T, P or E suffixes for", name); 481 error_report("kilobytes, megabytes, gigabytes, terabytes, " 482 "petabytes and exabytes."); 483 return err; 484 } 485 if (err == -ERANGE || res > max || res < min) { 486 error_report("Invalid %s specified. Must be between %" PRId64 487 " and %" PRId64 ".", name, min, max); 488 return -ERANGE; 489 } 490 return res; 491 } 492 493 static int64_t cvtnum(const char *name, const char *value) 494 { 495 return cvtnum_full(name, value, 0, INT64_MAX); 496 } 497 498 static int img_create(int argc, char **argv) 499 { 500 int c; 501 uint64_t img_size = -1; 502 const char *fmt = "raw"; 503 const char *base_fmt = NULL; 504 const char *filename; 505 const char *base_filename = NULL; 506 char *options = NULL; 507 Error *local_err = NULL; 508 bool quiet = false; 509 int flags = 0; 510 511 for(;;) { 512 static const struct option long_options[] = { 513 {"help", no_argument, 0, 'h'}, 514 {"object", required_argument, 0, OPTION_OBJECT}, 515 {0, 0, 0, 0} 516 }; 517 c = getopt_long(argc, argv, ":F:b:f:ho:qu", 518 long_options, NULL); 519 if (c == -1) { 520 break; 521 } 522 switch(c) { 523 case ':': 524 missing_argument(argv[optind - 1]); 525 break; 526 case '?': 527 unrecognized_option(argv[optind - 1]); 528 break; 529 case 'h': 530 help(); 531 break; 532 case 'F': 533 base_fmt = optarg; 534 break; 535 case 'b': 536 base_filename = optarg; 537 break; 538 case 'f': 539 fmt = optarg; 540 break; 541 case 'o': 542 if (accumulate_options(&options, optarg) < 0) { 543 goto fail; 544 } 545 break; 546 case 'q': 547 quiet = true; 548 break; 549 case 'u': 550 flags |= BDRV_O_NO_BACKING; 551 break; 552 case OPTION_OBJECT: 553 user_creatable_process_cmdline(optarg); 554 break; 555 } 556 } 557 558 /* Get the filename */ 559 filename = (optind < argc) ? argv[optind] : NULL; 560 if (options && has_help_option(options)) { 561 g_free(options); 562 return print_block_option_help(filename, fmt); 563 } 564 565 if (optind >= argc) { 566 error_exit("Expecting image file name"); 567 } 568 optind++; 569 570 /* Get image size, if specified */ 571 if (optind < argc) { 572 int64_t sval; 573 574 sval = cvtnum("image size", argv[optind++]); 575 if (sval < 0) { 576 goto fail; 577 } 578 img_size = (uint64_t)sval; 579 } 580 if (optind != argc) { 581 error_exit("Unexpected argument: %s", argv[optind]); 582 } 583 584 bdrv_img_create(filename, fmt, base_filename, base_fmt, 585 options, img_size, flags, quiet, &local_err); 586 if (local_err) { 587 error_reportf_err(local_err, "%s: ", filename); 588 goto fail; 589 } 590 591 g_free(options); 592 return 0; 593 594 fail: 595 g_free(options); 596 return 1; 597 } 598 599 static void dump_json_image_check(ImageCheck *check, bool quiet) 600 { 601 GString *str; 602 QObject *obj; 603 Visitor *v = qobject_output_visitor_new(&obj); 604 605 visit_type_ImageCheck(v, NULL, &check, &error_abort); 606 visit_complete(v, &obj); 607 str = qobject_to_json_pretty(obj, true); 608 assert(str != NULL); 609 qprintf(quiet, "%s\n", str->str); 610 qobject_unref(obj); 611 visit_free(v); 612 g_string_free(str, true); 613 } 614 615 static void dump_human_image_check(ImageCheck *check, bool quiet) 616 { 617 if (!(check->corruptions || check->leaks || check->check_errors)) { 618 qprintf(quiet, "No errors were found on the image.\n"); 619 } else { 620 if (check->corruptions) { 621 qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n" 622 "Data may be corrupted, or further writes to the image " 623 "may corrupt it.\n", 624 check->corruptions); 625 } 626 627 if (check->leaks) { 628 qprintf(quiet, 629 "\n%" PRId64 " leaked clusters were found on the image.\n" 630 "This means waste of disk space, but no harm to data.\n", 631 check->leaks); 632 } 633 634 if (check->check_errors) { 635 qprintf(quiet, 636 "\n%" PRId64 637 " internal errors have occurred during the check.\n", 638 check->check_errors); 639 } 640 } 641 642 if (check->total_clusters != 0 && check->allocated_clusters != 0) { 643 qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, " 644 "%0.2f%% fragmented, %0.2f%% compressed clusters\n", 645 check->allocated_clusters, check->total_clusters, 646 check->allocated_clusters * 100.0 / check->total_clusters, 647 check->fragmented_clusters * 100.0 / check->allocated_clusters, 648 check->compressed_clusters * 100.0 / 649 check->allocated_clusters); 650 } 651 652 if (check->image_end_offset) { 653 qprintf(quiet, 654 "Image end offset: %" PRId64 "\n", check->image_end_offset); 655 } 656 } 657 658 static int collect_image_check(BlockDriverState *bs, 659 ImageCheck *check, 660 const char *filename, 661 const char *fmt, 662 int fix) 663 { 664 int ret; 665 BdrvCheckResult result; 666 667 ret = bdrv_check(bs, &result, fix); 668 if (ret < 0) { 669 return ret; 670 } 671 672 check->filename = g_strdup(filename); 673 check->format = g_strdup(bdrv_get_format_name(bs)); 674 check->check_errors = result.check_errors; 675 check->corruptions = result.corruptions; 676 check->has_corruptions = result.corruptions != 0; 677 check->leaks = result.leaks; 678 check->has_leaks = result.leaks != 0; 679 check->corruptions_fixed = result.corruptions_fixed; 680 check->has_corruptions_fixed = result.corruptions_fixed != 0; 681 check->leaks_fixed = result.leaks_fixed; 682 check->has_leaks_fixed = result.leaks_fixed != 0; 683 check->image_end_offset = result.image_end_offset; 684 check->has_image_end_offset = result.image_end_offset != 0; 685 check->total_clusters = result.bfi.total_clusters; 686 check->has_total_clusters = result.bfi.total_clusters != 0; 687 check->allocated_clusters = result.bfi.allocated_clusters; 688 check->has_allocated_clusters = result.bfi.allocated_clusters != 0; 689 check->fragmented_clusters = result.bfi.fragmented_clusters; 690 check->has_fragmented_clusters = result.bfi.fragmented_clusters != 0; 691 check->compressed_clusters = result.bfi.compressed_clusters; 692 check->has_compressed_clusters = result.bfi.compressed_clusters != 0; 693 694 return 0; 695 } 696 697 /* 698 * Checks an image for consistency. Exit codes: 699 * 700 * 0 - Check completed, image is good 701 * 1 - Check not completed because of internal errors 702 * 2 - Check completed, image is corrupted 703 * 3 - Check completed, image has leaked clusters, but is good otherwise 704 * 63 - Checks are not supported by the image format 705 */ 706 static int img_check(int argc, char **argv) 707 { 708 int c, ret; 709 OutputFormat output_format = OFORMAT_HUMAN; 710 const char *filename, *fmt, *output, *cache; 711 BlockBackend *blk; 712 BlockDriverState *bs; 713 int fix = 0; 714 int flags = BDRV_O_CHECK; 715 bool writethrough; 716 ImageCheck *check; 717 bool quiet = false; 718 bool image_opts = false; 719 bool force_share = false; 720 721 fmt = NULL; 722 output = NULL; 723 cache = BDRV_DEFAULT_CACHE; 724 725 for(;;) { 726 int option_index = 0; 727 static const struct option long_options[] = { 728 {"help", no_argument, 0, 'h'}, 729 {"format", required_argument, 0, 'f'}, 730 {"repair", required_argument, 0, 'r'}, 731 {"output", required_argument, 0, OPTION_OUTPUT}, 732 {"object", required_argument, 0, OPTION_OBJECT}, 733 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 734 {"force-share", no_argument, 0, 'U'}, 735 {0, 0, 0, 0} 736 }; 737 c = getopt_long(argc, argv, ":hf:r:T:qU", 738 long_options, &option_index); 739 if (c == -1) { 740 break; 741 } 742 switch(c) { 743 case ':': 744 missing_argument(argv[optind - 1]); 745 break; 746 case '?': 747 unrecognized_option(argv[optind - 1]); 748 break; 749 case 'h': 750 help(); 751 break; 752 case 'f': 753 fmt = optarg; 754 break; 755 case 'r': 756 flags |= BDRV_O_RDWR; 757 758 if (!strcmp(optarg, "leaks")) { 759 fix = BDRV_FIX_LEAKS; 760 } else if (!strcmp(optarg, "all")) { 761 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS; 762 } else { 763 error_exit("Unknown option value for -r " 764 "(expecting 'leaks' or 'all'): %s", optarg); 765 } 766 break; 767 case OPTION_OUTPUT: 768 output = optarg; 769 break; 770 case 'T': 771 cache = optarg; 772 break; 773 case 'q': 774 quiet = true; 775 break; 776 case 'U': 777 force_share = true; 778 break; 779 case OPTION_OBJECT: 780 user_creatable_process_cmdline(optarg); 781 break; 782 case OPTION_IMAGE_OPTS: 783 image_opts = true; 784 break; 785 } 786 } 787 if (optind != argc - 1) { 788 error_exit("Expecting one image file name"); 789 } 790 filename = argv[optind++]; 791 792 if (output && !strcmp(output, "json")) { 793 output_format = OFORMAT_JSON; 794 } else if (output && !strcmp(output, "human")) { 795 output_format = OFORMAT_HUMAN; 796 } else if (output) { 797 error_report("--output must be used with human or json as argument."); 798 return 1; 799 } 800 801 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 802 if (ret < 0) { 803 error_report("Invalid source cache option: %s", cache); 804 return 1; 805 } 806 807 blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet, 808 force_share); 809 if (!blk) { 810 return 1; 811 } 812 bs = blk_bs(blk); 813 814 check = g_new0(ImageCheck, 1); 815 ret = collect_image_check(bs, check, filename, fmt, fix); 816 817 if (ret == -ENOTSUP) { 818 error_report("This image format does not support checks"); 819 ret = 63; 820 goto fail; 821 } 822 823 if (check->corruptions_fixed || check->leaks_fixed) { 824 int corruptions_fixed, leaks_fixed; 825 bool has_leaks_fixed, has_corruptions_fixed; 826 827 leaks_fixed = check->leaks_fixed; 828 has_leaks_fixed = check->has_leaks_fixed; 829 corruptions_fixed = check->corruptions_fixed; 830 has_corruptions_fixed = check->has_corruptions_fixed; 831 832 if (output_format == OFORMAT_HUMAN) { 833 qprintf(quiet, 834 "The following inconsistencies were found and repaired:\n\n" 835 " %" PRId64 " leaked clusters\n" 836 " %" PRId64 " corruptions\n\n" 837 "Double checking the fixed image now...\n", 838 check->leaks_fixed, 839 check->corruptions_fixed); 840 } 841 842 qapi_free_ImageCheck(check); 843 check = g_new0(ImageCheck, 1); 844 ret = collect_image_check(bs, check, filename, fmt, 0); 845 846 check->leaks_fixed = leaks_fixed; 847 check->has_leaks_fixed = has_leaks_fixed; 848 check->corruptions_fixed = corruptions_fixed; 849 check->has_corruptions_fixed = has_corruptions_fixed; 850 } 851 852 if (!ret) { 853 switch (output_format) { 854 case OFORMAT_HUMAN: 855 dump_human_image_check(check, quiet); 856 break; 857 case OFORMAT_JSON: 858 dump_json_image_check(check, quiet); 859 break; 860 } 861 } 862 863 if (ret || check->check_errors) { 864 if (ret) { 865 error_report("Check failed: %s", strerror(-ret)); 866 } else { 867 error_report("Check failed"); 868 } 869 ret = 1; 870 goto fail; 871 } 872 873 if (check->corruptions) { 874 ret = 2; 875 } else if (check->leaks) { 876 ret = 3; 877 } else { 878 ret = 0; 879 } 880 881 fail: 882 qapi_free_ImageCheck(check); 883 blk_unref(blk); 884 return ret; 885 } 886 887 typedef struct CommonBlockJobCBInfo { 888 BlockDriverState *bs; 889 Error **errp; 890 } CommonBlockJobCBInfo; 891 892 static void common_block_job_cb(void *opaque, int ret) 893 { 894 CommonBlockJobCBInfo *cbi = opaque; 895 896 if (ret < 0) { 897 error_setg_errno(cbi->errp, -ret, "Block job failed"); 898 } 899 } 900 901 static void run_block_job(BlockJob *job, Error **errp) 902 { 903 AioContext *aio_context = blk_get_aio_context(job->blk); 904 int ret = 0; 905 906 aio_context_acquire(aio_context); 907 job_ref(&job->job); 908 do { 909 float progress = 0.0f; 910 aio_poll(aio_context, true); 911 if (job->job.progress.total) { 912 progress = (float)job->job.progress.current / 913 job->job.progress.total * 100.f; 914 } 915 qemu_progress_print(progress, 0); 916 } while (!job_is_ready(&job->job) && !job_is_completed(&job->job)); 917 918 if (!job_is_completed(&job->job)) { 919 ret = job_complete_sync(&job->job, errp); 920 } else { 921 ret = job->job.ret; 922 } 923 job_unref(&job->job); 924 aio_context_release(aio_context); 925 926 /* publish completion progress only when success */ 927 if (!ret) { 928 qemu_progress_print(100.f, 0); 929 } 930 } 931 932 static int img_commit(int argc, char **argv) 933 { 934 int c, ret, flags; 935 const char *filename, *fmt, *cache, *base; 936 BlockBackend *blk; 937 BlockDriverState *bs, *base_bs; 938 BlockJob *job; 939 bool progress = false, quiet = false, drop = false; 940 bool writethrough; 941 Error *local_err = NULL; 942 CommonBlockJobCBInfo cbi; 943 bool image_opts = false; 944 AioContext *aio_context; 945 int64_t rate_limit = 0; 946 947 fmt = NULL; 948 cache = BDRV_DEFAULT_CACHE; 949 base = NULL; 950 for(;;) { 951 static const struct option long_options[] = { 952 {"help", no_argument, 0, 'h'}, 953 {"object", required_argument, 0, OPTION_OBJECT}, 954 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 955 {0, 0, 0, 0} 956 }; 957 c = getopt_long(argc, argv, ":f:ht:b:dpqr:", 958 long_options, NULL); 959 if (c == -1) { 960 break; 961 } 962 switch(c) { 963 case ':': 964 missing_argument(argv[optind - 1]); 965 break; 966 case '?': 967 unrecognized_option(argv[optind - 1]); 968 break; 969 case 'h': 970 help(); 971 break; 972 case 'f': 973 fmt = optarg; 974 break; 975 case 't': 976 cache = optarg; 977 break; 978 case 'b': 979 base = optarg; 980 /* -b implies -d */ 981 drop = true; 982 break; 983 case 'd': 984 drop = true; 985 break; 986 case 'p': 987 progress = true; 988 break; 989 case 'q': 990 quiet = true; 991 break; 992 case 'r': 993 rate_limit = cvtnum("rate limit", optarg); 994 if (rate_limit < 0) { 995 return 1; 996 } 997 break; 998 case OPTION_OBJECT: 999 user_creatable_process_cmdline(optarg); 1000 break; 1001 case OPTION_IMAGE_OPTS: 1002 image_opts = true; 1003 break; 1004 } 1005 } 1006 1007 /* Progress is not shown in Quiet mode */ 1008 if (quiet) { 1009 progress = false; 1010 } 1011 1012 if (optind != argc - 1) { 1013 error_exit("Expecting one image file name"); 1014 } 1015 filename = argv[optind++]; 1016 1017 flags = BDRV_O_RDWR | BDRV_O_UNMAP; 1018 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 1019 if (ret < 0) { 1020 error_report("Invalid cache option: %s", cache); 1021 return 1; 1022 } 1023 1024 blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet, 1025 false); 1026 if (!blk) { 1027 return 1; 1028 } 1029 bs = blk_bs(blk); 1030 1031 qemu_progress_init(progress, 1.f); 1032 qemu_progress_print(0.f, 100); 1033 1034 if (base) { 1035 base_bs = bdrv_find_backing_image(bs, base); 1036 if (!base_bs) { 1037 error_setg(&local_err, 1038 "Did not find '%s' in the backing chain of '%s'", 1039 base, filename); 1040 goto done; 1041 } 1042 } else { 1043 /* This is different from QMP, which by default uses the deepest file in 1044 * the backing chain (i.e., the very base); however, the traditional 1045 * behavior of qemu-img commit is using the immediate backing file. */ 1046 base_bs = bdrv_backing_chain_next(bs); 1047 if (!base_bs) { 1048 error_setg(&local_err, "Image does not have a backing file"); 1049 goto done; 1050 } 1051 } 1052 1053 cbi = (CommonBlockJobCBInfo){ 1054 .errp = &local_err, 1055 .bs = bs, 1056 }; 1057 1058 aio_context = bdrv_get_aio_context(bs); 1059 aio_context_acquire(aio_context); 1060 commit_active_start("commit", bs, base_bs, JOB_DEFAULT, rate_limit, 1061 BLOCKDEV_ON_ERROR_REPORT, NULL, common_block_job_cb, 1062 &cbi, false, &local_err); 1063 aio_context_release(aio_context); 1064 if (local_err) { 1065 goto done; 1066 } 1067 1068 /* When the block job completes, the BlockBackend reference will point to 1069 * the old backing file. In order to avoid that the top image is already 1070 * deleted, so we can still empty it afterwards, increment the reference 1071 * counter here preemptively. */ 1072 if (!drop) { 1073 bdrv_ref(bs); 1074 } 1075 1076 job = block_job_get("commit"); 1077 assert(job); 1078 run_block_job(job, &local_err); 1079 if (local_err) { 1080 goto unref_backing; 1081 } 1082 1083 if (!drop) { 1084 BlockBackend *old_backing_blk; 1085 1086 old_backing_blk = blk_new_with_bs(bs, BLK_PERM_WRITE, BLK_PERM_ALL, 1087 &local_err); 1088 if (!old_backing_blk) { 1089 goto unref_backing; 1090 } 1091 ret = blk_make_empty(old_backing_blk, &local_err); 1092 blk_unref(old_backing_blk); 1093 if (ret == -ENOTSUP) { 1094 error_free(local_err); 1095 local_err = NULL; 1096 } else if (ret < 0) { 1097 goto unref_backing; 1098 } 1099 } 1100 1101 unref_backing: 1102 if (!drop) { 1103 bdrv_unref(bs); 1104 } 1105 1106 done: 1107 qemu_progress_end(); 1108 1109 blk_unref(blk); 1110 1111 if (local_err) { 1112 error_report_err(local_err); 1113 return 1; 1114 } 1115 1116 qprintf(quiet, "Image committed.\n"); 1117 return 0; 1118 } 1119 1120 /* 1121 * Returns -1 if 'buf' contains only zeroes, otherwise the byte index 1122 * of the first sector boundary within buf where the sector contains a 1123 * non-zero byte. This function is robust to a buffer that is not 1124 * sector-aligned. 1125 */ 1126 static int64_t find_nonzero(const uint8_t *buf, int64_t n) 1127 { 1128 int64_t i; 1129 int64_t end = QEMU_ALIGN_DOWN(n, BDRV_SECTOR_SIZE); 1130 1131 for (i = 0; i < end; i += BDRV_SECTOR_SIZE) { 1132 if (!buffer_is_zero(buf + i, BDRV_SECTOR_SIZE)) { 1133 return i; 1134 } 1135 } 1136 if (i < n && !buffer_is_zero(buf + i, n - end)) { 1137 return i; 1138 } 1139 return -1; 1140 } 1141 1142 /* 1143 * Returns true iff the first sector pointed to by 'buf' contains at least 1144 * a non-NUL byte. 1145 * 1146 * 'pnum' is set to the number of sectors (including and immediately following 1147 * the first one) that are known to be in the same allocated/unallocated state. 1148 * The function will try to align the end offset to alignment boundaries so 1149 * that the request will at least end aligned and consecutive requests will 1150 * also start at an aligned offset. 1151 */ 1152 static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum, 1153 int64_t sector_num, int alignment) 1154 { 1155 bool is_zero; 1156 int i, tail; 1157 1158 if (n <= 0) { 1159 *pnum = 0; 1160 return 0; 1161 } 1162 is_zero = buffer_is_zero(buf, BDRV_SECTOR_SIZE); 1163 for(i = 1; i < n; i++) { 1164 buf += BDRV_SECTOR_SIZE; 1165 if (is_zero != buffer_is_zero(buf, BDRV_SECTOR_SIZE)) { 1166 break; 1167 } 1168 } 1169 1170 tail = (sector_num + i) & (alignment - 1); 1171 if (tail) { 1172 if (is_zero && i <= tail) { 1173 /* treat unallocated areas which only consist 1174 * of a small tail as allocated. */ 1175 is_zero = false; 1176 } 1177 if (!is_zero) { 1178 /* align up end offset of allocated areas. */ 1179 i += alignment - tail; 1180 i = MIN(i, n); 1181 } else { 1182 /* align down end offset of zero areas. */ 1183 i -= tail; 1184 } 1185 } 1186 *pnum = i; 1187 return !is_zero; 1188 } 1189 1190 /* 1191 * Like is_allocated_sectors, but if the buffer starts with a used sector, 1192 * up to 'min' consecutive sectors containing zeros are ignored. This avoids 1193 * breaking up write requests for only small sparse areas. 1194 */ 1195 static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum, 1196 int min, int64_t sector_num, int alignment) 1197 { 1198 int ret; 1199 int num_checked, num_used; 1200 1201 if (n < min) { 1202 min = n; 1203 } 1204 1205 ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment); 1206 if (!ret) { 1207 return ret; 1208 } 1209 1210 num_used = *pnum; 1211 buf += BDRV_SECTOR_SIZE * *pnum; 1212 n -= *pnum; 1213 sector_num += *pnum; 1214 num_checked = num_used; 1215 1216 while (n > 0) { 1217 ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment); 1218 1219 buf += BDRV_SECTOR_SIZE * *pnum; 1220 n -= *pnum; 1221 sector_num += *pnum; 1222 num_checked += *pnum; 1223 if (ret) { 1224 num_used = num_checked; 1225 } else if (*pnum >= min) { 1226 break; 1227 } 1228 } 1229 1230 *pnum = num_used; 1231 return 1; 1232 } 1233 1234 /* 1235 * Compares two buffers sector by sector. Returns 0 if the first 1236 * sector of each buffer matches, non-zero otherwise. 1237 * 1238 * pnum is set to the sector-aligned size of the buffer prefix that 1239 * has the same matching status as the first sector. 1240 */ 1241 static int compare_buffers(const uint8_t *buf1, const uint8_t *buf2, 1242 int64_t bytes, int64_t *pnum) 1243 { 1244 bool res; 1245 int64_t i = MIN(bytes, BDRV_SECTOR_SIZE); 1246 1247 assert(bytes > 0); 1248 1249 res = !!memcmp(buf1, buf2, i); 1250 while (i < bytes) { 1251 int64_t len = MIN(bytes - i, BDRV_SECTOR_SIZE); 1252 1253 if (!!memcmp(buf1 + i, buf2 + i, len) != res) { 1254 break; 1255 } 1256 i += len; 1257 } 1258 1259 *pnum = i; 1260 return res; 1261 } 1262 1263 #define IO_BUF_SIZE (2 * MiB) 1264 1265 /* 1266 * Check if passed sectors are empty (not allocated or contain only 0 bytes) 1267 * 1268 * Intended for use by 'qemu-img compare': Returns 0 in case sectors are 1269 * filled with 0, 1 if sectors contain non-zero data (this is a comparison 1270 * failure), and 4 on error (the exit status for read errors), after emitting 1271 * an error message. 1272 * 1273 * @param blk: BlockBackend for the image 1274 * @param offset: Starting offset to check 1275 * @param bytes: Number of bytes to check 1276 * @param filename: Name of disk file we are checking (logging purpose) 1277 * @param buffer: Allocated buffer for storing read data 1278 * @param quiet: Flag for quiet mode 1279 */ 1280 static int check_empty_sectors(BlockBackend *blk, int64_t offset, 1281 int64_t bytes, const char *filename, 1282 uint8_t *buffer, bool quiet) 1283 { 1284 int ret = 0; 1285 int64_t idx; 1286 1287 ret = blk_pread(blk, offset, buffer, bytes); 1288 if (ret < 0) { 1289 error_report("Error while reading offset %" PRId64 " of %s: %s", 1290 offset, filename, strerror(-ret)); 1291 return 4; 1292 } 1293 idx = find_nonzero(buffer, bytes); 1294 if (idx >= 0) { 1295 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n", 1296 offset + idx); 1297 return 1; 1298 } 1299 1300 return 0; 1301 } 1302 1303 /* 1304 * Compares two images. Exit codes: 1305 * 1306 * 0 - Images are identical or the requested help was printed 1307 * 1 - Images differ 1308 * >1 - Error occurred 1309 */ 1310 static int img_compare(int argc, char **argv) 1311 { 1312 const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2; 1313 BlockBackend *blk1, *blk2; 1314 BlockDriverState *bs1, *bs2; 1315 int64_t total_size1, total_size2; 1316 uint8_t *buf1 = NULL, *buf2 = NULL; 1317 int64_t pnum1, pnum2; 1318 int allocated1, allocated2; 1319 int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */ 1320 bool progress = false, quiet = false, strict = false; 1321 int flags; 1322 bool writethrough; 1323 int64_t total_size; 1324 int64_t offset = 0; 1325 int64_t chunk; 1326 int c; 1327 uint64_t progress_base; 1328 bool image_opts = false; 1329 bool force_share = false; 1330 1331 cache = BDRV_DEFAULT_CACHE; 1332 for (;;) { 1333 static const struct option long_options[] = { 1334 {"help", no_argument, 0, 'h'}, 1335 {"object", required_argument, 0, OPTION_OBJECT}, 1336 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 1337 {"force-share", no_argument, 0, 'U'}, 1338 {0, 0, 0, 0} 1339 }; 1340 c = getopt_long(argc, argv, ":hf:F:T:pqsU", 1341 long_options, NULL); 1342 if (c == -1) { 1343 break; 1344 } 1345 switch (c) { 1346 case ':': 1347 missing_argument(argv[optind - 1]); 1348 break; 1349 case '?': 1350 unrecognized_option(argv[optind - 1]); 1351 break; 1352 case 'h': 1353 help(); 1354 break; 1355 case 'f': 1356 fmt1 = optarg; 1357 break; 1358 case 'F': 1359 fmt2 = optarg; 1360 break; 1361 case 'T': 1362 cache = optarg; 1363 break; 1364 case 'p': 1365 progress = true; 1366 break; 1367 case 'q': 1368 quiet = true; 1369 break; 1370 case 's': 1371 strict = true; 1372 break; 1373 case 'U': 1374 force_share = true; 1375 break; 1376 case OPTION_OBJECT: 1377 { 1378 Error *local_err = NULL; 1379 1380 if (!user_creatable_add_from_str(optarg, &local_err)) { 1381 if (local_err) { 1382 error_report_err(local_err); 1383 exit(2); 1384 } else { 1385 /* Help was printed */ 1386 exit(EXIT_SUCCESS); 1387 } 1388 } 1389 break; 1390 } 1391 case OPTION_IMAGE_OPTS: 1392 image_opts = true; 1393 break; 1394 } 1395 } 1396 1397 /* Progress is not shown in Quiet mode */ 1398 if (quiet) { 1399 progress = false; 1400 } 1401 1402 1403 if (optind != argc - 2) { 1404 error_exit("Expecting two image file names"); 1405 } 1406 filename1 = argv[optind++]; 1407 filename2 = argv[optind++]; 1408 1409 /* Initialize before goto out */ 1410 qemu_progress_init(progress, 2.0); 1411 1412 flags = 0; 1413 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 1414 if (ret < 0) { 1415 error_report("Invalid source cache option: %s", cache); 1416 ret = 2; 1417 goto out3; 1418 } 1419 1420 blk1 = img_open(image_opts, filename1, fmt1, flags, writethrough, quiet, 1421 force_share); 1422 if (!blk1) { 1423 ret = 2; 1424 goto out3; 1425 } 1426 1427 blk2 = img_open(image_opts, filename2, fmt2, flags, writethrough, quiet, 1428 force_share); 1429 if (!blk2) { 1430 ret = 2; 1431 goto out2; 1432 } 1433 bs1 = blk_bs(blk1); 1434 bs2 = blk_bs(blk2); 1435 1436 buf1 = blk_blockalign(blk1, IO_BUF_SIZE); 1437 buf2 = blk_blockalign(blk2, IO_BUF_SIZE); 1438 total_size1 = blk_getlength(blk1); 1439 if (total_size1 < 0) { 1440 error_report("Can't get size of %s: %s", 1441 filename1, strerror(-total_size1)); 1442 ret = 4; 1443 goto out; 1444 } 1445 total_size2 = blk_getlength(blk2); 1446 if (total_size2 < 0) { 1447 error_report("Can't get size of %s: %s", 1448 filename2, strerror(-total_size2)); 1449 ret = 4; 1450 goto out; 1451 } 1452 total_size = MIN(total_size1, total_size2); 1453 progress_base = MAX(total_size1, total_size2); 1454 1455 qemu_progress_print(0, 100); 1456 1457 if (strict && total_size1 != total_size2) { 1458 ret = 1; 1459 qprintf(quiet, "Strict mode: Image size mismatch!\n"); 1460 goto out; 1461 } 1462 1463 while (offset < total_size) { 1464 int status1, status2; 1465 1466 status1 = bdrv_block_status_above(bs1, NULL, offset, 1467 total_size1 - offset, &pnum1, NULL, 1468 NULL); 1469 if (status1 < 0) { 1470 ret = 3; 1471 error_report("Sector allocation test failed for %s", filename1); 1472 goto out; 1473 } 1474 allocated1 = status1 & BDRV_BLOCK_ALLOCATED; 1475 1476 status2 = bdrv_block_status_above(bs2, NULL, offset, 1477 total_size2 - offset, &pnum2, NULL, 1478 NULL); 1479 if (status2 < 0) { 1480 ret = 3; 1481 error_report("Sector allocation test failed for %s", filename2); 1482 goto out; 1483 } 1484 allocated2 = status2 & BDRV_BLOCK_ALLOCATED; 1485 1486 assert(pnum1 && pnum2); 1487 chunk = MIN(pnum1, pnum2); 1488 1489 if (strict) { 1490 if (status1 != status2) { 1491 ret = 1; 1492 qprintf(quiet, "Strict mode: Offset %" PRId64 1493 " block status mismatch!\n", offset); 1494 goto out; 1495 } 1496 } 1497 if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) { 1498 /* nothing to do */ 1499 } else if (allocated1 == allocated2) { 1500 if (allocated1) { 1501 int64_t pnum; 1502 1503 chunk = MIN(chunk, IO_BUF_SIZE); 1504 ret = blk_pread(blk1, offset, buf1, chunk); 1505 if (ret < 0) { 1506 error_report("Error while reading offset %" PRId64 1507 " of %s: %s", 1508 offset, filename1, strerror(-ret)); 1509 ret = 4; 1510 goto out; 1511 } 1512 ret = blk_pread(blk2, offset, buf2, chunk); 1513 if (ret < 0) { 1514 error_report("Error while reading offset %" PRId64 1515 " of %s: %s", 1516 offset, filename2, strerror(-ret)); 1517 ret = 4; 1518 goto out; 1519 } 1520 ret = compare_buffers(buf1, buf2, chunk, &pnum); 1521 if (ret || pnum != chunk) { 1522 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n", 1523 offset + (ret ? 0 : pnum)); 1524 ret = 1; 1525 goto out; 1526 } 1527 } 1528 } else { 1529 chunk = MIN(chunk, IO_BUF_SIZE); 1530 if (allocated1) { 1531 ret = check_empty_sectors(blk1, offset, chunk, 1532 filename1, buf1, quiet); 1533 } else { 1534 ret = check_empty_sectors(blk2, offset, chunk, 1535 filename2, buf1, quiet); 1536 } 1537 if (ret) { 1538 goto out; 1539 } 1540 } 1541 offset += chunk; 1542 qemu_progress_print(((float) chunk / progress_base) * 100, 100); 1543 } 1544 1545 if (total_size1 != total_size2) { 1546 BlockBackend *blk_over; 1547 const char *filename_over; 1548 1549 qprintf(quiet, "Warning: Image size mismatch!\n"); 1550 if (total_size1 > total_size2) { 1551 blk_over = blk1; 1552 filename_over = filename1; 1553 } else { 1554 blk_over = blk2; 1555 filename_over = filename2; 1556 } 1557 1558 while (offset < progress_base) { 1559 ret = bdrv_block_status_above(blk_bs(blk_over), NULL, offset, 1560 progress_base - offset, &chunk, 1561 NULL, NULL); 1562 if (ret < 0) { 1563 ret = 3; 1564 error_report("Sector allocation test failed for %s", 1565 filename_over); 1566 goto out; 1567 1568 } 1569 if (ret & BDRV_BLOCK_ALLOCATED && !(ret & BDRV_BLOCK_ZERO)) { 1570 chunk = MIN(chunk, IO_BUF_SIZE); 1571 ret = check_empty_sectors(blk_over, offset, chunk, 1572 filename_over, buf1, quiet); 1573 if (ret) { 1574 goto out; 1575 } 1576 } 1577 offset += chunk; 1578 qemu_progress_print(((float) chunk / progress_base) * 100, 100); 1579 } 1580 } 1581 1582 qprintf(quiet, "Images are identical.\n"); 1583 ret = 0; 1584 1585 out: 1586 qemu_vfree(buf1); 1587 qemu_vfree(buf2); 1588 blk_unref(blk2); 1589 out2: 1590 blk_unref(blk1); 1591 out3: 1592 qemu_progress_end(); 1593 return ret; 1594 } 1595 1596 /* Convenience wrapper around qmp_block_dirty_bitmap_merge */ 1597 static void do_dirty_bitmap_merge(const char *dst_node, const char *dst_name, 1598 const char *src_node, const char *src_name, 1599 Error **errp) 1600 { 1601 BlockDirtyBitmapMergeSource *merge_src; 1602 BlockDirtyBitmapMergeSourceList *list = NULL; 1603 1604 merge_src = g_new0(BlockDirtyBitmapMergeSource, 1); 1605 merge_src->type = QTYPE_QDICT; 1606 merge_src->u.external.node = g_strdup(src_node); 1607 merge_src->u.external.name = g_strdup(src_name); 1608 QAPI_LIST_PREPEND(list, merge_src); 1609 qmp_block_dirty_bitmap_merge(dst_node, dst_name, list, errp); 1610 qapi_free_BlockDirtyBitmapMergeSourceList(list); 1611 } 1612 1613 enum ImgConvertBlockStatus { 1614 BLK_DATA, 1615 BLK_ZERO, 1616 BLK_BACKING_FILE, 1617 }; 1618 1619 #define MAX_COROUTINES 16 1620 #define CONVERT_THROTTLE_GROUP "img_convert" 1621 1622 typedef struct ImgConvertState { 1623 BlockBackend **src; 1624 int64_t *src_sectors; 1625 int *src_alignment; 1626 int src_num; 1627 int64_t total_sectors; 1628 int64_t allocated_sectors; 1629 int64_t allocated_done; 1630 int64_t sector_num; 1631 int64_t wr_offs; 1632 enum ImgConvertBlockStatus status; 1633 int64_t sector_next_status; 1634 BlockBackend *target; 1635 bool has_zero_init; 1636 bool compressed; 1637 bool target_is_new; 1638 bool target_has_backing; 1639 int64_t target_backing_sectors; /* negative if unknown */ 1640 bool wr_in_order; 1641 bool copy_range; 1642 bool salvage; 1643 bool quiet; 1644 int min_sparse; 1645 int alignment; 1646 size_t cluster_sectors; 1647 size_t buf_sectors; 1648 long num_coroutines; 1649 int running_coroutines; 1650 Coroutine *co[MAX_COROUTINES]; 1651 int64_t wait_sector_num[MAX_COROUTINES]; 1652 CoMutex lock; 1653 int ret; 1654 } ImgConvertState; 1655 1656 static void convert_select_part(ImgConvertState *s, int64_t sector_num, 1657 int *src_cur, int64_t *src_cur_offset) 1658 { 1659 *src_cur = 0; 1660 *src_cur_offset = 0; 1661 while (sector_num - *src_cur_offset >= s->src_sectors[*src_cur]) { 1662 *src_cur_offset += s->src_sectors[*src_cur]; 1663 (*src_cur)++; 1664 assert(*src_cur < s->src_num); 1665 } 1666 } 1667 1668 static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num) 1669 { 1670 int64_t src_cur_offset; 1671 int ret, n, src_cur; 1672 bool post_backing_zero = false; 1673 1674 convert_select_part(s, sector_num, &src_cur, &src_cur_offset); 1675 1676 assert(s->total_sectors > sector_num); 1677 n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS); 1678 1679 if (s->target_backing_sectors >= 0) { 1680 if (sector_num >= s->target_backing_sectors) { 1681 post_backing_zero = true; 1682 } else if (sector_num + n > s->target_backing_sectors) { 1683 /* Split requests around target_backing_sectors (because 1684 * starting from there, zeros are handled differently) */ 1685 n = s->target_backing_sectors - sector_num; 1686 } 1687 } 1688 1689 if (s->sector_next_status <= sector_num) { 1690 uint64_t offset = (sector_num - src_cur_offset) * BDRV_SECTOR_SIZE; 1691 int64_t count; 1692 int tail; 1693 BlockDriverState *src_bs = blk_bs(s->src[src_cur]); 1694 BlockDriverState *base; 1695 1696 if (s->target_has_backing) { 1697 base = bdrv_cow_bs(bdrv_skip_filters(src_bs)); 1698 } else { 1699 base = NULL; 1700 } 1701 1702 do { 1703 count = n * BDRV_SECTOR_SIZE; 1704 1705 ret = bdrv_block_status_above(src_bs, base, offset, count, &count, 1706 NULL, NULL); 1707 1708 if (ret < 0) { 1709 if (s->salvage) { 1710 if (n == 1) { 1711 if (!s->quiet) { 1712 warn_report("error while reading block status at " 1713 "offset %" PRIu64 ": %s", offset, 1714 strerror(-ret)); 1715 } 1716 /* Just try to read the data, then */ 1717 ret = BDRV_BLOCK_DATA; 1718 count = BDRV_SECTOR_SIZE; 1719 } else { 1720 /* Retry on a shorter range */ 1721 n = DIV_ROUND_UP(n, 4); 1722 } 1723 } else { 1724 error_report("error while reading block status at offset " 1725 "%" PRIu64 ": %s", offset, strerror(-ret)); 1726 return ret; 1727 } 1728 } 1729 } while (ret < 0); 1730 1731 n = DIV_ROUND_UP(count, BDRV_SECTOR_SIZE); 1732 1733 /* 1734 * Avoid that s->sector_next_status becomes unaligned to the source 1735 * request alignment and/or cluster size to avoid unnecessary read 1736 * cycles. 1737 */ 1738 tail = (sector_num - src_cur_offset + n) % s->src_alignment[src_cur]; 1739 if (n > tail) { 1740 n -= tail; 1741 } 1742 1743 if (ret & BDRV_BLOCK_ZERO) { 1744 s->status = post_backing_zero ? BLK_BACKING_FILE : BLK_ZERO; 1745 } else if (ret & BDRV_BLOCK_DATA) { 1746 s->status = BLK_DATA; 1747 } else { 1748 s->status = s->target_has_backing ? BLK_BACKING_FILE : BLK_DATA; 1749 } 1750 1751 s->sector_next_status = sector_num + n; 1752 } 1753 1754 n = MIN(n, s->sector_next_status - sector_num); 1755 if (s->status == BLK_DATA) { 1756 n = MIN(n, s->buf_sectors); 1757 } 1758 1759 /* We need to write complete clusters for compressed images, so if an 1760 * unallocated area is shorter than that, we must consider the whole 1761 * cluster allocated. */ 1762 if (s->compressed) { 1763 if (n < s->cluster_sectors) { 1764 n = MIN(s->cluster_sectors, s->total_sectors - sector_num); 1765 s->status = BLK_DATA; 1766 } else { 1767 n = QEMU_ALIGN_DOWN(n, s->cluster_sectors); 1768 } 1769 } 1770 1771 return n; 1772 } 1773 1774 static int coroutine_fn convert_co_read(ImgConvertState *s, int64_t sector_num, 1775 int nb_sectors, uint8_t *buf) 1776 { 1777 uint64_t single_read_until = 0; 1778 int n, ret; 1779 1780 assert(nb_sectors <= s->buf_sectors); 1781 while (nb_sectors > 0) { 1782 BlockBackend *blk; 1783 int src_cur; 1784 int64_t bs_sectors, src_cur_offset; 1785 uint64_t offset; 1786 1787 /* In the case of compression with multiple source files, we can get a 1788 * nb_sectors that spreads into the next part. So we must be able to 1789 * read across multiple BDSes for one convert_read() call. */ 1790 convert_select_part(s, sector_num, &src_cur, &src_cur_offset); 1791 blk = s->src[src_cur]; 1792 bs_sectors = s->src_sectors[src_cur]; 1793 1794 offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS; 1795 1796 n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset)); 1797 if (single_read_until > offset) { 1798 n = 1; 1799 } 1800 1801 ret = blk_co_pread(blk, offset, n << BDRV_SECTOR_BITS, buf, 0); 1802 if (ret < 0) { 1803 if (s->salvage) { 1804 if (n > 1) { 1805 single_read_until = offset + (n << BDRV_SECTOR_BITS); 1806 continue; 1807 } else { 1808 if (!s->quiet) { 1809 warn_report("error while reading offset %" PRIu64 1810 ": %s", offset, strerror(-ret)); 1811 } 1812 memset(buf, 0, BDRV_SECTOR_SIZE); 1813 } 1814 } else { 1815 return ret; 1816 } 1817 } 1818 1819 sector_num += n; 1820 nb_sectors -= n; 1821 buf += n * BDRV_SECTOR_SIZE; 1822 } 1823 1824 return 0; 1825 } 1826 1827 1828 static int coroutine_fn convert_co_write(ImgConvertState *s, int64_t sector_num, 1829 int nb_sectors, uint8_t *buf, 1830 enum ImgConvertBlockStatus status) 1831 { 1832 int ret; 1833 1834 while (nb_sectors > 0) { 1835 int n = nb_sectors; 1836 BdrvRequestFlags flags = s->compressed ? BDRV_REQ_WRITE_COMPRESSED : 0; 1837 1838 switch (status) { 1839 case BLK_BACKING_FILE: 1840 /* If we have a backing file, leave clusters unallocated that are 1841 * unallocated in the source image, so that the backing file is 1842 * visible at the respective offset. */ 1843 assert(s->target_has_backing); 1844 break; 1845 1846 case BLK_DATA: 1847 /* If we're told to keep the target fully allocated (-S 0) or there 1848 * is real non-zero data, we must write it. Otherwise we can treat 1849 * it as zero sectors. 1850 * Compressed clusters need to be written as a whole, so in that 1851 * case we can only save the write if the buffer is completely 1852 * zeroed. */ 1853 if (!s->min_sparse || 1854 (!s->compressed && 1855 is_allocated_sectors_min(buf, n, &n, s->min_sparse, 1856 sector_num, s->alignment)) || 1857 (s->compressed && 1858 !buffer_is_zero(buf, n * BDRV_SECTOR_SIZE))) 1859 { 1860 ret = blk_co_pwrite(s->target, sector_num << BDRV_SECTOR_BITS, 1861 n << BDRV_SECTOR_BITS, buf, flags); 1862 if (ret < 0) { 1863 return ret; 1864 } 1865 break; 1866 } 1867 /* fall-through */ 1868 1869 case BLK_ZERO: 1870 if (s->has_zero_init) { 1871 assert(!s->target_has_backing); 1872 break; 1873 } 1874 ret = blk_co_pwrite_zeroes(s->target, 1875 sector_num << BDRV_SECTOR_BITS, 1876 n << BDRV_SECTOR_BITS, 1877 BDRV_REQ_MAY_UNMAP); 1878 if (ret < 0) { 1879 return ret; 1880 } 1881 break; 1882 } 1883 1884 sector_num += n; 1885 nb_sectors -= n; 1886 buf += n * BDRV_SECTOR_SIZE; 1887 } 1888 1889 return 0; 1890 } 1891 1892 static int coroutine_fn convert_co_copy_range(ImgConvertState *s, int64_t sector_num, 1893 int nb_sectors) 1894 { 1895 int n, ret; 1896 1897 while (nb_sectors > 0) { 1898 BlockBackend *blk; 1899 int src_cur; 1900 int64_t bs_sectors, src_cur_offset; 1901 int64_t offset; 1902 1903 convert_select_part(s, sector_num, &src_cur, &src_cur_offset); 1904 offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS; 1905 blk = s->src[src_cur]; 1906 bs_sectors = s->src_sectors[src_cur]; 1907 1908 n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset)); 1909 1910 ret = blk_co_copy_range(blk, offset, s->target, 1911 sector_num << BDRV_SECTOR_BITS, 1912 n << BDRV_SECTOR_BITS, 0, 0); 1913 if (ret < 0) { 1914 return ret; 1915 } 1916 1917 sector_num += n; 1918 nb_sectors -= n; 1919 } 1920 return 0; 1921 } 1922 1923 static void coroutine_fn convert_co_do_copy(void *opaque) 1924 { 1925 ImgConvertState *s = opaque; 1926 uint8_t *buf = NULL; 1927 int ret, i; 1928 int index = -1; 1929 1930 for (i = 0; i < s->num_coroutines; i++) { 1931 if (s->co[i] == qemu_coroutine_self()) { 1932 index = i; 1933 break; 1934 } 1935 } 1936 assert(index >= 0); 1937 1938 s->running_coroutines++; 1939 buf = blk_blockalign(s->target, s->buf_sectors * BDRV_SECTOR_SIZE); 1940 1941 while (1) { 1942 int n; 1943 int64_t sector_num; 1944 enum ImgConvertBlockStatus status; 1945 bool copy_range; 1946 1947 qemu_co_mutex_lock(&s->lock); 1948 if (s->ret != -EINPROGRESS || s->sector_num >= s->total_sectors) { 1949 qemu_co_mutex_unlock(&s->lock); 1950 break; 1951 } 1952 n = convert_iteration_sectors(s, s->sector_num); 1953 if (n < 0) { 1954 qemu_co_mutex_unlock(&s->lock); 1955 s->ret = n; 1956 break; 1957 } 1958 /* save current sector and allocation status to local variables */ 1959 sector_num = s->sector_num; 1960 status = s->status; 1961 if (!s->min_sparse && s->status == BLK_ZERO) { 1962 n = MIN(n, s->buf_sectors); 1963 } 1964 /* increment global sector counter so that other coroutines can 1965 * already continue reading beyond this request */ 1966 s->sector_num += n; 1967 qemu_co_mutex_unlock(&s->lock); 1968 1969 if (status == BLK_DATA || (!s->min_sparse && status == BLK_ZERO)) { 1970 s->allocated_done += n; 1971 qemu_progress_print(100.0 * s->allocated_done / 1972 s->allocated_sectors, 0); 1973 } 1974 1975 retry: 1976 copy_range = s->copy_range && s->status == BLK_DATA; 1977 if (status == BLK_DATA && !copy_range) { 1978 ret = convert_co_read(s, sector_num, n, buf); 1979 if (ret < 0) { 1980 error_report("error while reading at byte %lld: %s", 1981 sector_num * BDRV_SECTOR_SIZE, strerror(-ret)); 1982 s->ret = ret; 1983 } 1984 } else if (!s->min_sparse && status == BLK_ZERO) { 1985 status = BLK_DATA; 1986 memset(buf, 0x00, n * BDRV_SECTOR_SIZE); 1987 } 1988 1989 if (s->wr_in_order) { 1990 /* keep writes in order */ 1991 while (s->wr_offs != sector_num && s->ret == -EINPROGRESS) { 1992 s->wait_sector_num[index] = sector_num; 1993 qemu_coroutine_yield(); 1994 } 1995 s->wait_sector_num[index] = -1; 1996 } 1997 1998 if (s->ret == -EINPROGRESS) { 1999 if (copy_range) { 2000 ret = convert_co_copy_range(s, sector_num, n); 2001 if (ret) { 2002 s->copy_range = false; 2003 goto retry; 2004 } 2005 } else { 2006 ret = convert_co_write(s, sector_num, n, buf, status); 2007 } 2008 if (ret < 0) { 2009 error_report("error while writing at byte %lld: %s", 2010 sector_num * BDRV_SECTOR_SIZE, strerror(-ret)); 2011 s->ret = ret; 2012 } 2013 } 2014 2015 if (s->wr_in_order) { 2016 /* reenter the coroutine that might have waited 2017 * for this write to complete */ 2018 s->wr_offs = sector_num + n; 2019 for (i = 0; i < s->num_coroutines; i++) { 2020 if (s->co[i] && s->wait_sector_num[i] == s->wr_offs) { 2021 /* 2022 * A -> B -> A cannot occur because A has 2023 * s->wait_sector_num[i] == -1 during A -> B. Therefore 2024 * B will never enter A during this time window. 2025 */ 2026 qemu_coroutine_enter(s->co[i]); 2027 break; 2028 } 2029 } 2030 } 2031 } 2032 2033 qemu_vfree(buf); 2034 s->co[index] = NULL; 2035 s->running_coroutines--; 2036 if (!s->running_coroutines && s->ret == -EINPROGRESS) { 2037 /* the convert job finished successfully */ 2038 s->ret = 0; 2039 } 2040 } 2041 2042 static int convert_do_copy(ImgConvertState *s) 2043 { 2044 int ret, i, n; 2045 int64_t sector_num = 0; 2046 2047 /* Check whether we have zero initialisation or can get it efficiently */ 2048 if (!s->has_zero_init && s->target_is_new && s->min_sparse && 2049 !s->target_has_backing) { 2050 s->has_zero_init = bdrv_has_zero_init(blk_bs(s->target)); 2051 } 2052 2053 /* Allocate buffer for copied data. For compressed images, only one cluster 2054 * can be copied at a time. */ 2055 if (s->compressed) { 2056 if (s->cluster_sectors <= 0 || s->cluster_sectors > s->buf_sectors) { 2057 error_report("invalid cluster size"); 2058 return -EINVAL; 2059 } 2060 s->buf_sectors = s->cluster_sectors; 2061 } 2062 2063 while (sector_num < s->total_sectors) { 2064 n = convert_iteration_sectors(s, sector_num); 2065 if (n < 0) { 2066 return n; 2067 } 2068 if (s->status == BLK_DATA || (!s->min_sparse && s->status == BLK_ZERO)) 2069 { 2070 s->allocated_sectors += n; 2071 } 2072 sector_num += n; 2073 } 2074 2075 /* Do the copy */ 2076 s->sector_next_status = 0; 2077 s->ret = -EINPROGRESS; 2078 2079 qemu_co_mutex_init(&s->lock); 2080 for (i = 0; i < s->num_coroutines; i++) { 2081 s->co[i] = qemu_coroutine_create(convert_co_do_copy, s); 2082 s->wait_sector_num[i] = -1; 2083 qemu_coroutine_enter(s->co[i]); 2084 } 2085 2086 while (s->running_coroutines) { 2087 main_loop_wait(false); 2088 } 2089 2090 if (s->compressed && !s->ret) { 2091 /* signal EOF to align */ 2092 ret = blk_pwrite_compressed(s->target, 0, NULL, 0); 2093 if (ret < 0) { 2094 return ret; 2095 } 2096 } 2097 2098 return s->ret; 2099 } 2100 2101 static int convert_copy_bitmaps(BlockDriverState *src, BlockDriverState *dst) 2102 { 2103 BdrvDirtyBitmap *bm; 2104 Error *err = NULL; 2105 2106 FOR_EACH_DIRTY_BITMAP(src, bm) { 2107 const char *name; 2108 2109 if (!bdrv_dirty_bitmap_get_persistence(bm)) { 2110 continue; 2111 } 2112 name = bdrv_dirty_bitmap_name(bm); 2113 qmp_block_dirty_bitmap_add(dst->node_name, name, 2114 true, bdrv_dirty_bitmap_granularity(bm), 2115 true, true, 2116 true, !bdrv_dirty_bitmap_enabled(bm), 2117 &err); 2118 if (err) { 2119 error_reportf_err(err, "Failed to create bitmap %s: ", name); 2120 return -1; 2121 } 2122 2123 do_dirty_bitmap_merge(dst->node_name, name, src->node_name, name, 2124 &err); 2125 if (err) { 2126 error_reportf_err(err, "Failed to populate bitmap %s: ", name); 2127 return -1; 2128 } 2129 } 2130 2131 return 0; 2132 } 2133 2134 #define MAX_BUF_SECTORS 32768 2135 2136 static void set_rate_limit(BlockBackend *blk, int64_t rate_limit) 2137 { 2138 ThrottleConfig cfg; 2139 2140 throttle_config_init(&cfg); 2141 cfg.buckets[THROTTLE_BPS_WRITE].avg = rate_limit; 2142 2143 blk_io_limits_enable(blk, CONVERT_THROTTLE_GROUP); 2144 blk_set_io_limits(blk, &cfg); 2145 } 2146 2147 static int img_convert(int argc, char **argv) 2148 { 2149 int c, bs_i, flags, src_flags = BDRV_O_NO_SHARE; 2150 const char *fmt = NULL, *out_fmt = NULL, *cache = "unsafe", 2151 *src_cache = BDRV_DEFAULT_CACHE, *out_baseimg = NULL, 2152 *out_filename, *out_baseimg_param, *snapshot_name = NULL; 2153 BlockDriver *drv = NULL, *proto_drv = NULL; 2154 BlockDriverInfo bdi; 2155 BlockDriverState *out_bs; 2156 QemuOpts *opts = NULL, *sn_opts = NULL; 2157 QemuOptsList *create_opts = NULL; 2158 QDict *open_opts = NULL; 2159 char *options = NULL; 2160 Error *local_err = NULL; 2161 bool writethrough, src_writethrough, image_opts = false, 2162 skip_create = false, progress = false, tgt_image_opts = false; 2163 int64_t ret = -EINVAL; 2164 bool force_share = false; 2165 bool explict_min_sparse = false; 2166 bool bitmaps = false; 2167 int64_t rate_limit = 0; 2168 2169 ImgConvertState s = (ImgConvertState) { 2170 /* Need at least 4k of zeros for sparse detection */ 2171 .min_sparse = 8, 2172 .copy_range = false, 2173 .buf_sectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE, 2174 .wr_in_order = true, 2175 .num_coroutines = 8, 2176 }; 2177 2178 for(;;) { 2179 static const struct option long_options[] = { 2180 {"help", no_argument, 0, 'h'}, 2181 {"object", required_argument, 0, OPTION_OBJECT}, 2182 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 2183 {"force-share", no_argument, 0, 'U'}, 2184 {"target-image-opts", no_argument, 0, OPTION_TARGET_IMAGE_OPTS}, 2185 {"salvage", no_argument, 0, OPTION_SALVAGE}, 2186 {"target-is-zero", no_argument, 0, OPTION_TARGET_IS_ZERO}, 2187 {"bitmaps", no_argument, 0, OPTION_BITMAPS}, 2188 {0, 0, 0, 0} 2189 }; 2190 c = getopt_long(argc, argv, ":hf:O:B:Cco:l:S:pt:T:qnm:WUr:", 2191 long_options, NULL); 2192 if (c == -1) { 2193 break; 2194 } 2195 switch(c) { 2196 case ':': 2197 missing_argument(argv[optind - 1]); 2198 break; 2199 case '?': 2200 unrecognized_option(argv[optind - 1]); 2201 break; 2202 case 'h': 2203 help(); 2204 break; 2205 case 'f': 2206 fmt = optarg; 2207 break; 2208 case 'O': 2209 out_fmt = optarg; 2210 break; 2211 case 'B': 2212 out_baseimg = optarg; 2213 break; 2214 case 'C': 2215 s.copy_range = true; 2216 break; 2217 case 'c': 2218 s.compressed = true; 2219 break; 2220 case 'o': 2221 if (accumulate_options(&options, optarg) < 0) { 2222 goto fail_getopt; 2223 } 2224 break; 2225 case 'l': 2226 if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) { 2227 sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts, 2228 optarg, false); 2229 if (!sn_opts) { 2230 error_report("Failed in parsing snapshot param '%s'", 2231 optarg); 2232 goto fail_getopt; 2233 } 2234 } else { 2235 snapshot_name = optarg; 2236 } 2237 break; 2238 case 'S': 2239 { 2240 int64_t sval; 2241 2242 sval = cvtnum("buffer size for sparse output", optarg); 2243 if (sval < 0) { 2244 goto fail_getopt; 2245 } else if (!QEMU_IS_ALIGNED(sval, BDRV_SECTOR_SIZE) || 2246 sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) { 2247 error_report("Invalid buffer size for sparse output specified. " 2248 "Valid sizes are multiples of %llu up to %llu. Select " 2249 "0 to disable sparse detection (fully allocates output).", 2250 BDRV_SECTOR_SIZE, MAX_BUF_SECTORS * BDRV_SECTOR_SIZE); 2251 goto fail_getopt; 2252 } 2253 2254 s.min_sparse = sval / BDRV_SECTOR_SIZE; 2255 explict_min_sparse = true; 2256 break; 2257 } 2258 case 'p': 2259 progress = true; 2260 break; 2261 case 't': 2262 cache = optarg; 2263 break; 2264 case 'T': 2265 src_cache = optarg; 2266 break; 2267 case 'q': 2268 s.quiet = true; 2269 break; 2270 case 'n': 2271 skip_create = true; 2272 break; 2273 case 'm': 2274 if (qemu_strtol(optarg, NULL, 0, &s.num_coroutines) || 2275 s.num_coroutines < 1 || s.num_coroutines > MAX_COROUTINES) { 2276 error_report("Invalid number of coroutines. Allowed number of" 2277 " coroutines is between 1 and %d", MAX_COROUTINES); 2278 goto fail_getopt; 2279 } 2280 break; 2281 case 'W': 2282 s.wr_in_order = false; 2283 break; 2284 case 'U': 2285 force_share = true; 2286 break; 2287 case 'r': 2288 rate_limit = cvtnum("rate limit", optarg); 2289 if (rate_limit < 0) { 2290 goto fail_getopt; 2291 } 2292 break; 2293 case OPTION_OBJECT: 2294 user_creatable_process_cmdline(optarg); 2295 break; 2296 case OPTION_IMAGE_OPTS: 2297 image_opts = true; 2298 break; 2299 case OPTION_SALVAGE: 2300 s.salvage = true; 2301 break; 2302 case OPTION_TARGET_IMAGE_OPTS: 2303 tgt_image_opts = true; 2304 break; 2305 case OPTION_TARGET_IS_ZERO: 2306 /* 2307 * The user asserting that the target is blank has the 2308 * same effect as the target driver supporting zero 2309 * initialisation. 2310 */ 2311 s.has_zero_init = true; 2312 break; 2313 case OPTION_BITMAPS: 2314 bitmaps = true; 2315 break; 2316 } 2317 } 2318 2319 if (!out_fmt && !tgt_image_opts) { 2320 out_fmt = "raw"; 2321 } 2322 2323 if (s.compressed && s.copy_range) { 2324 error_report("Cannot enable copy offloading when -c is used"); 2325 goto fail_getopt; 2326 } 2327 2328 if (explict_min_sparse && s.copy_range) { 2329 error_report("Cannot enable copy offloading when -S is used"); 2330 goto fail_getopt; 2331 } 2332 2333 if (s.copy_range && s.salvage) { 2334 error_report("Cannot use copy offloading in salvaging mode"); 2335 goto fail_getopt; 2336 } 2337 2338 if (tgt_image_opts && !skip_create) { 2339 error_report("--target-image-opts requires use of -n flag"); 2340 goto fail_getopt; 2341 } 2342 2343 if (skip_create && options) { 2344 error_report("-o has no effect when skipping image creation"); 2345 goto fail_getopt; 2346 } 2347 2348 if (s.has_zero_init && !skip_create) { 2349 error_report("--target-is-zero requires use of -n flag"); 2350 goto fail_getopt; 2351 } 2352 2353 s.src_num = argc - optind - 1; 2354 out_filename = s.src_num >= 1 ? argv[argc - 1] : NULL; 2355 2356 if (options && has_help_option(options)) { 2357 if (out_fmt) { 2358 ret = print_block_option_help(out_filename, out_fmt); 2359 goto fail_getopt; 2360 } else { 2361 error_report("Option help requires a format be specified"); 2362 goto fail_getopt; 2363 } 2364 } 2365 2366 if (s.src_num < 1) { 2367 error_report("Must specify image file name"); 2368 goto fail_getopt; 2369 } 2370 2371 /* ret is still -EINVAL until here */ 2372 ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough); 2373 if (ret < 0) { 2374 error_report("Invalid source cache option: %s", src_cache); 2375 goto fail_getopt; 2376 } 2377 2378 /* Initialize before goto out */ 2379 if (s.quiet) { 2380 progress = false; 2381 } 2382 qemu_progress_init(progress, 1.0); 2383 qemu_progress_print(0, 100); 2384 2385 s.src = g_new0(BlockBackend *, s.src_num); 2386 s.src_sectors = g_new(int64_t, s.src_num); 2387 s.src_alignment = g_new(int, s.src_num); 2388 2389 for (bs_i = 0; bs_i < s.src_num; bs_i++) { 2390 BlockDriverState *src_bs; 2391 s.src[bs_i] = img_open(image_opts, argv[optind + bs_i], 2392 fmt, src_flags, src_writethrough, s.quiet, 2393 force_share); 2394 if (!s.src[bs_i]) { 2395 ret = -1; 2396 goto out; 2397 } 2398 s.src_sectors[bs_i] = blk_nb_sectors(s.src[bs_i]); 2399 if (s.src_sectors[bs_i] < 0) { 2400 error_report("Could not get size of %s: %s", 2401 argv[optind + bs_i], strerror(-s.src_sectors[bs_i])); 2402 ret = -1; 2403 goto out; 2404 } 2405 src_bs = blk_bs(s.src[bs_i]); 2406 s.src_alignment[bs_i] = DIV_ROUND_UP(src_bs->bl.request_alignment, 2407 BDRV_SECTOR_SIZE); 2408 if (!bdrv_get_info(src_bs, &bdi)) { 2409 s.src_alignment[bs_i] = MAX(s.src_alignment[bs_i], 2410 bdi.cluster_size / BDRV_SECTOR_SIZE); 2411 } 2412 s.total_sectors += s.src_sectors[bs_i]; 2413 } 2414 2415 if (sn_opts) { 2416 bdrv_snapshot_load_tmp(blk_bs(s.src[0]), 2417 qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID), 2418 qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME), 2419 &local_err); 2420 } else if (snapshot_name != NULL) { 2421 if (s.src_num > 1) { 2422 error_report("No support for concatenating multiple snapshot"); 2423 ret = -1; 2424 goto out; 2425 } 2426 2427 bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(s.src[0]), snapshot_name, 2428 &local_err); 2429 } 2430 if (local_err) { 2431 error_reportf_err(local_err, "Failed to load snapshot: "); 2432 ret = -1; 2433 goto out; 2434 } 2435 2436 if (!skip_create) { 2437 /* Find driver and parse its options */ 2438 drv = bdrv_find_format(out_fmt); 2439 if (!drv) { 2440 error_report("Unknown file format '%s'", out_fmt); 2441 ret = -1; 2442 goto out; 2443 } 2444 2445 proto_drv = bdrv_find_protocol(out_filename, true, &local_err); 2446 if (!proto_drv) { 2447 error_report_err(local_err); 2448 ret = -1; 2449 goto out; 2450 } 2451 2452 if (!drv->create_opts) { 2453 error_report("Format driver '%s' does not support image creation", 2454 drv->format_name); 2455 ret = -1; 2456 goto out; 2457 } 2458 2459 if (!proto_drv->create_opts) { 2460 error_report("Protocol driver '%s' does not support image creation", 2461 proto_drv->format_name); 2462 ret = -1; 2463 goto out; 2464 } 2465 2466 create_opts = qemu_opts_append(create_opts, drv->create_opts); 2467 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts); 2468 2469 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort); 2470 if (options) { 2471 if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) { 2472 error_report_err(local_err); 2473 ret = -1; 2474 goto out; 2475 } 2476 } 2477 2478 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, 2479 s.total_sectors * BDRV_SECTOR_SIZE, &error_abort); 2480 ret = add_old_style_options(out_fmt, opts, out_baseimg, NULL); 2481 if (ret < 0) { 2482 goto out; 2483 } 2484 } 2485 2486 /* Get backing file name if -o backing_file was used */ 2487 out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE); 2488 if (out_baseimg_param) { 2489 out_baseimg = out_baseimg_param; 2490 } 2491 s.target_has_backing = (bool) out_baseimg; 2492 2493 if (s.has_zero_init && s.target_has_backing) { 2494 error_report("Cannot use --target-is-zero when the destination " 2495 "image has a backing file"); 2496 goto out; 2497 } 2498 2499 if (s.src_num > 1 && out_baseimg) { 2500 error_report("Having a backing file for the target makes no sense when " 2501 "concatenating multiple input images"); 2502 ret = -1; 2503 goto out; 2504 } 2505 2506 if (out_baseimg_param) { 2507 if (!qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT)) { 2508 warn_report("Deprecated use of backing file without explicit " 2509 "backing format"); 2510 } 2511 } 2512 2513 /* Check if compression is supported */ 2514 if (s.compressed) { 2515 bool encryption = 2516 qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false); 2517 const char *encryptfmt = 2518 qemu_opt_get(opts, BLOCK_OPT_ENCRYPT_FORMAT); 2519 const char *preallocation = 2520 qemu_opt_get(opts, BLOCK_OPT_PREALLOC); 2521 2522 if (drv && !block_driver_can_compress(drv)) { 2523 error_report("Compression not supported for this file format"); 2524 ret = -1; 2525 goto out; 2526 } 2527 2528 if (encryption || encryptfmt) { 2529 error_report("Compression and encryption not supported at " 2530 "the same time"); 2531 ret = -1; 2532 goto out; 2533 } 2534 2535 if (preallocation 2536 && strcmp(preallocation, "off")) 2537 { 2538 error_report("Compression and preallocation not supported at " 2539 "the same time"); 2540 ret = -1; 2541 goto out; 2542 } 2543 } 2544 2545 /* Determine if bitmaps need copying */ 2546 if (bitmaps) { 2547 if (s.src_num > 1) { 2548 error_report("Copying bitmaps only possible with single source"); 2549 ret = -1; 2550 goto out; 2551 } 2552 if (!bdrv_supports_persistent_dirty_bitmap(blk_bs(s.src[0]))) { 2553 error_report("Source lacks bitmap support"); 2554 ret = -1; 2555 goto out; 2556 } 2557 } 2558 2559 /* 2560 * The later open call will need any decryption secrets, and 2561 * bdrv_create() will purge "opts", so extract them now before 2562 * they are lost. 2563 */ 2564 if (!skip_create) { 2565 open_opts = qdict_new(); 2566 qemu_opt_foreach(opts, img_add_key_secrets, open_opts, &error_abort); 2567 2568 /* Create the new image */ 2569 ret = bdrv_create(drv, out_filename, opts, &local_err); 2570 if (ret < 0) { 2571 error_reportf_err(local_err, "%s: error while converting %s: ", 2572 out_filename, out_fmt); 2573 goto out; 2574 } 2575 } 2576 2577 s.target_is_new = !skip_create; 2578 2579 flags = s.min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR; 2580 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 2581 if (ret < 0) { 2582 error_report("Invalid cache option: %s", cache); 2583 goto out; 2584 } 2585 2586 if (skip_create) { 2587 s.target = img_open(tgt_image_opts, out_filename, out_fmt, 2588 flags, writethrough, s.quiet, false); 2589 } else { 2590 /* TODO ultimately we should allow --target-image-opts 2591 * to be used even when -n is not given. 2592 * That has to wait for bdrv_create to be improved 2593 * to allow filenames in option syntax 2594 */ 2595 s.target = img_open_file(out_filename, open_opts, out_fmt, 2596 flags, writethrough, s.quiet, false); 2597 open_opts = NULL; /* blk_new_open will have freed it */ 2598 } 2599 if (!s.target) { 2600 ret = -1; 2601 goto out; 2602 } 2603 out_bs = blk_bs(s.target); 2604 2605 if (bitmaps && !bdrv_supports_persistent_dirty_bitmap(out_bs)) { 2606 error_report("Format driver '%s' does not support bitmaps", 2607 out_bs->drv->format_name); 2608 ret = -1; 2609 goto out; 2610 } 2611 2612 if (s.compressed && !block_driver_can_compress(out_bs->drv)) { 2613 error_report("Compression not supported for this file format"); 2614 ret = -1; 2615 goto out; 2616 } 2617 2618 /* increase bufsectors from the default 4096 (2M) if opt_transfer 2619 * or discard_alignment of the out_bs is greater. Limit to 2620 * MAX_BUF_SECTORS as maximum which is currently 32768 (16MB). */ 2621 s.buf_sectors = MIN(MAX_BUF_SECTORS, 2622 MAX(s.buf_sectors, 2623 MAX(out_bs->bl.opt_transfer >> BDRV_SECTOR_BITS, 2624 out_bs->bl.pdiscard_alignment >> 2625 BDRV_SECTOR_BITS))); 2626 2627 /* try to align the write requests to the destination to avoid unnecessary 2628 * RMW cycles. */ 2629 s.alignment = MAX(pow2floor(s.min_sparse), 2630 DIV_ROUND_UP(out_bs->bl.request_alignment, 2631 BDRV_SECTOR_SIZE)); 2632 assert(is_power_of_2(s.alignment)); 2633 2634 if (skip_create) { 2635 int64_t output_sectors = blk_nb_sectors(s.target); 2636 if (output_sectors < 0) { 2637 error_report("unable to get output image length: %s", 2638 strerror(-output_sectors)); 2639 ret = -1; 2640 goto out; 2641 } else if (output_sectors < s.total_sectors) { 2642 error_report("output file is smaller than input file"); 2643 ret = -1; 2644 goto out; 2645 } 2646 } 2647 2648 if (s.target_has_backing && s.target_is_new) { 2649 /* Errors are treated as "backing length unknown" (which means 2650 * s.target_backing_sectors has to be negative, which it will 2651 * be automatically). The backing file length is used only 2652 * for optimizations, so such a case is not fatal. */ 2653 s.target_backing_sectors = 2654 bdrv_nb_sectors(bdrv_backing_chain_next(out_bs)); 2655 } else { 2656 s.target_backing_sectors = -1; 2657 } 2658 2659 ret = bdrv_get_info(out_bs, &bdi); 2660 if (ret < 0) { 2661 if (s.compressed) { 2662 error_report("could not get block driver info"); 2663 goto out; 2664 } 2665 } else { 2666 s.compressed = s.compressed || bdi.needs_compressed_writes; 2667 s.cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE; 2668 } 2669 2670 if (rate_limit) { 2671 set_rate_limit(s.target, rate_limit); 2672 } 2673 2674 ret = convert_do_copy(&s); 2675 2676 /* Now copy the bitmaps */ 2677 if (bitmaps && ret == 0) { 2678 ret = convert_copy_bitmaps(blk_bs(s.src[0]), out_bs); 2679 } 2680 2681 out: 2682 if (!ret) { 2683 qemu_progress_print(100, 0); 2684 } 2685 qemu_progress_end(); 2686 qemu_opts_del(opts); 2687 qemu_opts_free(create_opts); 2688 qobject_unref(open_opts); 2689 blk_unref(s.target); 2690 if (s.src) { 2691 for (bs_i = 0; bs_i < s.src_num; bs_i++) { 2692 blk_unref(s.src[bs_i]); 2693 } 2694 g_free(s.src); 2695 } 2696 g_free(s.src_sectors); 2697 g_free(s.src_alignment); 2698 fail_getopt: 2699 qemu_opts_del(sn_opts); 2700 g_free(options); 2701 2702 return !!ret; 2703 } 2704 2705 2706 static void dump_snapshots(BlockDriverState *bs) 2707 { 2708 QEMUSnapshotInfo *sn_tab, *sn; 2709 int nb_sns, i; 2710 2711 nb_sns = bdrv_snapshot_list(bs, &sn_tab); 2712 if (nb_sns <= 0) 2713 return; 2714 printf("Snapshot list:\n"); 2715 bdrv_snapshot_dump(NULL); 2716 printf("\n"); 2717 for(i = 0; i < nb_sns; i++) { 2718 sn = &sn_tab[i]; 2719 bdrv_snapshot_dump(sn); 2720 printf("\n"); 2721 } 2722 g_free(sn_tab); 2723 } 2724 2725 static void dump_json_image_info_list(ImageInfoList *list) 2726 { 2727 GString *str; 2728 QObject *obj; 2729 Visitor *v = qobject_output_visitor_new(&obj); 2730 2731 visit_type_ImageInfoList(v, NULL, &list, &error_abort); 2732 visit_complete(v, &obj); 2733 str = qobject_to_json_pretty(obj, true); 2734 assert(str != NULL); 2735 printf("%s\n", str->str); 2736 qobject_unref(obj); 2737 visit_free(v); 2738 g_string_free(str, true); 2739 } 2740 2741 static void dump_json_image_info(ImageInfo *info) 2742 { 2743 GString *str; 2744 QObject *obj; 2745 Visitor *v = qobject_output_visitor_new(&obj); 2746 2747 visit_type_ImageInfo(v, NULL, &info, &error_abort); 2748 visit_complete(v, &obj); 2749 str = qobject_to_json_pretty(obj, true); 2750 assert(str != NULL); 2751 printf("%s\n", str->str); 2752 qobject_unref(obj); 2753 visit_free(v); 2754 g_string_free(str, true); 2755 } 2756 2757 static void dump_human_image_info_list(ImageInfoList *list) 2758 { 2759 ImageInfoList *elem; 2760 bool delim = false; 2761 2762 for (elem = list; elem; elem = elem->next) { 2763 if (delim) { 2764 printf("\n"); 2765 } 2766 delim = true; 2767 2768 bdrv_image_info_dump(elem->value); 2769 } 2770 } 2771 2772 static gboolean str_equal_func(gconstpointer a, gconstpointer b) 2773 { 2774 return strcmp(a, b) == 0; 2775 } 2776 2777 /** 2778 * Open an image file chain and return an ImageInfoList 2779 * 2780 * @filename: topmost image filename 2781 * @fmt: topmost image format (may be NULL to autodetect) 2782 * @chain: true - enumerate entire backing file chain 2783 * false - only topmost image file 2784 * 2785 * Returns a list of ImageInfo objects or NULL if there was an error opening an 2786 * image file. If there was an error a message will have been printed to 2787 * stderr. 2788 */ 2789 static ImageInfoList *collect_image_info_list(bool image_opts, 2790 const char *filename, 2791 const char *fmt, 2792 bool chain, bool force_share) 2793 { 2794 ImageInfoList *head = NULL; 2795 ImageInfoList **tail = &head; 2796 GHashTable *filenames; 2797 Error *err = NULL; 2798 2799 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL); 2800 2801 while (filename) { 2802 BlockBackend *blk; 2803 BlockDriverState *bs; 2804 ImageInfo *info; 2805 2806 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) { 2807 error_report("Backing file '%s' creates an infinite loop.", 2808 filename); 2809 goto err; 2810 } 2811 g_hash_table_insert(filenames, (gpointer)filename, NULL); 2812 2813 blk = img_open(image_opts, filename, fmt, 2814 BDRV_O_NO_BACKING | BDRV_O_NO_IO, false, false, 2815 force_share); 2816 if (!blk) { 2817 goto err; 2818 } 2819 bs = blk_bs(blk); 2820 2821 bdrv_query_image_info(bs, &info, &err); 2822 if (err) { 2823 error_report_err(err); 2824 blk_unref(blk); 2825 goto err; 2826 } 2827 2828 QAPI_LIST_APPEND(tail, info); 2829 2830 blk_unref(blk); 2831 2832 /* Clear parameters that only apply to the topmost image */ 2833 filename = fmt = NULL; 2834 image_opts = false; 2835 2836 if (chain) { 2837 if (info->has_full_backing_filename) { 2838 filename = info->full_backing_filename; 2839 } else if (info->has_backing_filename) { 2840 error_report("Could not determine absolute backing filename," 2841 " but backing filename '%s' present", 2842 info->backing_filename); 2843 goto err; 2844 } 2845 if (info->has_backing_filename_format) { 2846 fmt = info->backing_filename_format; 2847 } 2848 } 2849 } 2850 g_hash_table_destroy(filenames); 2851 return head; 2852 2853 err: 2854 qapi_free_ImageInfoList(head); 2855 g_hash_table_destroy(filenames); 2856 return NULL; 2857 } 2858 2859 static int img_info(int argc, char **argv) 2860 { 2861 int c; 2862 OutputFormat output_format = OFORMAT_HUMAN; 2863 bool chain = false; 2864 const char *filename, *fmt, *output; 2865 ImageInfoList *list; 2866 bool image_opts = false; 2867 bool force_share = false; 2868 2869 fmt = NULL; 2870 output = NULL; 2871 for(;;) { 2872 int option_index = 0; 2873 static const struct option long_options[] = { 2874 {"help", no_argument, 0, 'h'}, 2875 {"format", required_argument, 0, 'f'}, 2876 {"output", required_argument, 0, OPTION_OUTPUT}, 2877 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN}, 2878 {"object", required_argument, 0, OPTION_OBJECT}, 2879 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 2880 {"force-share", no_argument, 0, 'U'}, 2881 {0, 0, 0, 0} 2882 }; 2883 c = getopt_long(argc, argv, ":f:hU", 2884 long_options, &option_index); 2885 if (c == -1) { 2886 break; 2887 } 2888 switch(c) { 2889 case ':': 2890 missing_argument(argv[optind - 1]); 2891 break; 2892 case '?': 2893 unrecognized_option(argv[optind - 1]); 2894 break; 2895 case 'h': 2896 help(); 2897 break; 2898 case 'f': 2899 fmt = optarg; 2900 break; 2901 case 'U': 2902 force_share = true; 2903 break; 2904 case OPTION_OUTPUT: 2905 output = optarg; 2906 break; 2907 case OPTION_BACKING_CHAIN: 2908 chain = true; 2909 break; 2910 case OPTION_OBJECT: 2911 user_creatable_process_cmdline(optarg); 2912 break; 2913 case OPTION_IMAGE_OPTS: 2914 image_opts = true; 2915 break; 2916 } 2917 } 2918 if (optind != argc - 1) { 2919 error_exit("Expecting one image file name"); 2920 } 2921 filename = argv[optind++]; 2922 2923 if (output && !strcmp(output, "json")) { 2924 output_format = OFORMAT_JSON; 2925 } else if (output && !strcmp(output, "human")) { 2926 output_format = OFORMAT_HUMAN; 2927 } else if (output) { 2928 error_report("--output must be used with human or json as argument."); 2929 return 1; 2930 } 2931 2932 list = collect_image_info_list(image_opts, filename, fmt, chain, 2933 force_share); 2934 if (!list) { 2935 return 1; 2936 } 2937 2938 switch (output_format) { 2939 case OFORMAT_HUMAN: 2940 dump_human_image_info_list(list); 2941 break; 2942 case OFORMAT_JSON: 2943 if (chain) { 2944 dump_json_image_info_list(list); 2945 } else { 2946 dump_json_image_info(list->value); 2947 } 2948 break; 2949 } 2950 2951 qapi_free_ImageInfoList(list); 2952 return 0; 2953 } 2954 2955 static int dump_map_entry(OutputFormat output_format, MapEntry *e, 2956 MapEntry *next) 2957 { 2958 switch (output_format) { 2959 case OFORMAT_HUMAN: 2960 if (e->data && !e->has_offset) { 2961 error_report("File contains external, encrypted or compressed clusters."); 2962 return -1; 2963 } 2964 if (e->data && !e->zero) { 2965 printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n", 2966 e->start, e->length, 2967 e->has_offset ? e->offset : 0, 2968 e->has_filename ? e->filename : ""); 2969 } 2970 /* This format ignores the distinction between 0, ZERO and ZERO|DATA. 2971 * Modify the flags here to allow more coalescing. 2972 */ 2973 if (next && (!next->data || next->zero)) { 2974 next->data = false; 2975 next->zero = true; 2976 } 2977 break; 2978 case OFORMAT_JSON: 2979 printf("{ \"start\": %"PRId64", \"length\": %"PRId64"," 2980 " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s", 2981 e->start, e->length, e->depth, 2982 e->zero ? "true" : "false", 2983 e->data ? "true" : "false"); 2984 if (e->has_offset) { 2985 printf(", \"offset\": %"PRId64"", e->offset); 2986 } 2987 putchar('}'); 2988 2989 if (next) { 2990 puts(","); 2991 } 2992 break; 2993 } 2994 return 0; 2995 } 2996 2997 static int get_block_status(BlockDriverState *bs, int64_t offset, 2998 int64_t bytes, MapEntry *e) 2999 { 3000 int ret; 3001 int depth; 3002 BlockDriverState *file; 3003 bool has_offset; 3004 int64_t map; 3005 char *filename = NULL; 3006 3007 /* As an optimization, we could cache the current range of unallocated 3008 * clusters in each file of the chain, and avoid querying the same 3009 * range repeatedly. 3010 */ 3011 3012 depth = 0; 3013 for (;;) { 3014 bs = bdrv_skip_filters(bs); 3015 ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file); 3016 if (ret < 0) { 3017 return ret; 3018 } 3019 assert(bytes); 3020 if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) { 3021 break; 3022 } 3023 bs = bdrv_cow_bs(bs); 3024 if (bs == NULL) { 3025 ret = 0; 3026 break; 3027 } 3028 3029 depth++; 3030 } 3031 3032 has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID); 3033 3034 if (file && has_offset) { 3035 bdrv_refresh_filename(file); 3036 filename = file->filename; 3037 } 3038 3039 *e = (MapEntry) { 3040 .start = offset, 3041 .length = bytes, 3042 .data = !!(ret & BDRV_BLOCK_DATA), 3043 .zero = !!(ret & BDRV_BLOCK_ZERO), 3044 .offset = map, 3045 .has_offset = has_offset, 3046 .depth = depth, 3047 .has_filename = filename, 3048 .filename = filename, 3049 }; 3050 3051 return 0; 3052 } 3053 3054 static inline bool entry_mergeable(const MapEntry *curr, const MapEntry *next) 3055 { 3056 if (curr->length == 0) { 3057 return false; 3058 } 3059 if (curr->zero != next->zero || 3060 curr->data != next->data || 3061 curr->depth != next->depth || 3062 curr->has_filename != next->has_filename || 3063 curr->has_offset != next->has_offset) { 3064 return false; 3065 } 3066 if (curr->has_filename && strcmp(curr->filename, next->filename)) { 3067 return false; 3068 } 3069 if (curr->has_offset && curr->offset + curr->length != next->offset) { 3070 return false; 3071 } 3072 return true; 3073 } 3074 3075 static int img_map(int argc, char **argv) 3076 { 3077 int c; 3078 OutputFormat output_format = OFORMAT_HUMAN; 3079 BlockBackend *blk; 3080 BlockDriverState *bs; 3081 const char *filename, *fmt, *output; 3082 int64_t length; 3083 MapEntry curr = { .length = 0 }, next; 3084 int ret = 0; 3085 bool image_opts = false; 3086 bool force_share = false; 3087 int64_t start_offset = 0; 3088 int64_t max_length = -1; 3089 3090 fmt = NULL; 3091 output = NULL; 3092 for (;;) { 3093 int option_index = 0; 3094 static const struct option long_options[] = { 3095 {"help", no_argument, 0, 'h'}, 3096 {"format", required_argument, 0, 'f'}, 3097 {"output", required_argument, 0, OPTION_OUTPUT}, 3098 {"object", required_argument, 0, OPTION_OBJECT}, 3099 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 3100 {"force-share", no_argument, 0, 'U'}, 3101 {"start-offset", required_argument, 0, 's'}, 3102 {"max-length", required_argument, 0, 'l'}, 3103 {0, 0, 0, 0} 3104 }; 3105 c = getopt_long(argc, argv, ":f:s:l:hU", 3106 long_options, &option_index); 3107 if (c == -1) { 3108 break; 3109 } 3110 switch (c) { 3111 case ':': 3112 missing_argument(argv[optind - 1]); 3113 break; 3114 case '?': 3115 unrecognized_option(argv[optind - 1]); 3116 break; 3117 case 'h': 3118 help(); 3119 break; 3120 case 'f': 3121 fmt = optarg; 3122 break; 3123 case 'U': 3124 force_share = true; 3125 break; 3126 case OPTION_OUTPUT: 3127 output = optarg; 3128 break; 3129 case 's': 3130 start_offset = cvtnum("start offset", optarg); 3131 if (start_offset < 0) { 3132 return 1; 3133 } 3134 break; 3135 case 'l': 3136 max_length = cvtnum("max length", optarg); 3137 if (max_length < 0) { 3138 return 1; 3139 } 3140 break; 3141 case OPTION_OBJECT: 3142 user_creatable_process_cmdline(optarg); 3143 break; 3144 case OPTION_IMAGE_OPTS: 3145 image_opts = true; 3146 break; 3147 } 3148 } 3149 if (optind != argc - 1) { 3150 error_exit("Expecting one image file name"); 3151 } 3152 filename = argv[optind]; 3153 3154 if (output && !strcmp(output, "json")) { 3155 output_format = OFORMAT_JSON; 3156 } else if (output && !strcmp(output, "human")) { 3157 output_format = OFORMAT_HUMAN; 3158 } else if (output) { 3159 error_report("--output must be used with human or json as argument."); 3160 return 1; 3161 } 3162 3163 blk = img_open(image_opts, filename, fmt, 0, false, false, force_share); 3164 if (!blk) { 3165 return 1; 3166 } 3167 bs = blk_bs(blk); 3168 3169 if (output_format == OFORMAT_HUMAN) { 3170 printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File"); 3171 } else if (output_format == OFORMAT_JSON) { 3172 putchar('['); 3173 } 3174 3175 length = blk_getlength(blk); 3176 if (length < 0) { 3177 error_report("Failed to get size for '%s'", filename); 3178 return 1; 3179 } 3180 if (max_length != -1) { 3181 length = MIN(start_offset + max_length, length); 3182 } 3183 3184 curr.start = start_offset; 3185 while (curr.start + curr.length < length) { 3186 int64_t offset = curr.start + curr.length; 3187 int64_t n = length - offset; 3188 3189 ret = get_block_status(bs, offset, n, &next); 3190 if (ret < 0) { 3191 error_report("Could not read file metadata: %s", strerror(-ret)); 3192 goto out; 3193 } 3194 3195 if (entry_mergeable(&curr, &next)) { 3196 curr.length += next.length; 3197 continue; 3198 } 3199 3200 if (curr.length > 0) { 3201 ret = dump_map_entry(output_format, &curr, &next); 3202 if (ret < 0) { 3203 goto out; 3204 } 3205 } 3206 curr = next; 3207 } 3208 3209 ret = dump_map_entry(output_format, &curr, NULL); 3210 if (output_format == OFORMAT_JSON) { 3211 puts("]"); 3212 } 3213 3214 out: 3215 blk_unref(blk); 3216 return ret < 0; 3217 } 3218 3219 #define SNAPSHOT_LIST 1 3220 #define SNAPSHOT_CREATE 2 3221 #define SNAPSHOT_APPLY 3 3222 #define SNAPSHOT_DELETE 4 3223 3224 static int img_snapshot(int argc, char **argv) 3225 { 3226 BlockBackend *blk; 3227 BlockDriverState *bs; 3228 QEMUSnapshotInfo sn; 3229 char *filename, *snapshot_name = NULL; 3230 int c, ret = 0, bdrv_oflags; 3231 int action = 0; 3232 qemu_timeval tv; 3233 bool quiet = false; 3234 Error *err = NULL; 3235 bool image_opts = false; 3236 bool force_share = false; 3237 3238 bdrv_oflags = BDRV_O_RDWR; 3239 /* Parse commandline parameters */ 3240 for(;;) { 3241 static const struct option long_options[] = { 3242 {"help", no_argument, 0, 'h'}, 3243 {"object", required_argument, 0, OPTION_OBJECT}, 3244 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 3245 {"force-share", no_argument, 0, 'U'}, 3246 {0, 0, 0, 0} 3247 }; 3248 c = getopt_long(argc, argv, ":la:c:d:hqU", 3249 long_options, NULL); 3250 if (c == -1) { 3251 break; 3252 } 3253 switch(c) { 3254 case ':': 3255 missing_argument(argv[optind - 1]); 3256 break; 3257 case '?': 3258 unrecognized_option(argv[optind - 1]); 3259 break; 3260 case 'h': 3261 help(); 3262 return 0; 3263 case 'l': 3264 if (action) { 3265 error_exit("Cannot mix '-l', '-a', '-c', '-d'"); 3266 return 0; 3267 } 3268 action = SNAPSHOT_LIST; 3269 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */ 3270 break; 3271 case 'a': 3272 if (action) { 3273 error_exit("Cannot mix '-l', '-a', '-c', '-d'"); 3274 return 0; 3275 } 3276 action = SNAPSHOT_APPLY; 3277 snapshot_name = optarg; 3278 break; 3279 case 'c': 3280 if (action) { 3281 error_exit("Cannot mix '-l', '-a', '-c', '-d'"); 3282 return 0; 3283 } 3284 action = SNAPSHOT_CREATE; 3285 snapshot_name = optarg; 3286 break; 3287 case 'd': 3288 if (action) { 3289 error_exit("Cannot mix '-l', '-a', '-c', '-d'"); 3290 return 0; 3291 } 3292 action = SNAPSHOT_DELETE; 3293 snapshot_name = optarg; 3294 break; 3295 case 'q': 3296 quiet = true; 3297 break; 3298 case 'U': 3299 force_share = true; 3300 break; 3301 case OPTION_OBJECT: 3302 user_creatable_process_cmdline(optarg); 3303 break; 3304 case OPTION_IMAGE_OPTS: 3305 image_opts = true; 3306 break; 3307 } 3308 } 3309 3310 if (optind != argc - 1) { 3311 error_exit("Expecting one image file name"); 3312 } 3313 filename = argv[optind++]; 3314 3315 /* Open the image */ 3316 blk = img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet, 3317 force_share); 3318 if (!blk) { 3319 return 1; 3320 } 3321 bs = blk_bs(blk); 3322 3323 /* Perform the requested action */ 3324 switch(action) { 3325 case SNAPSHOT_LIST: 3326 dump_snapshots(bs); 3327 break; 3328 3329 case SNAPSHOT_CREATE: 3330 memset(&sn, 0, sizeof(sn)); 3331 pstrcpy(sn.name, sizeof(sn.name), snapshot_name); 3332 3333 qemu_gettimeofday(&tv); 3334 sn.date_sec = tv.tv_sec; 3335 sn.date_nsec = tv.tv_usec * 1000; 3336 3337 ret = bdrv_snapshot_create(bs, &sn); 3338 if (ret) { 3339 error_report("Could not create snapshot '%s': %d (%s)", 3340 snapshot_name, ret, strerror(-ret)); 3341 } 3342 break; 3343 3344 case SNAPSHOT_APPLY: 3345 ret = bdrv_snapshot_goto(bs, snapshot_name, &err); 3346 if (ret) { 3347 error_reportf_err(err, "Could not apply snapshot '%s': ", 3348 snapshot_name); 3349 } 3350 break; 3351 3352 case SNAPSHOT_DELETE: 3353 ret = bdrv_snapshot_find(bs, &sn, snapshot_name); 3354 if (ret < 0) { 3355 error_report("Could not delete snapshot '%s': snapshot not " 3356 "found", snapshot_name); 3357 ret = 1; 3358 } else { 3359 ret = bdrv_snapshot_delete(bs, sn.id_str, sn.name, &err); 3360 if (ret < 0) { 3361 error_reportf_err(err, "Could not delete snapshot '%s': ", 3362 snapshot_name); 3363 ret = 1; 3364 } 3365 } 3366 break; 3367 } 3368 3369 /* Cleanup */ 3370 blk_unref(blk); 3371 if (ret) { 3372 return 1; 3373 } 3374 return 0; 3375 } 3376 3377 static int img_rebase(int argc, char **argv) 3378 { 3379 BlockBackend *blk = NULL, *blk_old_backing = NULL, *blk_new_backing = NULL; 3380 uint8_t *buf_old = NULL; 3381 uint8_t *buf_new = NULL; 3382 BlockDriverState *bs = NULL, *prefix_chain_bs = NULL; 3383 BlockDriverState *unfiltered_bs; 3384 char *filename; 3385 const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg; 3386 int c, flags, src_flags, ret; 3387 bool writethrough, src_writethrough; 3388 int unsafe = 0; 3389 bool force_share = false; 3390 int progress = 0; 3391 bool quiet = false; 3392 Error *local_err = NULL; 3393 bool image_opts = false; 3394 3395 /* Parse commandline parameters */ 3396 fmt = NULL; 3397 cache = BDRV_DEFAULT_CACHE; 3398 src_cache = BDRV_DEFAULT_CACHE; 3399 out_baseimg = NULL; 3400 out_basefmt = NULL; 3401 for(;;) { 3402 static const struct option long_options[] = { 3403 {"help", no_argument, 0, 'h'}, 3404 {"object", required_argument, 0, OPTION_OBJECT}, 3405 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 3406 {"force-share", no_argument, 0, 'U'}, 3407 {0, 0, 0, 0} 3408 }; 3409 c = getopt_long(argc, argv, ":hf:F:b:upt:T:qU", 3410 long_options, NULL); 3411 if (c == -1) { 3412 break; 3413 } 3414 switch(c) { 3415 case ':': 3416 missing_argument(argv[optind - 1]); 3417 break; 3418 case '?': 3419 unrecognized_option(argv[optind - 1]); 3420 break; 3421 case 'h': 3422 help(); 3423 return 0; 3424 case 'f': 3425 fmt = optarg; 3426 break; 3427 case 'F': 3428 out_basefmt = optarg; 3429 break; 3430 case 'b': 3431 out_baseimg = optarg; 3432 break; 3433 case 'u': 3434 unsafe = 1; 3435 break; 3436 case 'p': 3437 progress = 1; 3438 break; 3439 case 't': 3440 cache = optarg; 3441 break; 3442 case 'T': 3443 src_cache = optarg; 3444 break; 3445 case 'q': 3446 quiet = true; 3447 break; 3448 case OPTION_OBJECT: 3449 user_creatable_process_cmdline(optarg); 3450 break; 3451 case OPTION_IMAGE_OPTS: 3452 image_opts = true; 3453 break; 3454 case 'U': 3455 force_share = true; 3456 break; 3457 } 3458 } 3459 3460 if (quiet) { 3461 progress = 0; 3462 } 3463 3464 if (optind != argc - 1) { 3465 error_exit("Expecting one image file name"); 3466 } 3467 if (!unsafe && !out_baseimg) { 3468 error_exit("Must specify backing file (-b) or use unsafe mode (-u)"); 3469 } 3470 filename = argv[optind++]; 3471 3472 qemu_progress_init(progress, 2.0); 3473 qemu_progress_print(0, 100); 3474 3475 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0); 3476 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 3477 if (ret < 0) { 3478 error_report("Invalid cache option: %s", cache); 3479 goto out; 3480 } 3481 3482 src_flags = 0; 3483 ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough); 3484 if (ret < 0) { 3485 error_report("Invalid source cache option: %s", src_cache); 3486 goto out; 3487 } 3488 3489 /* The source files are opened read-only, don't care about WCE */ 3490 assert((src_flags & BDRV_O_RDWR) == 0); 3491 (void) src_writethrough; 3492 3493 /* 3494 * Open the images. 3495 * 3496 * Ignore the old backing file for unsafe rebase in case we want to correct 3497 * the reference to a renamed or moved backing file. 3498 */ 3499 blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet, 3500 false); 3501 if (!blk) { 3502 ret = -1; 3503 goto out; 3504 } 3505 bs = blk_bs(blk); 3506 3507 unfiltered_bs = bdrv_skip_filters(bs); 3508 3509 if (out_basefmt != NULL) { 3510 if (bdrv_find_format(out_basefmt) == NULL) { 3511 error_report("Invalid format name: '%s'", out_basefmt); 3512 ret = -1; 3513 goto out; 3514 } 3515 } 3516 3517 /* For safe rebasing we need to compare old and new backing file */ 3518 if (!unsafe) { 3519 QDict *options = NULL; 3520 BlockDriverState *base_bs = bdrv_cow_bs(unfiltered_bs); 3521 3522 if (base_bs) { 3523 blk_old_backing = blk_new(qemu_get_aio_context(), 3524 BLK_PERM_CONSISTENT_READ, 3525 BLK_PERM_ALL); 3526 ret = blk_insert_bs(blk_old_backing, base_bs, 3527 &local_err); 3528 if (ret < 0) { 3529 error_reportf_err(local_err, 3530 "Could not reuse old backing file '%s': ", 3531 base_bs->filename); 3532 goto out; 3533 } 3534 } else { 3535 blk_old_backing = NULL; 3536 } 3537 3538 if (out_baseimg[0]) { 3539 const char *overlay_filename; 3540 char *out_real_path; 3541 3542 options = qdict_new(); 3543 if (out_basefmt) { 3544 qdict_put_str(options, "driver", out_basefmt); 3545 } 3546 if (force_share) { 3547 qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true); 3548 } 3549 3550 bdrv_refresh_filename(bs); 3551 overlay_filename = bs->exact_filename[0] ? bs->exact_filename 3552 : bs->filename; 3553 out_real_path = 3554 bdrv_get_full_backing_filename_from_filename(overlay_filename, 3555 out_baseimg, 3556 &local_err); 3557 if (local_err) { 3558 qobject_unref(options); 3559 error_reportf_err(local_err, 3560 "Could not resolve backing filename: "); 3561 ret = -1; 3562 goto out; 3563 } 3564 3565 /* 3566 * Find out whether we rebase an image on top of a previous image 3567 * in its chain. 3568 */ 3569 prefix_chain_bs = bdrv_find_backing_image(bs, out_real_path); 3570 if (prefix_chain_bs) { 3571 qobject_unref(options); 3572 g_free(out_real_path); 3573 3574 blk_new_backing = blk_new(qemu_get_aio_context(), 3575 BLK_PERM_CONSISTENT_READ, 3576 BLK_PERM_ALL); 3577 ret = blk_insert_bs(blk_new_backing, prefix_chain_bs, 3578 &local_err); 3579 if (ret < 0) { 3580 error_reportf_err(local_err, 3581 "Could not reuse backing file '%s': ", 3582 out_baseimg); 3583 goto out; 3584 } 3585 } else { 3586 blk_new_backing = blk_new_open(out_real_path, NULL, 3587 options, src_flags, &local_err); 3588 g_free(out_real_path); 3589 if (!blk_new_backing) { 3590 error_reportf_err(local_err, 3591 "Could not open new backing file '%s': ", 3592 out_baseimg); 3593 ret = -1; 3594 goto out; 3595 } 3596 } 3597 } 3598 } 3599 3600 /* 3601 * Check each unallocated cluster in the COW file. If it is unallocated, 3602 * accesses go to the backing file. We must therefore compare this cluster 3603 * in the old and new backing file, and if they differ we need to copy it 3604 * from the old backing file into the COW file. 3605 * 3606 * If qemu-img crashes during this step, no harm is done. The content of 3607 * the image is the same as the original one at any time. 3608 */ 3609 if (!unsafe) { 3610 int64_t size; 3611 int64_t old_backing_size = 0; 3612 int64_t new_backing_size = 0; 3613 uint64_t offset; 3614 int64_t n; 3615 float local_progress = 0; 3616 3617 buf_old = blk_blockalign(blk, IO_BUF_SIZE); 3618 buf_new = blk_blockalign(blk, IO_BUF_SIZE); 3619 3620 size = blk_getlength(blk); 3621 if (size < 0) { 3622 error_report("Could not get size of '%s': %s", 3623 filename, strerror(-size)); 3624 ret = -1; 3625 goto out; 3626 } 3627 if (blk_old_backing) { 3628 old_backing_size = blk_getlength(blk_old_backing); 3629 if (old_backing_size < 0) { 3630 char backing_name[PATH_MAX]; 3631 3632 bdrv_get_backing_filename(bs, backing_name, 3633 sizeof(backing_name)); 3634 error_report("Could not get size of '%s': %s", 3635 backing_name, strerror(-old_backing_size)); 3636 ret = -1; 3637 goto out; 3638 } 3639 } 3640 if (blk_new_backing) { 3641 new_backing_size = blk_getlength(blk_new_backing); 3642 if (new_backing_size < 0) { 3643 error_report("Could not get size of '%s': %s", 3644 out_baseimg, strerror(-new_backing_size)); 3645 ret = -1; 3646 goto out; 3647 } 3648 } 3649 3650 if (size != 0) { 3651 local_progress = (float)100 / (size / MIN(size, IO_BUF_SIZE)); 3652 } 3653 3654 for (offset = 0; offset < size; offset += n) { 3655 bool buf_old_is_zero = false; 3656 3657 /* How many bytes can we handle with the next read? */ 3658 n = MIN(IO_BUF_SIZE, size - offset); 3659 3660 /* If the cluster is allocated, we don't need to take action */ 3661 ret = bdrv_is_allocated(unfiltered_bs, offset, n, &n); 3662 if (ret < 0) { 3663 error_report("error while reading image metadata: %s", 3664 strerror(-ret)); 3665 goto out; 3666 } 3667 if (ret) { 3668 continue; 3669 } 3670 3671 if (prefix_chain_bs) { 3672 /* 3673 * If cluster wasn't changed since prefix_chain, we don't need 3674 * to take action 3675 */ 3676 ret = bdrv_is_allocated_above(bdrv_cow_bs(unfiltered_bs), 3677 prefix_chain_bs, false, 3678 offset, n, &n); 3679 if (ret < 0) { 3680 error_report("error while reading image metadata: %s", 3681 strerror(-ret)); 3682 goto out; 3683 } 3684 if (!ret) { 3685 continue; 3686 } 3687 } 3688 3689 /* 3690 * Read old and new backing file and take into consideration that 3691 * backing files may be smaller than the COW image. 3692 */ 3693 if (offset >= old_backing_size) { 3694 memset(buf_old, 0, n); 3695 buf_old_is_zero = true; 3696 } else { 3697 if (offset + n > old_backing_size) { 3698 n = old_backing_size - offset; 3699 } 3700 3701 ret = blk_pread(blk_old_backing, offset, buf_old, n); 3702 if (ret < 0) { 3703 error_report("error while reading from old backing file"); 3704 goto out; 3705 } 3706 } 3707 3708 if (offset >= new_backing_size || !blk_new_backing) { 3709 memset(buf_new, 0, n); 3710 } else { 3711 if (offset + n > new_backing_size) { 3712 n = new_backing_size - offset; 3713 } 3714 3715 ret = blk_pread(blk_new_backing, offset, buf_new, n); 3716 if (ret < 0) { 3717 error_report("error while reading from new backing file"); 3718 goto out; 3719 } 3720 } 3721 3722 /* If they differ, we need to write to the COW file */ 3723 uint64_t written = 0; 3724 3725 while (written < n) { 3726 int64_t pnum; 3727 3728 if (compare_buffers(buf_old + written, buf_new + written, 3729 n - written, &pnum)) 3730 { 3731 if (buf_old_is_zero) { 3732 ret = blk_pwrite_zeroes(blk, offset + written, pnum, 0); 3733 } else { 3734 ret = blk_pwrite(blk, offset + written, 3735 buf_old + written, pnum, 0); 3736 } 3737 if (ret < 0) { 3738 error_report("Error while writing to COW image: %s", 3739 strerror(-ret)); 3740 goto out; 3741 } 3742 } 3743 3744 written += pnum; 3745 } 3746 qemu_progress_print(local_progress, 100); 3747 } 3748 } 3749 3750 /* 3751 * Change the backing file. All clusters that are different from the old 3752 * backing file are overwritten in the COW file now, so the visible content 3753 * doesn't change when we switch the backing file. 3754 */ 3755 if (out_baseimg && *out_baseimg) { 3756 ret = bdrv_change_backing_file(unfiltered_bs, out_baseimg, out_basefmt, 3757 true); 3758 } else { 3759 ret = bdrv_change_backing_file(unfiltered_bs, NULL, NULL, false); 3760 } 3761 3762 if (ret == -ENOSPC) { 3763 error_report("Could not change the backing file to '%s': No " 3764 "space left in the file header", out_baseimg); 3765 } else if (ret < 0) { 3766 error_report("Could not change the backing file to '%s': %s", 3767 out_baseimg, strerror(-ret)); 3768 } 3769 3770 qemu_progress_print(100, 0); 3771 /* 3772 * TODO At this point it is possible to check if any clusters that are 3773 * allocated in the COW file are the same in the backing file. If so, they 3774 * could be dropped from the COW file. Don't do this before switching the 3775 * backing file, in case of a crash this would lead to corruption. 3776 */ 3777 out: 3778 qemu_progress_end(); 3779 /* Cleanup */ 3780 if (!unsafe) { 3781 blk_unref(blk_old_backing); 3782 blk_unref(blk_new_backing); 3783 } 3784 qemu_vfree(buf_old); 3785 qemu_vfree(buf_new); 3786 3787 blk_unref(blk); 3788 if (ret) { 3789 return 1; 3790 } 3791 return 0; 3792 } 3793 3794 static int img_resize(int argc, char **argv) 3795 { 3796 Error *err = NULL; 3797 int c, ret, relative; 3798 const char *filename, *fmt, *size; 3799 int64_t n, total_size, current_size; 3800 bool quiet = false; 3801 BlockBackend *blk = NULL; 3802 PreallocMode prealloc = PREALLOC_MODE_OFF; 3803 QemuOpts *param; 3804 3805 static QemuOptsList resize_options = { 3806 .name = "resize_options", 3807 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head), 3808 .desc = { 3809 { 3810 .name = BLOCK_OPT_SIZE, 3811 .type = QEMU_OPT_SIZE, 3812 .help = "Virtual disk size" 3813 }, { 3814 /* end of list */ 3815 } 3816 }, 3817 }; 3818 bool image_opts = false; 3819 bool shrink = false; 3820 3821 /* Remove size from argv manually so that negative numbers are not treated 3822 * as options by getopt. */ 3823 if (argc < 3) { 3824 error_exit("Not enough arguments"); 3825 return 1; 3826 } 3827 3828 size = argv[--argc]; 3829 3830 /* Parse getopt arguments */ 3831 fmt = NULL; 3832 for(;;) { 3833 static const struct option long_options[] = { 3834 {"help", no_argument, 0, 'h'}, 3835 {"object", required_argument, 0, OPTION_OBJECT}, 3836 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 3837 {"preallocation", required_argument, 0, OPTION_PREALLOCATION}, 3838 {"shrink", no_argument, 0, OPTION_SHRINK}, 3839 {0, 0, 0, 0} 3840 }; 3841 c = getopt_long(argc, argv, ":f:hq", 3842 long_options, NULL); 3843 if (c == -1) { 3844 break; 3845 } 3846 switch(c) { 3847 case ':': 3848 missing_argument(argv[optind - 1]); 3849 break; 3850 case '?': 3851 unrecognized_option(argv[optind - 1]); 3852 break; 3853 case 'h': 3854 help(); 3855 break; 3856 case 'f': 3857 fmt = optarg; 3858 break; 3859 case 'q': 3860 quiet = true; 3861 break; 3862 case OPTION_OBJECT: 3863 user_creatable_process_cmdline(optarg); 3864 break; 3865 case OPTION_IMAGE_OPTS: 3866 image_opts = true; 3867 break; 3868 case OPTION_PREALLOCATION: 3869 prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg, 3870 PREALLOC_MODE__MAX, NULL); 3871 if (prealloc == PREALLOC_MODE__MAX) { 3872 error_report("Invalid preallocation mode '%s'", optarg); 3873 return 1; 3874 } 3875 break; 3876 case OPTION_SHRINK: 3877 shrink = true; 3878 break; 3879 } 3880 } 3881 if (optind != argc - 1) { 3882 error_exit("Expecting image file name and size"); 3883 } 3884 filename = argv[optind++]; 3885 3886 /* Choose grow, shrink, or absolute resize mode */ 3887 switch (size[0]) { 3888 case '+': 3889 relative = 1; 3890 size++; 3891 break; 3892 case '-': 3893 relative = -1; 3894 size++; 3895 break; 3896 default: 3897 relative = 0; 3898 break; 3899 } 3900 3901 /* Parse size */ 3902 param = qemu_opts_create(&resize_options, NULL, 0, &error_abort); 3903 if (!qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err)) { 3904 error_report_err(err); 3905 ret = -1; 3906 qemu_opts_del(param); 3907 goto out; 3908 } 3909 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0); 3910 qemu_opts_del(param); 3911 3912 blk = img_open(image_opts, filename, fmt, 3913 BDRV_O_RDWR | BDRV_O_RESIZE, false, quiet, 3914 false); 3915 if (!blk) { 3916 ret = -1; 3917 goto out; 3918 } 3919 3920 current_size = blk_getlength(blk); 3921 if (current_size < 0) { 3922 error_report("Failed to inquire current image length: %s", 3923 strerror(-current_size)); 3924 ret = -1; 3925 goto out; 3926 } 3927 3928 if (relative) { 3929 total_size = current_size + n * relative; 3930 } else { 3931 total_size = n; 3932 } 3933 if (total_size <= 0) { 3934 error_report("New image size must be positive"); 3935 ret = -1; 3936 goto out; 3937 } 3938 3939 if (total_size <= current_size && prealloc != PREALLOC_MODE_OFF) { 3940 error_report("Preallocation can only be used for growing images"); 3941 ret = -1; 3942 goto out; 3943 } 3944 3945 if (total_size < current_size && !shrink) { 3946 error_report("Use the --shrink option to perform a shrink operation."); 3947 warn_report("Shrinking an image will delete all data beyond the " 3948 "shrunken image's end. Before performing such an " 3949 "operation, make sure there is no important data there."); 3950 ret = -1; 3951 goto out; 3952 } 3953 3954 /* 3955 * The user expects the image to have the desired size after 3956 * resizing, so pass @exact=true. It is of no use to report 3957 * success when the image has not actually been resized. 3958 */ 3959 ret = blk_truncate(blk, total_size, true, prealloc, 0, &err); 3960 if (!ret) { 3961 qprintf(quiet, "Image resized.\n"); 3962 } else { 3963 error_report_err(err); 3964 } 3965 out: 3966 blk_unref(blk); 3967 if (ret) { 3968 return 1; 3969 } 3970 return 0; 3971 } 3972 3973 static void amend_status_cb(BlockDriverState *bs, 3974 int64_t offset, int64_t total_work_size, 3975 void *opaque) 3976 { 3977 qemu_progress_print(100.f * offset / total_work_size, 0); 3978 } 3979 3980 static int print_amend_option_help(const char *format) 3981 { 3982 BlockDriver *drv; 3983 3984 /* Find driver and parse its options */ 3985 drv = bdrv_find_format(format); 3986 if (!drv) { 3987 error_report("Unknown file format '%s'", format); 3988 return 1; 3989 } 3990 3991 if (!drv->bdrv_amend_options) { 3992 error_report("Format driver '%s' does not support option amendment", 3993 format); 3994 return 1; 3995 } 3996 3997 /* Every driver supporting amendment must have amend_opts */ 3998 assert(drv->amend_opts); 3999 4000 printf("Amend options for '%s':\n", format); 4001 qemu_opts_print_help(drv->amend_opts, false); 4002 return 0; 4003 } 4004 4005 static int img_amend(int argc, char **argv) 4006 { 4007 Error *err = NULL; 4008 int c, ret = 0; 4009 char *options = NULL; 4010 QemuOptsList *amend_opts = NULL; 4011 QemuOpts *opts = NULL; 4012 const char *fmt = NULL, *filename, *cache; 4013 int flags; 4014 bool writethrough; 4015 bool quiet = false, progress = false; 4016 BlockBackend *blk = NULL; 4017 BlockDriverState *bs = NULL; 4018 bool image_opts = false; 4019 bool force = false; 4020 4021 cache = BDRV_DEFAULT_CACHE; 4022 for (;;) { 4023 static const struct option long_options[] = { 4024 {"help", no_argument, 0, 'h'}, 4025 {"object", required_argument, 0, OPTION_OBJECT}, 4026 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 4027 {"force", no_argument, 0, OPTION_FORCE}, 4028 {0, 0, 0, 0} 4029 }; 4030 c = getopt_long(argc, argv, ":ho:f:t:pq", 4031 long_options, NULL); 4032 if (c == -1) { 4033 break; 4034 } 4035 4036 switch (c) { 4037 case ':': 4038 missing_argument(argv[optind - 1]); 4039 break; 4040 case '?': 4041 unrecognized_option(argv[optind - 1]); 4042 break; 4043 case 'h': 4044 help(); 4045 break; 4046 case 'o': 4047 if (accumulate_options(&options, optarg) < 0) { 4048 ret = -1; 4049 goto out_no_progress; 4050 } 4051 break; 4052 case 'f': 4053 fmt = optarg; 4054 break; 4055 case 't': 4056 cache = optarg; 4057 break; 4058 case 'p': 4059 progress = true; 4060 break; 4061 case 'q': 4062 quiet = true; 4063 break; 4064 case OPTION_OBJECT: 4065 user_creatable_process_cmdline(optarg); 4066 break; 4067 case OPTION_IMAGE_OPTS: 4068 image_opts = true; 4069 break; 4070 case OPTION_FORCE: 4071 force = true; 4072 break; 4073 } 4074 } 4075 4076 if (!options) { 4077 error_exit("Must specify options (-o)"); 4078 } 4079 4080 if (quiet) { 4081 progress = false; 4082 } 4083 qemu_progress_init(progress, 1.0); 4084 4085 filename = (optind == argc - 1) ? argv[argc - 1] : NULL; 4086 if (fmt && has_help_option(options)) { 4087 /* If a format is explicitly specified (and possibly no filename is 4088 * given), print option help here */ 4089 ret = print_amend_option_help(fmt); 4090 goto out; 4091 } 4092 4093 if (optind != argc - 1) { 4094 error_report("Expecting one image file name"); 4095 ret = -1; 4096 goto out; 4097 } 4098 4099 flags = BDRV_O_RDWR; 4100 ret = bdrv_parse_cache_mode(cache, &flags, &writethrough); 4101 if (ret < 0) { 4102 error_report("Invalid cache option: %s", cache); 4103 goto out; 4104 } 4105 4106 blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet, 4107 false); 4108 if (!blk) { 4109 ret = -1; 4110 goto out; 4111 } 4112 bs = blk_bs(blk); 4113 4114 fmt = bs->drv->format_name; 4115 4116 if (has_help_option(options)) { 4117 /* If the format was auto-detected, print option help here */ 4118 ret = print_amend_option_help(fmt); 4119 goto out; 4120 } 4121 4122 if (!bs->drv->bdrv_amend_options) { 4123 error_report("Format driver '%s' does not support option amendment", 4124 fmt); 4125 ret = -1; 4126 goto out; 4127 } 4128 4129 /* Every driver supporting amendment must have amend_opts */ 4130 assert(bs->drv->amend_opts); 4131 4132 amend_opts = qemu_opts_append(amend_opts, bs->drv->amend_opts); 4133 opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort); 4134 if (!qemu_opts_do_parse(opts, options, NULL, &err)) { 4135 /* Try to parse options using the create options */ 4136 amend_opts = qemu_opts_append(amend_opts, bs->drv->create_opts); 4137 qemu_opts_del(opts); 4138 opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort); 4139 if (qemu_opts_do_parse(opts, options, NULL, NULL)) { 4140 error_append_hint(&err, 4141 "This option is only supported for image creation\n"); 4142 } 4143 4144 error_report_err(err); 4145 ret = -1; 4146 goto out; 4147 } 4148 4149 /* In case the driver does not call amend_status_cb() */ 4150 qemu_progress_print(0.f, 0); 4151 ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL, force, &err); 4152 qemu_progress_print(100.f, 0); 4153 if (ret < 0) { 4154 error_report_err(err); 4155 goto out; 4156 } 4157 4158 out: 4159 qemu_progress_end(); 4160 4161 out_no_progress: 4162 blk_unref(blk); 4163 qemu_opts_del(opts); 4164 qemu_opts_free(amend_opts); 4165 g_free(options); 4166 4167 if (ret) { 4168 return 1; 4169 } 4170 return 0; 4171 } 4172 4173 typedef struct BenchData { 4174 BlockBackend *blk; 4175 uint64_t image_size; 4176 bool write; 4177 int bufsize; 4178 int step; 4179 int nrreq; 4180 int n; 4181 int flush_interval; 4182 bool drain_on_flush; 4183 uint8_t *buf; 4184 QEMUIOVector *qiov; 4185 4186 int in_flight; 4187 bool in_flush; 4188 uint64_t offset; 4189 } BenchData; 4190 4191 static void bench_undrained_flush_cb(void *opaque, int ret) 4192 { 4193 if (ret < 0) { 4194 error_report("Failed flush request: %s", strerror(-ret)); 4195 exit(EXIT_FAILURE); 4196 } 4197 } 4198 4199 static void bench_cb(void *opaque, int ret) 4200 { 4201 BenchData *b = opaque; 4202 BlockAIOCB *acb; 4203 4204 if (ret < 0) { 4205 error_report("Failed request: %s", strerror(-ret)); 4206 exit(EXIT_FAILURE); 4207 } 4208 4209 if (b->in_flush) { 4210 /* Just finished a flush with drained queue: Start next requests */ 4211 assert(b->in_flight == 0); 4212 b->in_flush = false; 4213 } else if (b->in_flight > 0) { 4214 int remaining = b->n - b->in_flight; 4215 4216 b->n--; 4217 b->in_flight--; 4218 4219 /* Time for flush? Drain queue if requested, then flush */ 4220 if (b->flush_interval && remaining % b->flush_interval == 0) { 4221 if (!b->in_flight || !b->drain_on_flush) { 4222 BlockCompletionFunc *cb; 4223 4224 if (b->drain_on_flush) { 4225 b->in_flush = true; 4226 cb = bench_cb; 4227 } else { 4228 cb = bench_undrained_flush_cb; 4229 } 4230 4231 acb = blk_aio_flush(b->blk, cb, b); 4232 if (!acb) { 4233 error_report("Failed to issue flush request"); 4234 exit(EXIT_FAILURE); 4235 } 4236 } 4237 if (b->drain_on_flush) { 4238 return; 4239 } 4240 } 4241 } 4242 4243 while (b->n > b->in_flight && b->in_flight < b->nrreq) { 4244 int64_t offset = b->offset; 4245 /* blk_aio_* might look for completed I/Os and kick bench_cb 4246 * again, so make sure this operation is counted by in_flight 4247 * and b->offset is ready for the next submission. 4248 */ 4249 b->in_flight++; 4250 b->offset += b->step; 4251 b->offset %= b->image_size; 4252 if (b->write) { 4253 acb = blk_aio_pwritev(b->blk, offset, b->qiov, 0, bench_cb, b); 4254 } else { 4255 acb = blk_aio_preadv(b->blk, offset, b->qiov, 0, bench_cb, b); 4256 } 4257 if (!acb) { 4258 error_report("Failed to issue request"); 4259 exit(EXIT_FAILURE); 4260 } 4261 } 4262 } 4263 4264 static int img_bench(int argc, char **argv) 4265 { 4266 int c, ret = 0; 4267 const char *fmt = NULL, *filename; 4268 bool quiet = false; 4269 bool image_opts = false; 4270 bool is_write = false; 4271 int count = 75000; 4272 int depth = 64; 4273 int64_t offset = 0; 4274 size_t bufsize = 4096; 4275 int pattern = 0; 4276 size_t step = 0; 4277 int flush_interval = 0; 4278 bool drain_on_flush = true; 4279 int64_t image_size; 4280 BlockBackend *blk = NULL; 4281 BenchData data = {}; 4282 int flags = 0; 4283 bool writethrough = false; 4284 struct timeval t1, t2; 4285 int i; 4286 bool force_share = false; 4287 size_t buf_size; 4288 4289 for (;;) { 4290 static const struct option long_options[] = { 4291 {"help", no_argument, 0, 'h'}, 4292 {"flush-interval", required_argument, 0, OPTION_FLUSH_INTERVAL}, 4293 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 4294 {"pattern", required_argument, 0, OPTION_PATTERN}, 4295 {"no-drain", no_argument, 0, OPTION_NO_DRAIN}, 4296 {"force-share", no_argument, 0, 'U'}, 4297 {0, 0, 0, 0} 4298 }; 4299 c = getopt_long(argc, argv, ":hc:d:f:ni:o:qs:S:t:wU", long_options, 4300 NULL); 4301 if (c == -1) { 4302 break; 4303 } 4304 4305 switch (c) { 4306 case ':': 4307 missing_argument(argv[optind - 1]); 4308 break; 4309 case '?': 4310 unrecognized_option(argv[optind - 1]); 4311 break; 4312 case 'h': 4313 help(); 4314 break; 4315 case 'c': 4316 { 4317 unsigned long res; 4318 4319 if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) { 4320 error_report("Invalid request count specified"); 4321 return 1; 4322 } 4323 count = res; 4324 break; 4325 } 4326 case 'd': 4327 { 4328 unsigned long res; 4329 4330 if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) { 4331 error_report("Invalid queue depth specified"); 4332 return 1; 4333 } 4334 depth = res; 4335 break; 4336 } 4337 case 'f': 4338 fmt = optarg; 4339 break; 4340 case 'n': 4341 flags |= BDRV_O_NATIVE_AIO; 4342 break; 4343 case 'i': 4344 ret = bdrv_parse_aio(optarg, &flags); 4345 if (ret < 0) { 4346 error_report("Invalid aio option: %s", optarg); 4347 ret = -1; 4348 goto out; 4349 } 4350 break; 4351 case 'o': 4352 { 4353 offset = cvtnum("offset", optarg); 4354 if (offset < 0) { 4355 return 1; 4356 } 4357 break; 4358 } 4359 break; 4360 case 'q': 4361 quiet = true; 4362 break; 4363 case 's': 4364 { 4365 int64_t sval; 4366 4367 sval = cvtnum_full("buffer size", optarg, 0, INT_MAX); 4368 if (sval < 0) { 4369 return 1; 4370 } 4371 4372 bufsize = sval; 4373 break; 4374 } 4375 case 'S': 4376 { 4377 int64_t sval; 4378 4379 sval = cvtnum_full("step_size", optarg, 0, INT_MAX); 4380 if (sval < 0) { 4381 return 1; 4382 } 4383 4384 step = sval; 4385 break; 4386 } 4387 case 't': 4388 ret = bdrv_parse_cache_mode(optarg, &flags, &writethrough); 4389 if (ret < 0) { 4390 error_report("Invalid cache mode"); 4391 ret = -1; 4392 goto out; 4393 } 4394 break; 4395 case 'w': 4396 flags |= BDRV_O_RDWR; 4397 is_write = true; 4398 break; 4399 case 'U': 4400 force_share = true; 4401 break; 4402 case OPTION_PATTERN: 4403 { 4404 unsigned long res; 4405 4406 if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > 0xff) { 4407 error_report("Invalid pattern byte specified"); 4408 return 1; 4409 } 4410 pattern = res; 4411 break; 4412 } 4413 case OPTION_FLUSH_INTERVAL: 4414 { 4415 unsigned long res; 4416 4417 if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) { 4418 error_report("Invalid flush interval specified"); 4419 return 1; 4420 } 4421 flush_interval = res; 4422 break; 4423 } 4424 case OPTION_NO_DRAIN: 4425 drain_on_flush = false; 4426 break; 4427 case OPTION_IMAGE_OPTS: 4428 image_opts = true; 4429 break; 4430 } 4431 } 4432 4433 if (optind != argc - 1) { 4434 error_exit("Expecting one image file name"); 4435 } 4436 filename = argv[argc - 1]; 4437 4438 if (!is_write && flush_interval) { 4439 error_report("--flush-interval is only available in write tests"); 4440 ret = -1; 4441 goto out; 4442 } 4443 if (flush_interval && flush_interval < depth) { 4444 error_report("Flush interval can't be smaller than depth"); 4445 ret = -1; 4446 goto out; 4447 } 4448 4449 blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet, 4450 force_share); 4451 if (!blk) { 4452 ret = -1; 4453 goto out; 4454 } 4455 4456 image_size = blk_getlength(blk); 4457 if (image_size < 0) { 4458 ret = image_size; 4459 goto out; 4460 } 4461 4462 data = (BenchData) { 4463 .blk = blk, 4464 .image_size = image_size, 4465 .bufsize = bufsize, 4466 .step = step ?: bufsize, 4467 .nrreq = depth, 4468 .n = count, 4469 .offset = offset, 4470 .write = is_write, 4471 .flush_interval = flush_interval, 4472 .drain_on_flush = drain_on_flush, 4473 }; 4474 printf("Sending %d %s requests, %d bytes each, %d in parallel " 4475 "(starting at offset %" PRId64 ", step size %d)\n", 4476 data.n, data.write ? "write" : "read", data.bufsize, data.nrreq, 4477 data.offset, data.step); 4478 if (flush_interval) { 4479 printf("Sending flush every %d requests\n", flush_interval); 4480 } 4481 4482 buf_size = data.nrreq * data.bufsize; 4483 data.buf = blk_blockalign(blk, buf_size); 4484 memset(data.buf, pattern, data.nrreq * data.bufsize); 4485 4486 blk_register_buf(blk, data.buf, buf_size); 4487 4488 data.qiov = g_new(QEMUIOVector, data.nrreq); 4489 for (i = 0; i < data.nrreq; i++) { 4490 qemu_iovec_init(&data.qiov[i], 1); 4491 qemu_iovec_add(&data.qiov[i], 4492 data.buf + i * data.bufsize, data.bufsize); 4493 } 4494 4495 gettimeofday(&t1, NULL); 4496 bench_cb(&data, 0); 4497 4498 while (data.n > 0) { 4499 main_loop_wait(false); 4500 } 4501 gettimeofday(&t2, NULL); 4502 4503 printf("Run completed in %3.3f seconds.\n", 4504 (t2.tv_sec - t1.tv_sec) 4505 + ((double)(t2.tv_usec - t1.tv_usec) / 1000000)); 4506 4507 out: 4508 if (data.buf) { 4509 blk_unregister_buf(blk, data.buf); 4510 } 4511 qemu_vfree(data.buf); 4512 blk_unref(blk); 4513 4514 if (ret) { 4515 return 1; 4516 } 4517 return 0; 4518 } 4519 4520 enum ImgBitmapAct { 4521 BITMAP_ADD, 4522 BITMAP_REMOVE, 4523 BITMAP_CLEAR, 4524 BITMAP_ENABLE, 4525 BITMAP_DISABLE, 4526 BITMAP_MERGE, 4527 }; 4528 typedef struct ImgBitmapAction { 4529 enum ImgBitmapAct act; 4530 const char *src; /* only used for merge */ 4531 QSIMPLEQ_ENTRY(ImgBitmapAction) next; 4532 } ImgBitmapAction; 4533 4534 static int img_bitmap(int argc, char **argv) 4535 { 4536 Error *err = NULL; 4537 int c, ret = 1; 4538 QemuOpts *opts = NULL; 4539 const char *fmt = NULL, *src_fmt = NULL, *src_filename = NULL; 4540 const char *filename, *bitmap; 4541 BlockBackend *blk = NULL, *src = NULL; 4542 BlockDriverState *bs = NULL, *src_bs = NULL; 4543 bool image_opts = false; 4544 int64_t granularity = 0; 4545 bool add = false, merge = false; 4546 QSIMPLEQ_HEAD(, ImgBitmapAction) actions; 4547 ImgBitmapAction *act, *act_next; 4548 const char *op; 4549 4550 QSIMPLEQ_INIT(&actions); 4551 4552 for (;;) { 4553 static const struct option long_options[] = { 4554 {"help", no_argument, 0, 'h'}, 4555 {"object", required_argument, 0, OPTION_OBJECT}, 4556 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 4557 {"add", no_argument, 0, OPTION_ADD}, 4558 {"remove", no_argument, 0, OPTION_REMOVE}, 4559 {"clear", no_argument, 0, OPTION_CLEAR}, 4560 {"enable", no_argument, 0, OPTION_ENABLE}, 4561 {"disable", no_argument, 0, OPTION_DISABLE}, 4562 {"merge", required_argument, 0, OPTION_MERGE}, 4563 {"granularity", required_argument, 0, 'g'}, 4564 {"source-file", required_argument, 0, 'b'}, 4565 {"source-format", required_argument, 0, 'F'}, 4566 {0, 0, 0, 0} 4567 }; 4568 c = getopt_long(argc, argv, ":b:f:F:g:h", long_options, NULL); 4569 if (c == -1) { 4570 break; 4571 } 4572 4573 switch (c) { 4574 case ':': 4575 missing_argument(argv[optind - 1]); 4576 break; 4577 case '?': 4578 unrecognized_option(argv[optind - 1]); 4579 break; 4580 case 'h': 4581 help(); 4582 break; 4583 case 'b': 4584 src_filename = optarg; 4585 break; 4586 case 'f': 4587 fmt = optarg; 4588 break; 4589 case 'F': 4590 src_fmt = optarg; 4591 break; 4592 case 'g': 4593 granularity = cvtnum("granularity", optarg); 4594 if (granularity < 0) { 4595 return 1; 4596 } 4597 break; 4598 case OPTION_ADD: 4599 act = g_new0(ImgBitmapAction, 1); 4600 act->act = BITMAP_ADD; 4601 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4602 add = true; 4603 break; 4604 case OPTION_REMOVE: 4605 act = g_new0(ImgBitmapAction, 1); 4606 act->act = BITMAP_REMOVE; 4607 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4608 break; 4609 case OPTION_CLEAR: 4610 act = g_new0(ImgBitmapAction, 1); 4611 act->act = BITMAP_CLEAR; 4612 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4613 break; 4614 case OPTION_ENABLE: 4615 act = g_new0(ImgBitmapAction, 1); 4616 act->act = BITMAP_ENABLE; 4617 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4618 break; 4619 case OPTION_DISABLE: 4620 act = g_new0(ImgBitmapAction, 1); 4621 act->act = BITMAP_DISABLE; 4622 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4623 break; 4624 case OPTION_MERGE: 4625 act = g_new0(ImgBitmapAction, 1); 4626 act->act = BITMAP_MERGE; 4627 act->src = optarg; 4628 QSIMPLEQ_INSERT_TAIL(&actions, act, next); 4629 merge = true; 4630 break; 4631 case OPTION_OBJECT: 4632 user_creatable_process_cmdline(optarg); 4633 break; 4634 case OPTION_IMAGE_OPTS: 4635 image_opts = true; 4636 break; 4637 } 4638 } 4639 4640 if (QSIMPLEQ_EMPTY(&actions)) { 4641 error_report("Need at least one of --add, --remove, --clear, " 4642 "--enable, --disable, or --merge"); 4643 goto out; 4644 } 4645 4646 if (granularity && !add) { 4647 error_report("granularity only supported with --add"); 4648 goto out; 4649 } 4650 if (src_fmt && !src_filename) { 4651 error_report("-F only supported with -b"); 4652 goto out; 4653 } 4654 if (src_filename && !merge) { 4655 error_report("Merge bitmap source file only supported with " 4656 "--merge"); 4657 goto out; 4658 } 4659 4660 if (optind != argc - 2) { 4661 error_report("Expecting filename and bitmap name"); 4662 goto out; 4663 } 4664 4665 filename = argv[optind]; 4666 bitmap = argv[optind + 1]; 4667 4668 /* 4669 * No need to open backing chains; we will be manipulating bitmaps 4670 * directly in this image without reference to image contents. 4671 */ 4672 blk = img_open(image_opts, filename, fmt, BDRV_O_RDWR | BDRV_O_NO_BACKING, 4673 false, false, false); 4674 if (!blk) { 4675 goto out; 4676 } 4677 bs = blk_bs(blk); 4678 if (src_filename) { 4679 src = img_open(false, src_filename, src_fmt, BDRV_O_NO_BACKING, 4680 false, false, false); 4681 if (!src) { 4682 goto out; 4683 } 4684 src_bs = blk_bs(src); 4685 } else { 4686 src_bs = bs; 4687 } 4688 4689 QSIMPLEQ_FOREACH_SAFE(act, &actions, next, act_next) { 4690 switch (act->act) { 4691 case BITMAP_ADD: 4692 qmp_block_dirty_bitmap_add(bs->node_name, bitmap, 4693 !!granularity, granularity, true, true, 4694 false, false, &err); 4695 op = "add"; 4696 break; 4697 case BITMAP_REMOVE: 4698 qmp_block_dirty_bitmap_remove(bs->node_name, bitmap, &err); 4699 op = "remove"; 4700 break; 4701 case BITMAP_CLEAR: 4702 qmp_block_dirty_bitmap_clear(bs->node_name, bitmap, &err); 4703 op = "clear"; 4704 break; 4705 case BITMAP_ENABLE: 4706 qmp_block_dirty_bitmap_enable(bs->node_name, bitmap, &err); 4707 op = "enable"; 4708 break; 4709 case BITMAP_DISABLE: 4710 qmp_block_dirty_bitmap_disable(bs->node_name, bitmap, &err); 4711 op = "disable"; 4712 break; 4713 case BITMAP_MERGE: 4714 do_dirty_bitmap_merge(bs->node_name, bitmap, src_bs->node_name, 4715 act->src, &err); 4716 op = "merge"; 4717 break; 4718 default: 4719 g_assert_not_reached(); 4720 } 4721 4722 if (err) { 4723 error_reportf_err(err, "Operation %s on bitmap %s failed: ", 4724 op, bitmap); 4725 goto out; 4726 } 4727 g_free(act); 4728 } 4729 4730 ret = 0; 4731 4732 out: 4733 blk_unref(src); 4734 blk_unref(blk); 4735 qemu_opts_del(opts); 4736 return ret; 4737 } 4738 4739 #define C_BS 01 4740 #define C_COUNT 02 4741 #define C_IF 04 4742 #define C_OF 010 4743 #define C_SKIP 020 4744 4745 struct DdInfo { 4746 unsigned int flags; 4747 int64_t count; 4748 }; 4749 4750 struct DdIo { 4751 int bsz; /* Block size */ 4752 char *filename; 4753 uint8_t *buf; 4754 int64_t offset; 4755 }; 4756 4757 struct DdOpts { 4758 const char *name; 4759 int (*f)(const char *, struct DdIo *, struct DdIo *, struct DdInfo *); 4760 unsigned int flag; 4761 }; 4762 4763 static int img_dd_bs(const char *arg, 4764 struct DdIo *in, struct DdIo *out, 4765 struct DdInfo *dd) 4766 { 4767 int64_t res; 4768 4769 res = cvtnum_full("bs", arg, 1, INT_MAX); 4770 4771 if (res < 0) { 4772 return 1; 4773 } 4774 in->bsz = out->bsz = res; 4775 4776 return 0; 4777 } 4778 4779 static int img_dd_count(const char *arg, 4780 struct DdIo *in, struct DdIo *out, 4781 struct DdInfo *dd) 4782 { 4783 dd->count = cvtnum("count", arg); 4784 4785 if (dd->count < 0) { 4786 return 1; 4787 } 4788 4789 return 0; 4790 } 4791 4792 static int img_dd_if(const char *arg, 4793 struct DdIo *in, struct DdIo *out, 4794 struct DdInfo *dd) 4795 { 4796 in->filename = g_strdup(arg); 4797 4798 return 0; 4799 } 4800 4801 static int img_dd_of(const char *arg, 4802 struct DdIo *in, struct DdIo *out, 4803 struct DdInfo *dd) 4804 { 4805 out->filename = g_strdup(arg); 4806 4807 return 0; 4808 } 4809 4810 static int img_dd_skip(const char *arg, 4811 struct DdIo *in, struct DdIo *out, 4812 struct DdInfo *dd) 4813 { 4814 in->offset = cvtnum("skip", arg); 4815 4816 if (in->offset < 0) { 4817 return 1; 4818 } 4819 4820 return 0; 4821 } 4822 4823 static int img_dd(int argc, char **argv) 4824 { 4825 int ret = 0; 4826 char *arg = NULL; 4827 char *tmp; 4828 BlockDriver *drv = NULL, *proto_drv = NULL; 4829 BlockBackend *blk1 = NULL, *blk2 = NULL; 4830 QemuOpts *opts = NULL; 4831 QemuOptsList *create_opts = NULL; 4832 Error *local_err = NULL; 4833 bool image_opts = false; 4834 int c, i; 4835 const char *out_fmt = "raw"; 4836 const char *fmt = NULL; 4837 int64_t size = 0; 4838 int64_t block_count = 0, out_pos, in_pos; 4839 bool force_share = false; 4840 struct DdInfo dd = { 4841 .flags = 0, 4842 .count = 0, 4843 }; 4844 struct DdIo in = { 4845 .bsz = 512, /* Block size is by default 512 bytes */ 4846 .filename = NULL, 4847 .buf = NULL, 4848 .offset = 0 4849 }; 4850 struct DdIo out = { 4851 .bsz = 512, 4852 .filename = NULL, 4853 .buf = NULL, 4854 .offset = 0 4855 }; 4856 4857 const struct DdOpts options[] = { 4858 { "bs", img_dd_bs, C_BS }, 4859 { "count", img_dd_count, C_COUNT }, 4860 { "if", img_dd_if, C_IF }, 4861 { "of", img_dd_of, C_OF }, 4862 { "skip", img_dd_skip, C_SKIP }, 4863 { NULL, NULL, 0 } 4864 }; 4865 const struct option long_options[] = { 4866 { "help", no_argument, 0, 'h'}, 4867 { "object", required_argument, 0, OPTION_OBJECT}, 4868 { "image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 4869 { "force-share", no_argument, 0, 'U'}, 4870 { 0, 0, 0, 0 } 4871 }; 4872 4873 while ((c = getopt_long(argc, argv, ":hf:O:U", long_options, NULL))) { 4874 if (c == EOF) { 4875 break; 4876 } 4877 switch (c) { 4878 case 'O': 4879 out_fmt = optarg; 4880 break; 4881 case 'f': 4882 fmt = optarg; 4883 break; 4884 case ':': 4885 missing_argument(argv[optind - 1]); 4886 break; 4887 case '?': 4888 unrecognized_option(argv[optind - 1]); 4889 break; 4890 case 'h': 4891 help(); 4892 break; 4893 case 'U': 4894 force_share = true; 4895 break; 4896 case OPTION_OBJECT: 4897 user_creatable_process_cmdline(optarg); 4898 break; 4899 case OPTION_IMAGE_OPTS: 4900 image_opts = true; 4901 break; 4902 } 4903 } 4904 4905 for (i = optind; i < argc; i++) { 4906 int j; 4907 arg = g_strdup(argv[i]); 4908 4909 tmp = strchr(arg, '='); 4910 if (tmp == NULL) { 4911 error_report("unrecognized operand %s", arg); 4912 ret = -1; 4913 goto out; 4914 } 4915 4916 *tmp++ = '\0'; 4917 4918 for (j = 0; options[j].name != NULL; j++) { 4919 if (!strcmp(arg, options[j].name)) { 4920 break; 4921 } 4922 } 4923 if (options[j].name == NULL) { 4924 error_report("unrecognized operand %s", arg); 4925 ret = -1; 4926 goto out; 4927 } 4928 4929 if (options[j].f(tmp, &in, &out, &dd) != 0) { 4930 ret = -1; 4931 goto out; 4932 } 4933 dd.flags |= options[j].flag; 4934 g_free(arg); 4935 arg = NULL; 4936 } 4937 4938 if (!(dd.flags & C_IF && dd.flags & C_OF)) { 4939 error_report("Must specify both input and output files"); 4940 ret = -1; 4941 goto out; 4942 } 4943 4944 blk1 = img_open(image_opts, in.filename, fmt, 0, false, false, 4945 force_share); 4946 4947 if (!blk1) { 4948 ret = -1; 4949 goto out; 4950 } 4951 4952 drv = bdrv_find_format(out_fmt); 4953 if (!drv) { 4954 error_report("Unknown file format"); 4955 ret = -1; 4956 goto out; 4957 } 4958 proto_drv = bdrv_find_protocol(out.filename, true, &local_err); 4959 4960 if (!proto_drv) { 4961 error_report_err(local_err); 4962 ret = -1; 4963 goto out; 4964 } 4965 if (!drv->create_opts) { 4966 error_report("Format driver '%s' does not support image creation", 4967 drv->format_name); 4968 ret = -1; 4969 goto out; 4970 } 4971 if (!proto_drv->create_opts) { 4972 error_report("Protocol driver '%s' does not support image creation", 4973 proto_drv->format_name); 4974 ret = -1; 4975 goto out; 4976 } 4977 create_opts = qemu_opts_append(create_opts, drv->create_opts); 4978 create_opts = qemu_opts_append(create_opts, proto_drv->create_opts); 4979 4980 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort); 4981 4982 size = blk_getlength(blk1); 4983 if (size < 0) { 4984 error_report("Failed to get size for '%s'", in.filename); 4985 ret = -1; 4986 goto out; 4987 } 4988 4989 if (dd.flags & C_COUNT && dd.count <= INT64_MAX / in.bsz && 4990 dd.count * in.bsz < size) { 4991 size = dd.count * in.bsz; 4992 } 4993 4994 /* Overflow means the specified offset is beyond input image's size */ 4995 if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz || 4996 size < in.bsz * in.offset)) { 4997 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, 0, &error_abort); 4998 } else { 4999 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, 5000 size - in.bsz * in.offset, &error_abort); 5001 } 5002 5003 ret = bdrv_create(drv, out.filename, opts, &local_err); 5004 if (ret < 0) { 5005 error_reportf_err(local_err, 5006 "%s: error while creating output image: ", 5007 out.filename); 5008 ret = -1; 5009 goto out; 5010 } 5011 5012 /* TODO, we can't honour --image-opts for the target, 5013 * since it needs to be given in a format compatible 5014 * with the bdrv_create() call above which does not 5015 * support image-opts style. 5016 */ 5017 blk2 = img_open_file(out.filename, NULL, out_fmt, BDRV_O_RDWR, 5018 false, false, false); 5019 5020 if (!blk2) { 5021 ret = -1; 5022 goto out; 5023 } 5024 5025 if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz || 5026 size < in.offset * in.bsz)) { 5027 /* We give a warning if the skip option is bigger than the input 5028 * size and create an empty output disk image (i.e. like dd(1)). 5029 */ 5030 error_report("%s: cannot skip to specified offset", in.filename); 5031 in_pos = size; 5032 } else { 5033 in_pos = in.offset * in.bsz; 5034 } 5035 5036 in.buf = g_new(uint8_t, in.bsz); 5037 5038 for (out_pos = 0; in_pos < size; block_count++) { 5039 int in_ret, out_ret; 5040 5041 if (in_pos + in.bsz > size) { 5042 in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos); 5043 } else { 5044 in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz); 5045 } 5046 if (in_ret < 0) { 5047 error_report("error while reading from input image file: %s", 5048 strerror(-in_ret)); 5049 ret = -1; 5050 goto out; 5051 } 5052 in_pos += in_ret; 5053 5054 out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0); 5055 5056 if (out_ret < 0) { 5057 error_report("error while writing to output image file: %s", 5058 strerror(-out_ret)); 5059 ret = -1; 5060 goto out; 5061 } 5062 out_pos += out_ret; 5063 } 5064 5065 out: 5066 g_free(arg); 5067 qemu_opts_del(opts); 5068 qemu_opts_free(create_opts); 5069 blk_unref(blk1); 5070 blk_unref(blk2); 5071 g_free(in.filename); 5072 g_free(out.filename); 5073 g_free(in.buf); 5074 g_free(out.buf); 5075 5076 if (ret) { 5077 return 1; 5078 } 5079 return 0; 5080 } 5081 5082 static void dump_json_block_measure_info(BlockMeasureInfo *info) 5083 { 5084 GString *str; 5085 QObject *obj; 5086 Visitor *v = qobject_output_visitor_new(&obj); 5087 5088 visit_type_BlockMeasureInfo(v, NULL, &info, &error_abort); 5089 visit_complete(v, &obj); 5090 str = qobject_to_json_pretty(obj, true); 5091 assert(str != NULL); 5092 printf("%s\n", str->str); 5093 qobject_unref(obj); 5094 visit_free(v); 5095 g_string_free(str, true); 5096 } 5097 5098 static int img_measure(int argc, char **argv) 5099 { 5100 static const struct option long_options[] = { 5101 {"help", no_argument, 0, 'h'}, 5102 {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, 5103 {"object", required_argument, 0, OPTION_OBJECT}, 5104 {"output", required_argument, 0, OPTION_OUTPUT}, 5105 {"size", required_argument, 0, OPTION_SIZE}, 5106 {"force-share", no_argument, 0, 'U'}, 5107 {0, 0, 0, 0} 5108 }; 5109 OutputFormat output_format = OFORMAT_HUMAN; 5110 BlockBackend *in_blk = NULL; 5111 BlockDriver *drv; 5112 const char *filename = NULL; 5113 const char *fmt = NULL; 5114 const char *out_fmt = "raw"; 5115 char *options = NULL; 5116 char *snapshot_name = NULL; 5117 bool force_share = false; 5118 QemuOpts *opts = NULL; 5119 QemuOpts *object_opts = NULL; 5120 QemuOpts *sn_opts = NULL; 5121 QemuOptsList *create_opts = NULL; 5122 bool image_opts = false; 5123 uint64_t img_size = UINT64_MAX; 5124 BlockMeasureInfo *info = NULL; 5125 Error *local_err = NULL; 5126 int ret = 1; 5127 int c; 5128 5129 while ((c = getopt_long(argc, argv, "hf:O:o:l:U", 5130 long_options, NULL)) != -1) { 5131 switch (c) { 5132 case '?': 5133 case 'h': 5134 help(); 5135 break; 5136 case 'f': 5137 fmt = optarg; 5138 break; 5139 case 'O': 5140 out_fmt = optarg; 5141 break; 5142 case 'o': 5143 if (accumulate_options(&options, optarg) < 0) { 5144 goto out; 5145 } 5146 break; 5147 case 'l': 5148 if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) { 5149 sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts, 5150 optarg, false); 5151 if (!sn_opts) { 5152 error_report("Failed in parsing snapshot param '%s'", 5153 optarg); 5154 goto out; 5155 } 5156 } else { 5157 snapshot_name = optarg; 5158 } 5159 break; 5160 case 'U': 5161 force_share = true; 5162 break; 5163 case OPTION_OBJECT: 5164 user_creatable_process_cmdline(optarg); 5165 break; 5166 case OPTION_IMAGE_OPTS: 5167 image_opts = true; 5168 break; 5169 case OPTION_OUTPUT: 5170 if (!strcmp(optarg, "json")) { 5171 output_format = OFORMAT_JSON; 5172 } else if (!strcmp(optarg, "human")) { 5173 output_format = OFORMAT_HUMAN; 5174 } else { 5175 error_report("--output must be used with human or json " 5176 "as argument."); 5177 goto out; 5178 } 5179 break; 5180 case OPTION_SIZE: 5181 { 5182 int64_t sval; 5183 5184 sval = cvtnum("image size", optarg); 5185 if (sval < 0) { 5186 goto out; 5187 } 5188 img_size = (uint64_t)sval; 5189 } 5190 break; 5191 } 5192 } 5193 5194 if (argc - optind > 1) { 5195 error_report("At most one filename argument is allowed."); 5196 goto out; 5197 } else if (argc - optind == 1) { 5198 filename = argv[optind]; 5199 } 5200 5201 if (!filename && (image_opts || fmt || snapshot_name || sn_opts)) { 5202 error_report("--image-opts, -f, and -l require a filename argument."); 5203 goto out; 5204 } 5205 if (filename && img_size != UINT64_MAX) { 5206 error_report("--size N cannot be used together with a filename."); 5207 goto out; 5208 } 5209 if (!filename && img_size == UINT64_MAX) { 5210 error_report("Either --size N or one filename must be specified."); 5211 goto out; 5212 } 5213 5214 if (filename) { 5215 in_blk = img_open(image_opts, filename, fmt, 0, 5216 false, false, force_share); 5217 if (!in_blk) { 5218 goto out; 5219 } 5220 5221 if (sn_opts) { 5222 bdrv_snapshot_load_tmp(blk_bs(in_blk), 5223 qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID), 5224 qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME), 5225 &local_err); 5226 } else if (snapshot_name != NULL) { 5227 bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(in_blk), 5228 snapshot_name, &local_err); 5229 } 5230 if (local_err) { 5231 error_reportf_err(local_err, "Failed to load snapshot: "); 5232 goto out; 5233 } 5234 } 5235 5236 drv = bdrv_find_format(out_fmt); 5237 if (!drv) { 5238 error_report("Unknown file format '%s'", out_fmt); 5239 goto out; 5240 } 5241 if (!drv->create_opts) { 5242 error_report("Format driver '%s' does not support image creation", 5243 drv->format_name); 5244 goto out; 5245 } 5246 5247 create_opts = qemu_opts_append(create_opts, drv->create_opts); 5248 create_opts = qemu_opts_append(create_opts, bdrv_file.create_opts); 5249 opts = qemu_opts_create(create_opts, NULL, 0, &error_abort); 5250 if (options) { 5251 if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) { 5252 error_report_err(local_err); 5253 error_report("Invalid options for file format '%s'", out_fmt); 5254 goto out; 5255 } 5256 } 5257 if (img_size != UINT64_MAX) { 5258 qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort); 5259 } 5260 5261 info = bdrv_measure(drv, opts, in_blk ? blk_bs(in_blk) : NULL, &local_err); 5262 if (local_err) { 5263 error_report_err(local_err); 5264 goto out; 5265 } 5266 5267 if (output_format == OFORMAT_HUMAN) { 5268 printf("required size: %" PRIu64 "\n", info->required); 5269 printf("fully allocated size: %" PRIu64 "\n", info->fully_allocated); 5270 if (info->has_bitmaps) { 5271 printf("bitmaps size: %" PRIu64 "\n", info->bitmaps); 5272 } 5273 } else { 5274 dump_json_block_measure_info(info); 5275 } 5276 5277 ret = 0; 5278 5279 out: 5280 qapi_free_BlockMeasureInfo(info); 5281 qemu_opts_del(object_opts); 5282 qemu_opts_del(opts); 5283 qemu_opts_del(sn_opts); 5284 qemu_opts_free(create_opts); 5285 g_free(options); 5286 blk_unref(in_blk); 5287 return ret; 5288 } 5289 5290 static const img_cmd_t img_cmds[] = { 5291 #define DEF(option, callback, arg_string) \ 5292 { option, callback }, 5293 #include "qemu-img-cmds.h" 5294 #undef DEF 5295 { NULL, NULL, }, 5296 }; 5297 5298 int main(int argc, char **argv) 5299 { 5300 const img_cmd_t *cmd; 5301 const char *cmdname; 5302 Error *local_error = NULL; 5303 int c; 5304 static const struct option long_options[] = { 5305 {"help", no_argument, 0, 'h'}, 5306 {"version", no_argument, 0, 'V'}, 5307 {"trace", required_argument, NULL, 'T'}, 5308 {0, 0, 0, 0} 5309 }; 5310 5311 #ifdef CONFIG_POSIX 5312 signal(SIGPIPE, SIG_IGN); 5313 #endif 5314 5315 socket_init(); 5316 error_init(argv[0]); 5317 module_call_init(MODULE_INIT_TRACE); 5318 qemu_init_exec_dir(argv[0]); 5319 5320 if (qemu_init_main_loop(&local_error)) { 5321 error_report_err(local_error); 5322 exit(EXIT_FAILURE); 5323 } 5324 5325 qcrypto_init(&error_fatal); 5326 5327 module_call_init(MODULE_INIT_QOM); 5328 bdrv_init(); 5329 if (argc < 2) { 5330 error_exit("Not enough arguments"); 5331 } 5332 5333 qemu_add_opts(&qemu_source_opts); 5334 qemu_add_opts(&qemu_trace_opts); 5335 5336 while ((c = getopt_long(argc, argv, "+:hVT:", long_options, NULL)) != -1) { 5337 switch (c) { 5338 case ':': 5339 missing_argument(argv[optind - 1]); 5340 return 0; 5341 case '?': 5342 unrecognized_option(argv[optind - 1]); 5343 return 0; 5344 case 'h': 5345 help(); 5346 return 0; 5347 case 'V': 5348 printf(QEMU_IMG_VERSION); 5349 return 0; 5350 case 'T': 5351 trace_opt_parse(optarg); 5352 break; 5353 } 5354 } 5355 5356 cmdname = argv[optind]; 5357 5358 /* reset getopt_long scanning */ 5359 argc -= optind; 5360 if (argc < 1) { 5361 return 0; 5362 } 5363 argv += optind; 5364 qemu_reset_optind(); 5365 5366 if (!trace_init_backends()) { 5367 exit(1); 5368 } 5369 trace_init_file(); 5370 qemu_set_log(LOG_TRACE); 5371 5372 /* find the command */ 5373 for (cmd = img_cmds; cmd->name != NULL; cmd++) { 5374 if (!strcmp(cmdname, cmd->name)) { 5375 return cmd->handler(argc, argv); 5376 } 5377 } 5378 5379 /* not found */ 5380 error_exit("Command not found: %s", cmdname); 5381 } 5382