qemu/qemu-img.c
<<
>>
Prefs
   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#include "qemu/osdep.h"
  25#include "qapi/error.h"
  26#include "qapi-visit.h"
  27#include "qapi/qmp-output-visitor.h"
  28#include "qapi/qmp/qerror.h"
  29#include "qapi/qmp/qjson.h"
  30#include "qemu/cutils.h"
  31#include "qemu/config-file.h"
  32#include "qemu/option.h"
  33#include "qemu/error-report.h"
  34#include "qom/object_interfaces.h"
  35#include "sysemu/sysemu.h"
  36#include "sysemu/block-backend.h"
  37#include "block/block_int.h"
  38#include "block/blockjob.h"
  39#include "block/qapi.h"
  40#include "crypto/init.h"
  41#include <getopt.h>
  42
  43#define QEMU_IMG_VERSION "qemu-img version " QEMU_VERSION QEMU_PKGVERSION \
  44                          ", Copyright (c) 2004-2008 Fabrice Bellard\n"
  45
  46typedef struct img_cmd_t {
  47    const char *name;
  48    int (*handler)(int argc, char **argv);
  49} img_cmd_t;
  50
  51enum {
  52    OPTION_OUTPUT = 256,
  53    OPTION_BACKING_CHAIN = 257,
  54    OPTION_OBJECT = 258,
  55    OPTION_IMAGE_OPTS = 259,
  56};
  57
  58typedef enum OutputFormat {
  59    OFORMAT_JSON,
  60    OFORMAT_HUMAN,
  61} OutputFormat;
  62
  63/* Default to cache=writeback as data integrity is not important for qemu-img */
  64#define BDRV_DEFAULT_CACHE "writeback"
  65
  66static void format_print(void *opaque, const char *name)
  67{
  68    printf(" %s", name);
  69}
  70
  71static void QEMU_NORETURN GCC_FMT_ATTR(1, 2) error_exit(const char *fmt, ...)
  72{
  73    va_list ap;
  74
  75    error_printf("qemu-img: ");
  76
  77    va_start(ap, fmt);
  78    error_vprintf(fmt, ap);
  79    va_end(ap);
  80
  81    error_printf("\nTry 'qemu-img --help' for more information\n");
  82    exit(EXIT_FAILURE);
  83}
  84
  85/* Please keep in synch with qemu-img.texi */
  86static void QEMU_NORETURN help(void)
  87{
  88    const char *help_msg =
  89           QEMU_IMG_VERSION
  90           "usage: qemu-img command [command options]\n"
  91           "QEMU disk image utility\n"
  92           "\n"
  93           "Command syntax:\n"
  94#define DEF(option, callback, arg_string)        \
  95           "  " arg_string "\n"
  96#include "qemu-img-cmds.h"
  97#undef DEF
  98#undef GEN_DOCS
  99           "\n"
 100           "Command parameters:\n"
 101           "  'filename' is a disk image filename\n"
 102           "  'objectdef' is a QEMU user creatable object definition. See the qemu(1)\n"
 103           "    manual page for a description of the object properties. The most common\n"
 104           "    object type is a 'secret', which is used to supply passwords and/or\n"
 105           "    encryption keys.\n"
 106           "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
 107           "  'cache' is the cache mode used to write the output disk image, the valid\n"
 108           "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
 109           "    'directsync' and 'unsafe' (default for convert)\n"
 110           "  'src_cache' is the cache mode used to read input disk images, the valid\n"
 111           "    options are the same as for the 'cache' option\n"
 112           "  'size' is the disk image size in bytes. Optional suffixes\n"
 113           "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
 114           "    'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P)  are\n"
 115           "    supported. 'b' is ignored.\n"
 116           "  'output_filename' is the destination disk image filename\n"
 117           "  'output_fmt' is the destination format\n"
 118           "  'options' is a comma separated list of format specific options in a\n"
 119           "    name=value format. Use -o ? for an overview of the options supported by the\n"
 120           "    used format\n"
 121           "  'snapshot_param' is param used for internal snapshot, format\n"
 122           "    is 'snapshot.id=[ID],snapshot.name=[NAME]', or\n"
 123           "    '[ID_OR_NAME]'\n"
 124           "  'snapshot_id_or_name' is deprecated, use 'snapshot_param'\n"
 125           "    instead\n"
 126           "  '-c' indicates that target image must be compressed (qcow format only)\n"
 127           "  '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
 128           "       match exactly. The image doesn't need a working backing file before\n"
 129           "       rebasing in this case (useful for renaming the backing file)\n"
 130           "  '-h' with or without a command shows this help and lists the supported formats\n"
 131           "  '-p' show progress of command (only certain commands)\n"
 132           "  '-q' use Quiet mode - do not print any output (except errors)\n"
 133           "  '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n"
 134           "       contain only zeros for qemu-img to create a sparse image during\n"
 135           "       conversion. If the number of bytes is 0, the source will not be scanned for\n"
 136           "       unallocated or zero sectors, and the destination image will always be\n"
 137           "       fully allocated\n"
 138           "  '--output' takes the format in which the output must be done (human or json)\n"
 139           "  '-n' skips the target volume creation (useful if the volume is created\n"
 140           "       prior to running qemu-img)\n"
 141           "\n"
 142           "Parameters to check subcommand:\n"
 143           "  '-r' tries to repair any inconsistencies that are found during the check.\n"
 144           "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
 145           "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
 146           "       hiding corruption that has already occurred.\n"
 147           "\n"
 148           "Parameters to snapshot subcommand:\n"
 149           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
 150           "  '-a' applies a snapshot (revert disk to saved state)\n"
 151           "  '-c' creates a snapshot\n"
 152           "  '-d' deletes a snapshot\n"
 153           "  '-l' lists all snapshots in the given image\n"
 154           "\n"
 155           "Parameters to compare subcommand:\n"
 156           "  '-f' first image format\n"
 157           "  '-F' second image format\n"
 158           "  '-s' run in Strict mode - fail on different image size or sector allocation\n";
 159
 160    printf("%s\nSupported formats:", help_msg);
 161    bdrv_iterate_format(format_print, NULL);
 162    printf("\n");
 163    exit(EXIT_SUCCESS);
 164}
 165
 166static QemuOptsList qemu_object_opts = {
 167    .name = "object",
 168    .implied_opt_name = "qom-type",
 169    .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
 170    .desc = {
 171        { }
 172    },
 173};
 174
 175static QemuOptsList qemu_source_opts = {
 176    .name = "source",
 177    .implied_opt_name = "file",
 178    .head = QTAILQ_HEAD_INITIALIZER(qemu_source_opts.head),
 179    .desc = {
 180        { }
 181    },
 182};
 183
 184static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...)
 185{
 186    int ret = 0;
 187    if (!quiet) {
 188        va_list args;
 189        va_start(args, fmt);
 190        ret = vprintf(fmt, args);
 191        va_end(args);
 192    }
 193    return ret;
 194}
 195
 196
 197static int print_block_option_help(const char *filename, const char *fmt)
 198{
 199    BlockDriver *drv, *proto_drv;
 200    QemuOptsList *create_opts = NULL;
 201    Error *local_err = NULL;
 202
 203    /* Find driver and parse its options */
 204    drv = bdrv_find_format(fmt);
 205    if (!drv) {
 206        error_report("Unknown file format '%s'", fmt);
 207        return 1;
 208    }
 209
 210    create_opts = qemu_opts_append(create_opts, drv->create_opts);
 211    if (filename) {
 212        proto_drv = bdrv_find_protocol(filename, true, &local_err);
 213        if (!proto_drv) {
 214            error_report_err(local_err);
 215            qemu_opts_free(create_opts);
 216            return 1;
 217        }
 218        create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
 219    }
 220
 221    qemu_opts_print_help(create_opts);
 222    qemu_opts_free(create_opts);
 223    return 0;
 224}
 225
 226
 227static int img_open_password(BlockBackend *blk, const char *filename,
 228                             int flags, bool quiet)
 229{
 230    BlockDriverState *bs;
 231    char password[256];
 232
 233    bs = blk_bs(blk);
 234    if (bdrv_is_encrypted(bs) && bdrv_key_required(bs) &&
 235        !(flags & BDRV_O_NO_IO)) {
 236        qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
 237        if (qemu_read_password(password, sizeof(password)) < 0) {
 238            error_report("No password given");
 239            return -1;
 240        }
 241        if (bdrv_set_key(bs, password) < 0) {
 242            error_report("invalid password");
 243            return -1;
 244        }
 245    }
 246    return 0;
 247}
 248
 249
 250static BlockBackend *img_open_opts(const char *optstr,
 251                                   QemuOpts *opts, int flags, bool writethrough,
 252                                   bool quiet)
 253{
 254    QDict *options;
 255    Error *local_err = NULL;
 256    BlockBackend *blk;
 257    options = qemu_opts_to_qdict(opts, NULL);
 258    blk = blk_new_open(NULL, NULL, options, flags, &local_err);
 259    if (!blk) {
 260        error_reportf_err(local_err, "Could not open '%s': ", optstr);
 261        return NULL;
 262    }
 263    blk_set_enable_write_cache(blk, !writethrough);
 264
 265    if (img_open_password(blk, optstr, flags, quiet) < 0) {
 266        blk_unref(blk);
 267        return NULL;
 268    }
 269    return blk;
 270}
 271
 272static BlockBackend *img_open_file(const char *filename,
 273                                   const char *fmt, int flags,
 274                                   bool writethrough, bool quiet)
 275{
 276    BlockBackend *blk;
 277    Error *local_err = NULL;
 278    QDict *options = NULL;
 279
 280    if (fmt) {
 281        options = qdict_new();
 282        qdict_put(options, "driver", qstring_from_str(fmt));
 283    }
 284
 285    blk = blk_new_open(filename, NULL, options, flags, &local_err);
 286    if (!blk) {
 287        error_reportf_err(local_err, "Could not open '%s': ", filename);
 288        return NULL;
 289    }
 290    blk_set_enable_write_cache(blk, !writethrough);
 291
 292    if (img_open_password(blk, filename, flags, quiet) < 0) {
 293        blk_unref(blk);
 294        return NULL;
 295    }
 296    return blk;
 297}
 298
 299
 300static BlockBackend *img_open(bool image_opts,
 301                              const char *filename,
 302                              const char *fmt, int flags, bool writethrough,
 303                              bool quiet)
 304{
 305    BlockBackend *blk;
 306    if (image_opts) {
 307        QemuOpts *opts;
 308        if (fmt) {
 309            error_report("--image-opts and --format are mutually exclusive");
 310            return NULL;
 311        }
 312        opts = qemu_opts_parse_noisily(qemu_find_opts("source"),
 313                                       filename, true);
 314        if (!opts) {
 315            return NULL;
 316        }
 317        blk = img_open_opts(filename, opts, flags, writethrough, quiet);
 318    } else {
 319        blk = img_open_file(filename, fmt, flags, writethrough, quiet);
 320    }
 321    return blk;
 322}
 323
 324
 325static int add_old_style_options(const char *fmt, QemuOpts *opts,
 326                                 const char *base_filename,
 327                                 const char *base_fmt)
 328{
 329    Error *err = NULL;
 330
 331    if (base_filename) {
 332        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &err);
 333        if (err) {
 334            error_report("Backing file not supported for file format '%s'",
 335                         fmt);
 336            error_free(err);
 337            return -1;
 338        }
 339    }
 340    if (base_fmt) {
 341        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err);
 342        if (err) {
 343            error_report("Backing file format not supported for file "
 344                         "format '%s'", fmt);
 345            error_free(err);
 346            return -1;
 347        }
 348    }
 349    return 0;
 350}
 351
 352static int img_create(int argc, char **argv)
 353{
 354    int c;
 355    uint64_t img_size = -1;
 356    const char *fmt = "raw";
 357    const char *base_fmt = NULL;
 358    const char *filename;
 359    const char *base_filename = NULL;
 360    char *options = NULL;
 361    Error *local_err = NULL;
 362    bool quiet = false;
 363
 364    for(;;) {
 365        static const struct option long_options[] = {
 366            {"help", no_argument, 0, 'h'},
 367            {"object", required_argument, 0, OPTION_OBJECT},
 368            {0, 0, 0, 0}
 369        };
 370        c = getopt_long(argc, argv, "F:b:f:he6o:q",
 371                        long_options, NULL);
 372        if (c == -1) {
 373            break;
 374        }
 375        switch(c) {
 376        case '?':
 377        case 'h':
 378            help();
 379            break;
 380        case 'F':
 381            base_fmt = optarg;
 382            break;
 383        case 'b':
 384            base_filename = optarg;
 385            break;
 386        case 'f':
 387            fmt = optarg;
 388            break;
 389        case 'e':
 390            error_report("option -e is deprecated, please use \'-o "
 391                  "encryption\' instead!");
 392            goto fail;
 393        case '6':
 394            error_report("option -6 is deprecated, please use \'-o "
 395                  "compat6\' instead!");
 396            goto fail;
 397        case 'o':
 398            if (!is_valid_option_list(optarg)) {
 399                error_report("Invalid option list: %s", optarg);
 400                goto fail;
 401            }
 402            if (!options) {
 403                options = g_strdup(optarg);
 404            } else {
 405                char *old_options = options;
 406                options = g_strdup_printf("%s,%s", options, optarg);
 407                g_free(old_options);
 408            }
 409            break;
 410        case 'q':
 411            quiet = true;
 412            break;
 413        case OPTION_OBJECT: {
 414            QemuOpts *opts;
 415            opts = qemu_opts_parse_noisily(&qemu_object_opts,
 416                                           optarg, true);
 417            if (!opts) {
 418                goto fail;
 419            }
 420        }   break;
 421        }
 422    }
 423
 424    /* Get the filename */
 425    filename = (optind < argc) ? argv[optind] : NULL;
 426    if (options && has_help_option(options)) {
 427        g_free(options);
 428        return print_block_option_help(filename, fmt);
 429    }
 430
 431    if (optind >= argc) {
 432        error_exit("Expecting image file name");
 433    }
 434    optind++;
 435
 436    if (qemu_opts_foreach(&qemu_object_opts,
 437                          user_creatable_add_opts_foreach,
 438                          NULL, NULL)) {
 439        goto fail;
 440    }
 441
 442    /* Get image size, if specified */
 443    if (optind < argc) {
 444        int64_t sval;
 445        char *end;
 446        sval = qemu_strtosz_suffix(argv[optind++], &end,
 447                                   QEMU_STRTOSZ_DEFSUFFIX_B);
 448        if (sval < 0 || *end) {
 449            if (sval == -ERANGE) {
 450                error_report("Image size must be less than 8 EiB!");
 451            } else {
 452                error_report("Invalid image size specified! You may use k, M, "
 453                      "G, T, P or E suffixes for ");
 454                error_report("kilobytes, megabytes, gigabytes, terabytes, "
 455                             "petabytes and exabytes.");
 456            }
 457            goto fail;
 458        }
 459        img_size = (uint64_t)sval;
 460    }
 461    if (optind != argc) {
 462        error_exit("Unexpected argument: %s", argv[optind]);
 463    }
 464
 465    bdrv_img_create(filename, fmt, base_filename, base_fmt,
 466                    options, img_size, 0, &local_err, quiet);
 467    if (local_err) {
 468        error_reportf_err(local_err, "%s: ", filename);
 469        goto fail;
 470    }
 471
 472    g_free(options);
 473    return 0;
 474
 475fail:
 476    g_free(options);
 477    return 1;
 478}
 479
 480static void dump_json_image_check(ImageCheck *check, bool quiet)
 481{
 482    Error *local_err = NULL;
 483    QString *str;
 484    QmpOutputVisitor *ov = qmp_output_visitor_new();
 485    QObject *obj;
 486    visit_type_ImageCheck(qmp_output_get_visitor(ov), NULL, &check,
 487                          &local_err);
 488    obj = qmp_output_get_qobject(ov);
 489    str = qobject_to_json_pretty(obj);
 490    assert(str != NULL);
 491    qprintf(quiet, "%s\n", qstring_get_str(str));
 492    qobject_decref(obj);
 493    qmp_output_visitor_cleanup(ov);
 494    QDECREF(str);
 495}
 496
 497static void dump_human_image_check(ImageCheck *check, bool quiet)
 498{
 499    if (!(check->corruptions || check->leaks || check->check_errors)) {
 500        qprintf(quiet, "No errors were found on the image.\n");
 501    } else {
 502        if (check->corruptions) {
 503            qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
 504                    "Data may be corrupted, or further writes to the image "
 505                    "may corrupt it.\n",
 506                    check->corruptions);
 507        }
 508
 509        if (check->leaks) {
 510            qprintf(quiet,
 511                    "\n%" PRId64 " leaked clusters were found on the image.\n"
 512                    "This means waste of disk space, but no harm to data.\n",
 513                    check->leaks);
 514        }
 515
 516        if (check->check_errors) {
 517            qprintf(quiet,
 518                    "\n%" PRId64
 519                    " internal errors have occurred during the check.\n",
 520                    check->check_errors);
 521        }
 522    }
 523
 524    if (check->total_clusters != 0 && check->allocated_clusters != 0) {
 525        qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
 526                "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
 527                check->allocated_clusters, check->total_clusters,
 528                check->allocated_clusters * 100.0 / check->total_clusters,
 529                check->fragmented_clusters * 100.0 / check->allocated_clusters,
 530                check->compressed_clusters * 100.0 /
 531                check->allocated_clusters);
 532    }
 533
 534    if (check->image_end_offset) {
 535        qprintf(quiet,
 536                "Image end offset: %" PRId64 "\n", check->image_end_offset);
 537    }
 538}
 539
 540static int collect_image_check(BlockDriverState *bs,
 541                   ImageCheck *check,
 542                   const char *filename,
 543                   const char *fmt,
 544                   int fix)
 545{
 546    int ret;
 547    BdrvCheckResult result;
 548
 549    ret = bdrv_check(bs, &result, fix);
 550    if (ret < 0) {
 551        return ret;
 552    }
 553
 554    check->filename                 = g_strdup(filename);
 555    check->format                   = g_strdup(bdrv_get_format_name(bs));
 556    check->check_errors             = result.check_errors;
 557    check->corruptions              = result.corruptions;
 558    check->has_corruptions          = result.corruptions != 0;
 559    check->leaks                    = result.leaks;
 560    check->has_leaks                = result.leaks != 0;
 561    check->corruptions_fixed        = result.corruptions_fixed;
 562    check->has_corruptions_fixed    = result.corruptions != 0;
 563    check->leaks_fixed              = result.leaks_fixed;
 564    check->has_leaks_fixed          = result.leaks != 0;
 565    check->image_end_offset         = result.image_end_offset;
 566    check->has_image_end_offset     = result.image_end_offset != 0;
 567    check->total_clusters           = result.bfi.total_clusters;
 568    check->has_total_clusters       = result.bfi.total_clusters != 0;
 569    check->allocated_clusters       = result.bfi.allocated_clusters;
 570    check->has_allocated_clusters   = result.bfi.allocated_clusters != 0;
 571    check->fragmented_clusters      = result.bfi.fragmented_clusters;
 572    check->has_fragmented_clusters  = result.bfi.fragmented_clusters != 0;
 573    check->compressed_clusters      = result.bfi.compressed_clusters;
 574    check->has_compressed_clusters  = result.bfi.compressed_clusters != 0;
 575
 576    return 0;
 577}
 578
 579/*
 580 * Checks an image for consistency. Exit codes:
 581 *
 582 *  0 - Check completed, image is good
 583 *  1 - Check not completed because of internal errors
 584 *  2 - Check completed, image is corrupted
 585 *  3 - Check completed, image has leaked clusters, but is good otherwise
 586 * 63 - Checks are not supported by the image format
 587 */
 588static int img_check(int argc, char **argv)
 589{
 590    int c, ret;
 591    OutputFormat output_format = OFORMAT_HUMAN;
 592    const char *filename, *fmt, *output, *cache;
 593    BlockBackend *blk;
 594    BlockDriverState *bs;
 595    int fix = 0;
 596    int flags = BDRV_O_CHECK;
 597    bool writethrough;
 598    ImageCheck *check;
 599    bool quiet = false;
 600    bool image_opts = false;
 601
 602    fmt = NULL;
 603    output = NULL;
 604    cache = BDRV_DEFAULT_CACHE;
 605
 606    for(;;) {
 607        int option_index = 0;
 608        static const struct option long_options[] = {
 609            {"help", no_argument, 0, 'h'},
 610            {"format", required_argument, 0, 'f'},
 611            {"repair", required_argument, 0, 'r'},
 612            {"output", required_argument, 0, OPTION_OUTPUT},
 613            {"object", required_argument, 0, OPTION_OBJECT},
 614            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
 615            {0, 0, 0, 0}
 616        };
 617        c = getopt_long(argc, argv, "hf:r:T:q",
 618                        long_options, &option_index);
 619        if (c == -1) {
 620            break;
 621        }
 622        switch(c) {
 623        case '?':
 624        case 'h':
 625            help();
 626            break;
 627        case 'f':
 628            fmt = optarg;
 629            break;
 630        case 'r':
 631            flags |= BDRV_O_RDWR;
 632
 633            if (!strcmp(optarg, "leaks")) {
 634                fix = BDRV_FIX_LEAKS;
 635            } else if (!strcmp(optarg, "all")) {
 636                fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
 637            } else {
 638                error_exit("Unknown option value for -r "
 639                           "(expecting 'leaks' or 'all'): %s", optarg);
 640            }
 641            break;
 642        case OPTION_OUTPUT:
 643            output = optarg;
 644            break;
 645        case 'T':
 646            cache = optarg;
 647            break;
 648        case 'q':
 649            quiet = true;
 650            break;
 651        case OPTION_OBJECT: {
 652            QemuOpts *opts;
 653            opts = qemu_opts_parse_noisily(&qemu_object_opts,
 654                                           optarg, true);
 655            if (!opts) {
 656                return 1;
 657            }
 658        }   break;
 659        case OPTION_IMAGE_OPTS:
 660            image_opts = true;
 661            break;
 662        }
 663    }
 664    if (optind != argc - 1) {
 665        error_exit("Expecting one image file name");
 666    }
 667    filename = argv[optind++];
 668
 669    if (output && !strcmp(output, "json")) {
 670        output_format = OFORMAT_JSON;
 671    } else if (output && !strcmp(output, "human")) {
 672        output_format = OFORMAT_HUMAN;
 673    } else if (output) {
 674        error_report("--output must be used with human or json as argument.");
 675        return 1;
 676    }
 677
 678    if (qemu_opts_foreach(&qemu_object_opts,
 679                          user_creatable_add_opts_foreach,
 680                          NULL, NULL)) {
 681        return 1;
 682    }
 683
 684    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
 685    if (ret < 0) {
 686        error_report("Invalid source cache option: %s", cache);
 687        return 1;
 688    }
 689
 690    blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet);
 691    if (!blk) {
 692        return 1;
 693    }
 694    bs = blk_bs(blk);
 695
 696    check = g_new0(ImageCheck, 1);
 697    ret = collect_image_check(bs, check, filename, fmt, fix);
 698
 699    if (ret == -ENOTSUP) {
 700        error_report("This image format does not support checks");
 701        ret = 63;
 702        goto fail;
 703    }
 704
 705    if (check->corruptions_fixed || check->leaks_fixed) {
 706        int corruptions_fixed, leaks_fixed;
 707
 708        leaks_fixed         = check->leaks_fixed;
 709        corruptions_fixed   = check->corruptions_fixed;
 710
 711        if (output_format == OFORMAT_HUMAN) {
 712            qprintf(quiet,
 713                    "The following inconsistencies were found and repaired:\n\n"
 714                    "    %" PRId64 " leaked clusters\n"
 715                    "    %" PRId64 " corruptions\n\n"
 716                    "Double checking the fixed image now...\n",
 717                    check->leaks_fixed,
 718                    check->corruptions_fixed);
 719        }
 720
 721        ret = collect_image_check(bs, check, filename, fmt, 0);
 722
 723        check->leaks_fixed          = leaks_fixed;
 724        check->corruptions_fixed    = corruptions_fixed;
 725    }
 726
 727    if (!ret) {
 728        switch (output_format) {
 729        case OFORMAT_HUMAN:
 730            dump_human_image_check(check, quiet);
 731            break;
 732        case OFORMAT_JSON:
 733            dump_json_image_check(check, quiet);
 734            break;
 735        }
 736    }
 737
 738    if (ret || check->check_errors) {
 739        if (ret) {
 740            error_report("Check failed: %s", strerror(-ret));
 741        } else {
 742            error_report("Check failed");
 743        }
 744        ret = 1;
 745        goto fail;
 746    }
 747
 748    if (check->corruptions) {
 749        ret = 2;
 750    } else if (check->leaks) {
 751        ret = 3;
 752    } else {
 753        ret = 0;
 754    }
 755
 756fail:
 757    qapi_free_ImageCheck(check);
 758    blk_unref(blk);
 759    return ret;
 760}
 761
 762typedef struct CommonBlockJobCBInfo {
 763    BlockDriverState *bs;
 764    Error **errp;
 765} CommonBlockJobCBInfo;
 766
 767static void common_block_job_cb(void *opaque, int ret)
 768{
 769    CommonBlockJobCBInfo *cbi = opaque;
 770
 771    if (ret < 0) {
 772        error_setg_errno(cbi->errp, -ret, "Block job failed");
 773    }
 774}
 775
 776static void run_block_job(BlockJob *job, Error **errp)
 777{
 778    AioContext *aio_context = bdrv_get_aio_context(job->bs);
 779
 780    do {
 781        aio_poll(aio_context, true);
 782        qemu_progress_print(job->len ?
 783                            ((float)job->offset / job->len * 100.f) : 0.0f, 0);
 784    } while (!job->ready);
 785
 786    block_job_complete_sync(job, errp);
 787
 788    /* A block job may finish instantaneously without publishing any progress,
 789     * so just signal completion here */
 790    qemu_progress_print(100.f, 0);
 791}
 792
 793static int img_commit(int argc, char **argv)
 794{
 795    int c, ret, flags;
 796    const char *filename, *fmt, *cache, *base;
 797    BlockBackend *blk;
 798    BlockDriverState *bs, *base_bs;
 799    bool progress = false, quiet = false, drop = false;
 800    bool writethrough;
 801    Error *local_err = NULL;
 802    CommonBlockJobCBInfo cbi;
 803    bool image_opts = false;
 804
 805    fmt = NULL;
 806    cache = BDRV_DEFAULT_CACHE;
 807    base = NULL;
 808    for(;;) {
 809        static const struct option long_options[] = {
 810            {"help", no_argument, 0, 'h'},
 811            {"object", required_argument, 0, OPTION_OBJECT},
 812            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
 813            {0, 0, 0, 0}
 814        };
 815        c = getopt_long(argc, argv, "f:ht:b:dpq",
 816                        long_options, NULL);
 817        if (c == -1) {
 818            break;
 819        }
 820        switch(c) {
 821        case '?':
 822        case 'h':
 823            help();
 824            break;
 825        case 'f':
 826            fmt = optarg;
 827            break;
 828        case 't':
 829            cache = optarg;
 830            break;
 831        case 'b':
 832            base = optarg;
 833            /* -b implies -d */
 834            drop = true;
 835            break;
 836        case 'd':
 837            drop = true;
 838            break;
 839        case 'p':
 840            progress = true;
 841            break;
 842        case 'q':
 843            quiet = true;
 844            break;
 845        case OPTION_OBJECT: {
 846            QemuOpts *opts;
 847            opts = qemu_opts_parse_noisily(&qemu_object_opts,
 848                                           optarg, true);
 849            if (!opts) {
 850                return 1;
 851            }
 852        }   break;
 853        case OPTION_IMAGE_OPTS:
 854            image_opts = true;
 855            break;
 856        }
 857    }
 858
 859    /* Progress is not shown in Quiet mode */
 860    if (quiet) {
 861        progress = false;
 862    }
 863
 864    if (optind != argc - 1) {
 865        error_exit("Expecting one image file name");
 866    }
 867    filename = argv[optind++];
 868
 869    if (qemu_opts_foreach(&qemu_object_opts,
 870                          user_creatable_add_opts_foreach,
 871                          NULL, NULL)) {
 872        return 1;
 873    }
 874
 875    flags = BDRV_O_RDWR | BDRV_O_UNMAP;
 876    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
 877    if (ret < 0) {
 878        error_report("Invalid cache option: %s", cache);
 879        return 1;
 880    }
 881
 882    blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet);
 883    if (!blk) {
 884        return 1;
 885    }
 886    bs = blk_bs(blk);
 887
 888    qemu_progress_init(progress, 1.f);
 889    qemu_progress_print(0.f, 100);
 890
 891    if (base) {
 892        base_bs = bdrv_find_backing_image(bs, base);
 893        if (!base_bs) {
 894            error_setg(&local_err, QERR_BASE_NOT_FOUND, base);
 895            goto done;
 896        }
 897    } else {
 898        /* This is different from QMP, which by default uses the deepest file in
 899         * the backing chain (i.e., the very base); however, the traditional
 900         * behavior of qemu-img commit is using the immediate backing file. */
 901        base_bs = backing_bs(bs);
 902        if (!base_bs) {
 903            error_setg(&local_err, "Image does not have a backing file");
 904            goto done;
 905        }
 906    }
 907
 908    cbi = (CommonBlockJobCBInfo){
 909        .errp = &local_err,
 910        .bs   = bs,
 911    };
 912
 913    commit_active_start(bs, base_bs, 0, BLOCKDEV_ON_ERROR_REPORT,
 914                        common_block_job_cb, &cbi, &local_err);
 915    if (local_err) {
 916        goto done;
 917    }
 918
 919    /* When the block job completes, the BlockBackend reference will point to
 920     * the old backing file. In order to avoid that the top image is already
 921     * deleted, so we can still empty it afterwards, increment the reference
 922     * counter here preemptively. */
 923    if (!drop) {
 924        bdrv_ref(bs);
 925    }
 926
 927    run_block_job(bs->job, &local_err);
 928    if (local_err) {
 929        goto unref_backing;
 930    }
 931
 932    if (!drop && bs->drv->bdrv_make_empty) {
 933        ret = bs->drv->bdrv_make_empty(bs);
 934        if (ret) {
 935            error_setg_errno(&local_err, -ret, "Could not empty %s",
 936                             filename);
 937            goto unref_backing;
 938        }
 939    }
 940
 941unref_backing:
 942    if (!drop) {
 943        bdrv_unref(bs);
 944    }
 945
 946done:
 947    qemu_progress_end();
 948
 949    blk_unref(blk);
 950
 951    if (local_err) {
 952        error_report_err(local_err);
 953        return 1;
 954    }
 955
 956    qprintf(quiet, "Image committed.\n");
 957    return 0;
 958}
 959
 960/*
 961 * Returns true iff the first sector pointed to by 'buf' contains at least
 962 * a non-NUL byte.
 963 *
 964 * 'pnum' is set to the number of sectors (including and immediately following
 965 * the first one) that are known to be in the same allocated/unallocated state.
 966 */
 967static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
 968{
 969    bool is_zero;
 970    int i;
 971
 972    if (n <= 0) {
 973        *pnum = 0;
 974        return 0;
 975    }
 976    is_zero = buffer_is_zero(buf, 512);
 977    for(i = 1; i < n; i++) {
 978        buf += 512;
 979        if (is_zero != buffer_is_zero(buf, 512)) {
 980            break;
 981        }
 982    }
 983    *pnum = i;
 984    return !is_zero;
 985}
 986
 987/*
 988 * Like is_allocated_sectors, but if the buffer starts with a used sector,
 989 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
 990 * breaking up write requests for only small sparse areas.
 991 */
 992static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
 993    int min)
 994{
 995    int ret;
 996    int num_checked, num_used;
 997
 998    if (n < min) {
 999        min = n;
1000    }
1001
1002    ret = is_allocated_sectors(buf, n, pnum);
1003    if (!ret) {
1004        return ret;
1005    }
1006
1007    num_used = *pnum;
1008    buf += BDRV_SECTOR_SIZE * *pnum;
1009    n -= *pnum;
1010    num_checked = num_used;
1011
1012    while (n > 0) {
1013        ret = is_allocated_sectors(buf, n, pnum);
1014
1015        buf += BDRV_SECTOR_SIZE * *pnum;
1016        n -= *pnum;
1017        num_checked += *pnum;
1018        if (ret) {
1019            num_used = num_checked;
1020        } else if (*pnum >= min) {
1021            break;
1022        }
1023    }
1024
1025    *pnum = num_used;
1026    return 1;
1027}
1028
1029/*
1030 * Compares two buffers sector by sector. Returns 0 if the first sector of both
1031 * buffers matches, non-zero otherwise.
1032 *
1033 * pnum is set to the number of sectors (including and immediately following
1034 * the first one) that are known to have the same comparison result
1035 */
1036static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
1037    int *pnum)
1038{
1039    bool res;
1040    int i;
1041
1042    if (n <= 0) {
1043        *pnum = 0;
1044        return 0;
1045    }
1046
1047    res = !!memcmp(buf1, buf2, 512);
1048    for(i = 1; i < n; i++) {
1049        buf1 += 512;
1050        buf2 += 512;
1051
1052        if (!!memcmp(buf1, buf2, 512) != res) {
1053            break;
1054        }
1055    }
1056
1057    *pnum = i;
1058    return res;
1059}
1060
1061#define IO_BUF_SIZE (2 * 1024 * 1024)
1062
1063static int64_t sectors_to_bytes(int64_t sectors)
1064{
1065    return sectors << BDRV_SECTOR_BITS;
1066}
1067
1068static int64_t sectors_to_process(int64_t total, int64_t from)
1069{
1070    return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
1071}
1072
1073/*
1074 * Check if passed sectors are empty (not allocated or contain only 0 bytes)
1075 *
1076 * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
1077 * data and negative value on error.
1078 *
1079 * @param blk:  BlockBackend for the image
1080 * @param sect_num: Number of first sector to check
1081 * @param sect_count: Number of sectors to check
1082 * @param filename: Name of disk file we are checking (logging purpose)
1083 * @param buffer: Allocated buffer for storing read data
1084 * @param quiet: Flag for quiet mode
1085 */
1086static int check_empty_sectors(BlockBackend *blk, int64_t sect_num,
1087                               int sect_count, const char *filename,
1088                               uint8_t *buffer, bool quiet)
1089{
1090    int pnum, ret = 0;
1091    ret = blk_read(blk, sect_num, buffer, sect_count);
1092    if (ret < 0) {
1093        error_report("Error while reading offset %" PRId64 " of %s: %s",
1094                     sectors_to_bytes(sect_num), filename, strerror(-ret));
1095        return ret;
1096    }
1097    ret = is_allocated_sectors(buffer, sect_count, &pnum);
1098    if (ret || pnum != sect_count) {
1099        qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1100                sectors_to_bytes(ret ? sect_num : sect_num + pnum));
1101        return 1;
1102    }
1103
1104    return 0;
1105}
1106
1107/*
1108 * Compares two images. Exit codes:
1109 *
1110 * 0 - Images are identical
1111 * 1 - Images differ
1112 * >1 - Error occurred
1113 */
1114static int img_compare(int argc, char **argv)
1115{
1116    const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
1117    BlockBackend *blk1, *blk2;
1118    BlockDriverState *bs1, *bs2;
1119    int64_t total_sectors1, total_sectors2;
1120    uint8_t *buf1 = NULL, *buf2 = NULL;
1121    int pnum1, pnum2;
1122    int allocated1, allocated2;
1123    int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
1124    bool progress = false, quiet = false, strict = false;
1125    int flags;
1126    bool writethrough;
1127    int64_t total_sectors;
1128    int64_t sector_num = 0;
1129    int64_t nb_sectors;
1130    int c, pnum;
1131    uint64_t progress_base;
1132    bool image_opts = false;
1133
1134    cache = BDRV_DEFAULT_CACHE;
1135    for (;;) {
1136        static const struct option long_options[] = {
1137            {"help", no_argument, 0, 'h'},
1138            {"object", required_argument, 0, OPTION_OBJECT},
1139            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
1140            {0, 0, 0, 0}
1141        };
1142        c = getopt_long(argc, argv, "hf:F:T:pqs",
1143                        long_options, NULL);
1144        if (c == -1) {
1145            break;
1146        }
1147        switch (c) {
1148        case '?':
1149        case 'h':
1150            help();
1151            break;
1152        case 'f':
1153            fmt1 = optarg;
1154            break;
1155        case 'F':
1156            fmt2 = optarg;
1157            break;
1158        case 'T':
1159            cache = optarg;
1160            break;
1161        case 'p':
1162            progress = true;
1163            break;
1164        case 'q':
1165            quiet = true;
1166            break;
1167        case 's':
1168            strict = true;
1169            break;
1170        case OPTION_OBJECT: {
1171            QemuOpts *opts;
1172            opts = qemu_opts_parse_noisily(&qemu_object_opts,
1173                                           optarg, true);
1174            if (!opts) {
1175                ret = 2;
1176                goto out4;
1177            }
1178        }   break;
1179        case OPTION_IMAGE_OPTS:
1180            image_opts = true;
1181            break;
1182        }
1183    }
1184
1185    /* Progress is not shown in Quiet mode */
1186    if (quiet) {
1187        progress = false;
1188    }
1189
1190
1191    if (optind != argc - 2) {
1192        error_exit("Expecting two image file names");
1193    }
1194    filename1 = argv[optind++];
1195    filename2 = argv[optind++];
1196
1197    if (qemu_opts_foreach(&qemu_object_opts,
1198                          user_creatable_add_opts_foreach,
1199                          NULL, NULL)) {
1200        ret = 2;
1201        goto out4;
1202    }
1203
1204    /* Initialize before goto out */
1205    qemu_progress_init(progress, 2.0);
1206
1207    flags = 0;
1208    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
1209    if (ret < 0) {
1210        error_report("Invalid source cache option: %s", cache);
1211        ret = 2;
1212        goto out3;
1213    }
1214
1215    blk1 = img_open(image_opts, filename1, fmt1, flags, writethrough, quiet);
1216    if (!blk1) {
1217        ret = 2;
1218        goto out3;
1219    }
1220
1221    blk2 = img_open(image_opts, filename2, fmt2, flags, writethrough, quiet);
1222    if (!blk2) {
1223        ret = 2;
1224        goto out2;
1225    }
1226    bs1 = blk_bs(blk1);
1227    bs2 = blk_bs(blk2);
1228
1229    buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
1230    buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
1231    total_sectors1 = blk_nb_sectors(blk1);
1232    if (total_sectors1 < 0) {
1233        error_report("Can't get size of %s: %s",
1234                     filename1, strerror(-total_sectors1));
1235        ret = 4;
1236        goto out;
1237    }
1238    total_sectors2 = blk_nb_sectors(blk2);
1239    if (total_sectors2 < 0) {
1240        error_report("Can't get size of %s: %s",
1241                     filename2, strerror(-total_sectors2));
1242        ret = 4;
1243        goto out;
1244    }
1245    total_sectors = MIN(total_sectors1, total_sectors2);
1246    progress_base = MAX(total_sectors1, total_sectors2);
1247
1248    qemu_progress_print(0, 100);
1249
1250    if (strict && total_sectors1 != total_sectors2) {
1251        ret = 1;
1252        qprintf(quiet, "Strict mode: Image size mismatch!\n");
1253        goto out;
1254    }
1255
1256    for (;;) {
1257        int64_t status1, status2;
1258        BlockDriverState *file;
1259
1260        nb_sectors = sectors_to_process(total_sectors, sector_num);
1261        if (nb_sectors <= 0) {
1262            break;
1263        }
1264        status1 = bdrv_get_block_status_above(bs1, NULL, sector_num,
1265                                              total_sectors1 - sector_num,
1266                                              &pnum1, &file);
1267        if (status1 < 0) {
1268            ret = 3;
1269            error_report("Sector allocation test failed for %s", filename1);
1270            goto out;
1271        }
1272        allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
1273
1274        status2 = bdrv_get_block_status_above(bs2, NULL, sector_num,
1275                                              total_sectors2 - sector_num,
1276                                              &pnum2, &file);
1277        if (status2 < 0) {
1278            ret = 3;
1279            error_report("Sector allocation test failed for %s", filename2);
1280            goto out;
1281        }
1282        allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
1283        if (pnum1) {
1284            nb_sectors = MIN(nb_sectors, pnum1);
1285        }
1286        if (pnum2) {
1287            nb_sectors = MIN(nb_sectors, pnum2);
1288        }
1289
1290        if (strict) {
1291            if ((status1 & ~BDRV_BLOCK_OFFSET_MASK) !=
1292                (status2 & ~BDRV_BLOCK_OFFSET_MASK)) {
1293                ret = 1;
1294                qprintf(quiet, "Strict mode: Offset %" PRId64
1295                        " block status mismatch!\n",
1296                        sectors_to_bytes(sector_num));
1297                goto out;
1298            }
1299        }
1300        if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
1301            nb_sectors = MIN(pnum1, pnum2);
1302        } else if (allocated1 == allocated2) {
1303            if (allocated1) {
1304                ret = blk_read(blk1, sector_num, buf1, nb_sectors);
1305                if (ret < 0) {
1306                    error_report("Error while reading offset %" PRId64 " of %s:"
1307                                 " %s", sectors_to_bytes(sector_num), filename1,
1308                                 strerror(-ret));
1309                    ret = 4;
1310                    goto out;
1311                }
1312                ret = blk_read(blk2, sector_num, buf2, nb_sectors);
1313                if (ret < 0) {
1314                    error_report("Error while reading offset %" PRId64
1315                                 " of %s: %s", sectors_to_bytes(sector_num),
1316                                 filename2, strerror(-ret));
1317                    ret = 4;
1318                    goto out;
1319                }
1320                ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
1321                if (ret || pnum != nb_sectors) {
1322                    qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1323                            sectors_to_bytes(
1324                                ret ? sector_num : sector_num + pnum));
1325                    ret = 1;
1326                    goto out;
1327                }
1328            }
1329        } else {
1330
1331            if (allocated1) {
1332                ret = check_empty_sectors(blk1, sector_num, nb_sectors,
1333                                          filename1, buf1, quiet);
1334            } else {
1335                ret = check_empty_sectors(blk2, sector_num, nb_sectors,
1336                                          filename2, buf1, quiet);
1337            }
1338            if (ret) {
1339                if (ret < 0) {
1340                    error_report("Error while reading offset %" PRId64 ": %s",
1341                                 sectors_to_bytes(sector_num), strerror(-ret));
1342                    ret = 4;
1343                }
1344                goto out;
1345            }
1346        }
1347        sector_num += nb_sectors;
1348        qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1349    }
1350
1351    if (total_sectors1 != total_sectors2) {
1352        BlockBackend *blk_over;
1353        int64_t total_sectors_over;
1354        const char *filename_over;
1355
1356        qprintf(quiet, "Warning: Image size mismatch!\n");
1357        if (total_sectors1 > total_sectors2) {
1358            total_sectors_over = total_sectors1;
1359            blk_over = blk1;
1360            filename_over = filename1;
1361        } else {
1362            total_sectors_over = total_sectors2;
1363            blk_over = blk2;
1364            filename_over = filename2;
1365        }
1366
1367        for (;;) {
1368            nb_sectors = sectors_to_process(total_sectors_over, sector_num);
1369            if (nb_sectors <= 0) {
1370                break;
1371            }
1372            ret = bdrv_is_allocated_above(blk_bs(blk_over), NULL, sector_num,
1373                                          nb_sectors, &pnum);
1374            if (ret < 0) {
1375                ret = 3;
1376                error_report("Sector allocation test failed for %s",
1377                             filename_over);
1378                goto out;
1379
1380            }
1381            nb_sectors = pnum;
1382            if (ret) {
1383                ret = check_empty_sectors(blk_over, sector_num, nb_sectors,
1384                                          filename_over, buf1, quiet);
1385                if (ret) {
1386                    if (ret < 0) {
1387                        error_report("Error while reading offset %" PRId64
1388                                     " of %s: %s", sectors_to_bytes(sector_num),
1389                                     filename_over, strerror(-ret));
1390                        ret = 4;
1391                    }
1392                    goto out;
1393                }
1394            }
1395            sector_num += nb_sectors;
1396            qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1397        }
1398    }
1399
1400    qprintf(quiet, "Images are identical.\n");
1401    ret = 0;
1402
1403out:
1404    qemu_vfree(buf1);
1405    qemu_vfree(buf2);
1406    blk_unref(blk2);
1407out2:
1408    blk_unref(blk1);
1409out3:
1410    qemu_progress_end();
1411out4:
1412    return ret;
1413}
1414
1415enum ImgConvertBlockStatus {
1416    BLK_DATA,
1417    BLK_ZERO,
1418    BLK_BACKING_FILE,
1419};
1420
1421typedef struct ImgConvertState {
1422    BlockBackend **src;
1423    int64_t *src_sectors;
1424    int src_cur, src_num;
1425    int64_t src_cur_offset;
1426    int64_t total_sectors;
1427    int64_t allocated_sectors;
1428    enum ImgConvertBlockStatus status;
1429    int64_t sector_next_status;
1430    BlockBackend *target;
1431    bool has_zero_init;
1432    bool compressed;
1433    bool target_has_backing;
1434    int min_sparse;
1435    size_t cluster_sectors;
1436    size_t buf_sectors;
1437} ImgConvertState;
1438
1439static void convert_select_part(ImgConvertState *s, int64_t sector_num)
1440{
1441    assert(sector_num >= s->src_cur_offset);
1442    while (sector_num - s->src_cur_offset >= s->src_sectors[s->src_cur]) {
1443        s->src_cur_offset += s->src_sectors[s->src_cur];
1444        s->src_cur++;
1445        assert(s->src_cur < s->src_num);
1446    }
1447}
1448
1449static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
1450{
1451    int64_t ret;
1452    int n;
1453
1454    convert_select_part(s, sector_num);
1455
1456    assert(s->total_sectors > sector_num);
1457    n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
1458
1459    if (s->sector_next_status <= sector_num) {
1460        BlockDriverState *file;
1461        ret = bdrv_get_block_status(blk_bs(s->src[s->src_cur]),
1462                                    sector_num - s->src_cur_offset,
1463                                    n, &n, &file);
1464        if (ret < 0) {
1465            return ret;
1466        }
1467
1468        if (ret & BDRV_BLOCK_ZERO) {
1469            s->status = BLK_ZERO;
1470        } else if (ret & BDRV_BLOCK_DATA) {
1471            s->status = BLK_DATA;
1472        } else if (!s->target_has_backing) {
1473            /* Without a target backing file we must copy over the contents of
1474             * the backing file as well. */
1475            /* TODO Check block status of the backing file chain to avoid
1476             * needlessly reading zeroes and limiting the iteration to the
1477             * buffer size */
1478            s->status = BLK_DATA;
1479        } else {
1480            s->status = BLK_BACKING_FILE;
1481        }
1482
1483        s->sector_next_status = sector_num + n;
1484    }
1485
1486    n = MIN(n, s->sector_next_status - sector_num);
1487    if (s->status == BLK_DATA) {
1488        n = MIN(n, s->buf_sectors);
1489    }
1490
1491    /* We need to write complete clusters for compressed images, so if an
1492     * unallocated area is shorter than that, we must consider the whole
1493     * cluster allocated. */
1494    if (s->compressed) {
1495        if (n < s->cluster_sectors) {
1496            n = MIN(s->cluster_sectors, s->total_sectors - sector_num);
1497            s->status = BLK_DATA;
1498        } else {
1499            n = QEMU_ALIGN_DOWN(n, s->cluster_sectors);
1500        }
1501    }
1502
1503    return n;
1504}
1505
1506static int convert_read(ImgConvertState *s, int64_t sector_num, int nb_sectors,
1507                        uint8_t *buf)
1508{
1509    int n;
1510    int ret;
1511
1512    assert(nb_sectors <= s->buf_sectors);
1513    while (nb_sectors > 0) {
1514        BlockBackend *blk;
1515        int64_t bs_sectors;
1516
1517        /* In the case of compression with multiple source files, we can get a
1518         * nb_sectors that spreads into the next part. So we must be able to
1519         * read across multiple BDSes for one convert_read() call. */
1520        convert_select_part(s, sector_num);
1521        blk = s->src[s->src_cur];
1522        bs_sectors = s->src_sectors[s->src_cur];
1523
1524        n = MIN(nb_sectors, bs_sectors - (sector_num - s->src_cur_offset));
1525        ret = blk_read(blk, sector_num - s->src_cur_offset, buf, n);
1526        if (ret < 0) {
1527            return ret;
1528        }
1529
1530        sector_num += n;
1531        nb_sectors -= n;
1532        buf += n * BDRV_SECTOR_SIZE;
1533    }
1534
1535    return 0;
1536}
1537
1538static int convert_write(ImgConvertState *s, int64_t sector_num, int nb_sectors,
1539                         const uint8_t *buf)
1540{
1541    int ret;
1542
1543    while (nb_sectors > 0) {
1544        int n = nb_sectors;
1545
1546        switch (s->status) {
1547        case BLK_BACKING_FILE:
1548            /* If we have a backing file, leave clusters unallocated that are
1549             * unallocated in the source image, so that the backing file is
1550             * visible at the respective offset. */
1551            assert(s->target_has_backing);
1552            break;
1553
1554        case BLK_DATA:
1555            /* We must always write compressed clusters as a whole, so don't
1556             * try to find zeroed parts in the buffer. We can only save the
1557             * write if the buffer is completely zeroed and we're allowed to
1558             * keep the target sparse. */
1559            if (s->compressed) {
1560                if (s->has_zero_init && s->min_sparse &&
1561                    buffer_is_zero(buf, n * BDRV_SECTOR_SIZE))
1562                {
1563                    assert(!s->target_has_backing);
1564                    break;
1565                }
1566
1567                ret = blk_write_compressed(s->target, sector_num, buf, n);
1568                if (ret < 0) {
1569                    return ret;
1570                }
1571                break;
1572            }
1573
1574            /* If there is real non-zero data or we're told to keep the target
1575             * fully allocated (-S 0), we must write it. Otherwise we can treat
1576             * it as zero sectors. */
1577            if (!s->min_sparse ||
1578                is_allocated_sectors_min(buf, n, &n, s->min_sparse))
1579            {
1580                ret = blk_write(s->target, sector_num, buf, n);
1581                if (ret < 0) {
1582                    return ret;
1583                }
1584                break;
1585            }
1586            /* fall-through */
1587
1588        case BLK_ZERO:
1589            if (s->has_zero_init) {
1590                break;
1591            }
1592            ret = blk_write_zeroes(s->target, sector_num, n, 0);
1593            if (ret < 0) {
1594                return ret;
1595            }
1596            break;
1597        }
1598
1599        sector_num += n;
1600        nb_sectors -= n;
1601        buf += n * BDRV_SECTOR_SIZE;
1602    }
1603
1604    return 0;
1605}
1606
1607static int convert_do_copy(ImgConvertState *s)
1608{
1609    uint8_t *buf = NULL;
1610    int64_t sector_num, allocated_done;
1611    int ret;
1612    int n;
1613
1614    /* Check whether we have zero initialisation or can get it efficiently */
1615    s->has_zero_init = s->min_sparse && !s->target_has_backing
1616                     ? bdrv_has_zero_init(blk_bs(s->target))
1617                     : false;
1618
1619    if (!s->has_zero_init && !s->target_has_backing &&
1620        bdrv_can_write_zeroes_with_unmap(blk_bs(s->target)))
1621    {
1622        ret = bdrv_make_zero(blk_bs(s->target), BDRV_REQ_MAY_UNMAP);
1623        if (ret == 0) {
1624            s->has_zero_init = true;
1625        }
1626    }
1627
1628    /* Allocate buffer for copied data. For compressed images, only one cluster
1629     * can be copied at a time. */
1630    if (s->compressed) {
1631        if (s->cluster_sectors <= 0 || s->cluster_sectors > s->buf_sectors) {
1632            error_report("invalid cluster size");
1633            ret = -EINVAL;
1634            goto fail;
1635        }
1636        s->buf_sectors = s->cluster_sectors;
1637    }
1638    buf = blk_blockalign(s->target, s->buf_sectors * BDRV_SECTOR_SIZE);
1639
1640    /* Calculate allocated sectors for progress */
1641    s->allocated_sectors = 0;
1642    sector_num = 0;
1643    while (sector_num < s->total_sectors) {
1644        n = convert_iteration_sectors(s, sector_num);
1645        if (n < 0) {
1646            ret = n;
1647            goto fail;
1648        }
1649        if (s->status == BLK_DATA || (!s->min_sparse && s->status == BLK_ZERO))
1650        {
1651            s->allocated_sectors += n;
1652        }
1653        sector_num += n;
1654    }
1655
1656    /* Do the copy */
1657    s->src_cur = 0;
1658    s->src_cur_offset = 0;
1659    s->sector_next_status = 0;
1660
1661    sector_num = 0;
1662    allocated_done = 0;
1663
1664    while (sector_num < s->total_sectors) {
1665        n = convert_iteration_sectors(s, sector_num);
1666        if (n < 0) {
1667            ret = n;
1668            goto fail;
1669        }
1670        if (s->status == BLK_DATA || (!s->min_sparse && s->status == BLK_ZERO))
1671        {
1672            allocated_done += n;
1673            qemu_progress_print(100.0 * allocated_done / s->allocated_sectors,
1674                                0);
1675        }
1676
1677        if (s->status == BLK_DATA) {
1678            ret = convert_read(s, sector_num, n, buf);
1679            if (ret < 0) {
1680                error_report("error while reading sector %" PRId64
1681                             ": %s", sector_num, strerror(-ret));
1682                goto fail;
1683            }
1684        } else if (!s->min_sparse && s->status == BLK_ZERO) {
1685            n = MIN(n, s->buf_sectors);
1686            memset(buf, 0, n * BDRV_SECTOR_SIZE);
1687            s->status = BLK_DATA;
1688        }
1689
1690        ret = convert_write(s, sector_num, n, buf);
1691        if (ret < 0) {
1692            error_report("error while writing sector %" PRId64
1693                         ": %s", sector_num, strerror(-ret));
1694            goto fail;
1695        }
1696
1697        sector_num += n;
1698    }
1699
1700    if (s->compressed) {
1701        /* signal EOF to align */
1702        ret = blk_write_compressed(s->target, 0, NULL, 0);
1703        if (ret < 0) {
1704            goto fail;
1705        }
1706    }
1707
1708    ret = 0;
1709fail:
1710    qemu_vfree(buf);
1711    return ret;
1712}
1713
1714static int img_convert(int argc, char **argv)
1715{
1716    int c, bs_n, bs_i, compress, cluster_sectors, skip_create;
1717    int64_t ret = 0;
1718    int progress = 0, flags, src_flags;
1719    bool writethrough, src_writethrough;
1720    const char *fmt, *out_fmt, *cache, *src_cache, *out_baseimg, *out_filename;
1721    BlockDriver *drv, *proto_drv;
1722    BlockBackend **blk = NULL, *out_blk = NULL;
1723    BlockDriverState **bs = NULL, *out_bs = NULL;
1724    int64_t total_sectors;
1725    int64_t *bs_sectors = NULL;
1726    size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
1727    BlockDriverInfo bdi;
1728    QemuOpts *opts = NULL;
1729    QemuOptsList *create_opts = NULL;
1730    const char *out_baseimg_param;
1731    char *options = NULL;
1732    const char *snapshot_name = NULL;
1733    int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
1734    bool quiet = false;
1735    Error *local_err = NULL;
1736    QemuOpts *sn_opts = NULL;
1737    ImgConvertState state;
1738    bool image_opts = false;
1739
1740    fmt = NULL;
1741    out_fmt = "raw";
1742    cache = "unsafe";
1743    src_cache = BDRV_DEFAULT_CACHE;
1744    out_baseimg = NULL;
1745    compress = 0;
1746    skip_create = 0;
1747    for(;;) {
1748        static const struct option long_options[] = {
1749            {"help", no_argument, 0, 'h'},
1750            {"object", required_argument, 0, OPTION_OBJECT},
1751            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
1752            {0, 0, 0, 0}
1753        };
1754        c = getopt_long(argc, argv, "hf:O:B:ce6o:s:l:S:pt:T:qn",
1755                        long_options, NULL);
1756        if (c == -1) {
1757            break;
1758        }
1759        switch(c) {
1760        case '?':
1761        case 'h':
1762            help();
1763            break;
1764        case 'f':
1765            fmt = optarg;
1766            break;
1767        case 'O':
1768            out_fmt = optarg;
1769            break;
1770        case 'B':
1771            out_baseimg = optarg;
1772            break;
1773        case 'c':
1774            compress = 1;
1775            break;
1776        case 'e':
1777            error_report("option -e is deprecated, please use \'-o "
1778                  "encryption\' instead!");
1779            ret = -1;
1780            goto fail_getopt;
1781        case '6':
1782            error_report("option -6 is deprecated, please use \'-o "
1783                  "compat6\' instead!");
1784            ret = -1;
1785            goto fail_getopt;
1786        case 'o':
1787            if (!is_valid_option_list(optarg)) {
1788                error_report("Invalid option list: %s", optarg);
1789                ret = -1;
1790                goto fail_getopt;
1791            }
1792            if (!options) {
1793                options = g_strdup(optarg);
1794            } else {
1795                char *old_options = options;
1796                options = g_strdup_printf("%s,%s", options, optarg);
1797                g_free(old_options);
1798            }
1799            break;
1800        case 's':
1801            snapshot_name = optarg;
1802            break;
1803        case 'l':
1804            if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
1805                sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
1806                                                  optarg, false);
1807                if (!sn_opts) {
1808                    error_report("Failed in parsing snapshot param '%s'",
1809                                 optarg);
1810                    ret = -1;
1811                    goto fail_getopt;
1812                }
1813            } else {
1814                snapshot_name = optarg;
1815            }
1816            break;
1817        case 'S':
1818        {
1819            int64_t sval;
1820            char *end;
1821            sval = qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUFFIX_B);
1822            if (sval < 0 || *end) {
1823                error_report("Invalid minimum zero buffer size for sparse output specified");
1824                ret = -1;
1825                goto fail_getopt;
1826            }
1827
1828            min_sparse = sval / BDRV_SECTOR_SIZE;
1829            break;
1830        }
1831        case 'p':
1832            progress = 1;
1833            break;
1834        case 't':
1835            cache = optarg;
1836            break;
1837        case 'T':
1838            src_cache = optarg;
1839            break;
1840        case 'q':
1841            quiet = true;
1842            break;
1843        case 'n':
1844            skip_create = 1;
1845            break;
1846        case OPTION_OBJECT:
1847            opts = qemu_opts_parse_noisily(&qemu_object_opts,
1848                                           optarg, true);
1849            if (!opts) {
1850                goto fail_getopt;
1851            }
1852            break;
1853        case OPTION_IMAGE_OPTS:
1854            image_opts = true;
1855            break;
1856        }
1857    }
1858
1859    if (qemu_opts_foreach(&qemu_object_opts,
1860                          user_creatable_add_opts_foreach,
1861                          NULL, NULL)) {
1862        goto fail_getopt;
1863    }
1864
1865    /* Initialize before goto out */
1866    if (quiet) {
1867        progress = 0;
1868    }
1869    qemu_progress_init(progress, 1.0);
1870
1871    bs_n = argc - optind - 1;
1872    out_filename = bs_n >= 1 ? argv[argc - 1] : NULL;
1873
1874    if (options && has_help_option(options)) {
1875        ret = print_block_option_help(out_filename, out_fmt);
1876        goto out;
1877    }
1878
1879    if (bs_n < 1) {
1880        error_exit("Must specify image file name");
1881    }
1882
1883
1884    if (bs_n > 1 && out_baseimg) {
1885        error_report("-B makes no sense when concatenating multiple input "
1886                     "images");
1887        ret = -1;
1888        goto out;
1889    }
1890
1891    src_flags = 0;
1892    ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
1893    if (ret < 0) {
1894        error_report("Invalid source cache option: %s", src_cache);
1895        goto out;
1896    }
1897
1898    qemu_progress_print(0, 100);
1899
1900    blk = g_new0(BlockBackend *, bs_n);
1901    bs = g_new0(BlockDriverState *, bs_n);
1902    bs_sectors = g_new(int64_t, bs_n);
1903
1904    total_sectors = 0;
1905    for (bs_i = 0; bs_i < bs_n; bs_i++) {
1906        blk[bs_i] = img_open(image_opts, argv[optind + bs_i],
1907                             fmt, src_flags, src_writethrough, quiet);
1908        if (!blk[bs_i]) {
1909            ret = -1;
1910            goto out;
1911        }
1912        bs[bs_i] = blk_bs(blk[bs_i]);
1913        bs_sectors[bs_i] = blk_nb_sectors(blk[bs_i]);
1914        if (bs_sectors[bs_i] < 0) {
1915            error_report("Could not get size of %s: %s",
1916                         argv[optind + bs_i], strerror(-bs_sectors[bs_i]));
1917            ret = -1;
1918            goto out;
1919        }
1920        total_sectors += bs_sectors[bs_i];
1921    }
1922
1923    if (sn_opts) {
1924        ret = bdrv_snapshot_load_tmp(bs[0],
1925                                     qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
1926                                     qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
1927                                     &local_err);
1928    } else if (snapshot_name != NULL) {
1929        if (bs_n > 1) {
1930            error_report("No support for concatenating multiple snapshot");
1931            ret = -1;
1932            goto out;
1933        }
1934
1935        bdrv_snapshot_load_tmp_by_id_or_name(bs[0], snapshot_name, &local_err);
1936    }
1937    if (local_err) {
1938        error_reportf_err(local_err, "Failed to load snapshot: ");
1939        ret = -1;
1940        goto out;
1941    }
1942
1943    /* Find driver and parse its options */
1944    drv = bdrv_find_format(out_fmt);
1945    if (!drv) {
1946        error_report("Unknown file format '%s'", out_fmt);
1947        ret = -1;
1948        goto out;
1949    }
1950
1951    proto_drv = bdrv_find_protocol(out_filename, true, &local_err);
1952    if (!proto_drv) {
1953        error_report_err(local_err);
1954        ret = -1;
1955        goto out;
1956    }
1957
1958    if (!skip_create) {
1959        if (!drv->create_opts) {
1960            error_report("Format driver '%s' does not support image creation",
1961                         drv->format_name);
1962            ret = -1;
1963            goto out;
1964        }
1965
1966        if (!proto_drv->create_opts) {
1967            error_report("Protocol driver '%s' does not support image creation",
1968                         proto_drv->format_name);
1969            ret = -1;
1970            goto out;
1971        }
1972
1973        create_opts = qemu_opts_append(create_opts, drv->create_opts);
1974        create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
1975
1976        opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
1977        if (options) {
1978            qemu_opts_do_parse(opts, options, NULL, &local_err);
1979            if (local_err) {
1980                error_report_err(local_err);
1981                ret = -1;
1982                goto out;
1983            }
1984        }
1985
1986        qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_sectors * 512,
1987                            &error_abort);
1988        ret = add_old_style_options(out_fmt, opts, out_baseimg, NULL);
1989        if (ret < 0) {
1990            goto out;
1991        }
1992    }
1993
1994    /* Get backing file name if -o backing_file was used */
1995    out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
1996    if (out_baseimg_param) {
1997        out_baseimg = out_baseimg_param;
1998    }
1999
2000    /* Check if compression is supported */
2001    if (compress) {
2002        bool encryption =
2003            qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false);
2004        const char *preallocation =
2005            qemu_opt_get(opts, BLOCK_OPT_PREALLOC);
2006
2007        if (!drv->bdrv_write_compressed) {
2008            error_report("Compression not supported for this file format");
2009            ret = -1;
2010            goto out;
2011        }
2012
2013        if (encryption) {
2014            error_report("Compression and encryption not supported at "
2015                         "the same time");
2016            ret = -1;
2017            goto out;
2018        }
2019
2020        if (preallocation
2021            && strcmp(preallocation, "off"))
2022        {
2023            error_report("Compression and preallocation not supported at "
2024                         "the same time");
2025            ret = -1;
2026            goto out;
2027        }
2028    }
2029
2030    if (!skip_create) {
2031        /* Create the new image */
2032        ret = bdrv_create(drv, out_filename, opts, &local_err);
2033        if (ret < 0) {
2034            error_reportf_err(local_err, "%s: error while converting %s: ",
2035                              out_filename, out_fmt);
2036            goto out;
2037        }
2038    }
2039
2040    flags = min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
2041    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
2042    if (ret < 0) {
2043        error_report("Invalid cache option: %s", cache);
2044        goto out;
2045    }
2046
2047    /* XXX we should allow --image-opts to trigger use of
2048     * img_open() here, but then we have trouble with
2049     * the bdrv_create() call which takes different params.
2050     * Not critical right now, so fix can wait...
2051     */
2052    out_blk = img_open_file(out_filename, out_fmt, flags, writethrough, quiet);
2053    if (!out_blk) {
2054        ret = -1;
2055        goto out;
2056    }
2057    out_bs = blk_bs(out_blk);
2058
2059    /* increase bufsectors from the default 4096 (2M) if opt_transfer_length
2060     * or discard_alignment of the out_bs is greater. Limit to 32768 (16MB)
2061     * as maximum. */
2062    bufsectors = MIN(32768,
2063                     MAX(bufsectors, MAX(out_bs->bl.opt_transfer_length,
2064                                         out_bs->bl.discard_alignment))
2065                    );
2066
2067    if (skip_create) {
2068        int64_t output_sectors = blk_nb_sectors(out_blk);
2069        if (output_sectors < 0) {
2070            error_report("unable to get output image length: %s",
2071                         strerror(-output_sectors));
2072            ret = -1;
2073            goto out;
2074        } else if (output_sectors < total_sectors) {
2075            error_report("output file is smaller than input file");
2076            ret = -1;
2077            goto out;
2078        }
2079    }
2080
2081    cluster_sectors = 0;
2082    ret = bdrv_get_info(out_bs, &bdi);
2083    if (ret < 0) {
2084        if (compress) {
2085            error_report("could not get block driver info");
2086            goto out;
2087        }
2088    } else {
2089        compress = compress || bdi.needs_compressed_writes;
2090        cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE;
2091    }
2092
2093    state = (ImgConvertState) {
2094        .src                = blk,
2095        .src_sectors        = bs_sectors,
2096        .src_num            = bs_n,
2097        .total_sectors      = total_sectors,
2098        .target             = out_blk,
2099        .compressed         = compress,
2100        .target_has_backing = (bool) out_baseimg,
2101        .min_sparse         = min_sparse,
2102        .cluster_sectors    = cluster_sectors,
2103        .buf_sectors        = bufsectors,
2104    };
2105    ret = convert_do_copy(&state);
2106
2107out:
2108    if (!ret) {
2109        qemu_progress_print(100, 0);
2110    }
2111    qemu_progress_end();
2112    qemu_opts_del(opts);
2113    qemu_opts_free(create_opts);
2114    qemu_opts_del(sn_opts);
2115    blk_unref(out_blk);
2116    g_free(bs);
2117    if (blk) {
2118        for (bs_i = 0; bs_i < bs_n; bs_i++) {
2119            blk_unref(blk[bs_i]);
2120        }
2121        g_free(blk);
2122    }
2123    g_free(bs_sectors);
2124fail_getopt:
2125    g_free(options);
2126
2127    if (ret) {
2128        return 1;
2129    }
2130    return 0;
2131}
2132
2133
2134static void dump_snapshots(BlockDriverState *bs)
2135{
2136    QEMUSnapshotInfo *sn_tab, *sn;
2137    int nb_sns, i;
2138
2139    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2140    if (nb_sns <= 0)
2141        return;
2142    printf("Snapshot list:\n");
2143    bdrv_snapshot_dump(fprintf, stdout, NULL);
2144    printf("\n");
2145    for(i = 0; i < nb_sns; i++) {
2146        sn = &sn_tab[i];
2147        bdrv_snapshot_dump(fprintf, stdout, sn);
2148        printf("\n");
2149    }
2150    g_free(sn_tab);
2151}
2152
2153static void dump_json_image_info_list(ImageInfoList *list)
2154{
2155    Error *local_err = NULL;
2156    QString *str;
2157    QmpOutputVisitor *ov = qmp_output_visitor_new();
2158    QObject *obj;
2159    visit_type_ImageInfoList(qmp_output_get_visitor(ov), NULL, &list,
2160                             &local_err);
2161    obj = qmp_output_get_qobject(ov);
2162    str = qobject_to_json_pretty(obj);
2163    assert(str != NULL);
2164    printf("%s\n", qstring_get_str(str));
2165    qobject_decref(obj);
2166    qmp_output_visitor_cleanup(ov);
2167    QDECREF(str);
2168}
2169
2170static void dump_json_image_info(ImageInfo *info)
2171{
2172    Error *local_err = NULL;
2173    QString *str;
2174    QmpOutputVisitor *ov = qmp_output_visitor_new();
2175    QObject *obj;
2176    visit_type_ImageInfo(qmp_output_get_visitor(ov), NULL, &info, &local_err);
2177    obj = qmp_output_get_qobject(ov);
2178    str = qobject_to_json_pretty(obj);
2179    assert(str != NULL);
2180    printf("%s\n", qstring_get_str(str));
2181    qobject_decref(obj);
2182    qmp_output_visitor_cleanup(ov);
2183    QDECREF(str);
2184}
2185
2186static void dump_human_image_info_list(ImageInfoList *list)
2187{
2188    ImageInfoList *elem;
2189    bool delim = false;
2190
2191    for (elem = list; elem; elem = elem->next) {
2192        if (delim) {
2193            printf("\n");
2194        }
2195        delim = true;
2196
2197        bdrv_image_info_dump(fprintf, stdout, elem->value);
2198    }
2199}
2200
2201static gboolean str_equal_func(gconstpointer a, gconstpointer b)
2202{
2203    return strcmp(a, b) == 0;
2204}
2205
2206/**
2207 * Open an image file chain and return an ImageInfoList
2208 *
2209 * @filename: topmost image filename
2210 * @fmt: topmost image format (may be NULL to autodetect)
2211 * @chain: true  - enumerate entire backing file chain
2212 *         false - only topmost image file
2213 *
2214 * Returns a list of ImageInfo objects or NULL if there was an error opening an
2215 * image file.  If there was an error a message will have been printed to
2216 * stderr.
2217 */
2218static ImageInfoList *collect_image_info_list(bool image_opts,
2219                                              const char *filename,
2220                                              const char *fmt,
2221                                              bool chain)
2222{
2223    ImageInfoList *head = NULL;
2224    ImageInfoList **last = &head;
2225    GHashTable *filenames;
2226    Error *err = NULL;
2227
2228    filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
2229
2230    while (filename) {
2231        BlockBackend *blk;
2232        BlockDriverState *bs;
2233        ImageInfo *info;
2234        ImageInfoList *elem;
2235
2236        if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
2237            error_report("Backing file '%s' creates an infinite loop.",
2238                         filename);
2239            goto err;
2240        }
2241        g_hash_table_insert(filenames, (gpointer)filename, NULL);
2242
2243        blk = img_open(image_opts, filename, fmt,
2244                       BDRV_O_NO_BACKING | BDRV_O_NO_IO, false, false);
2245        if (!blk) {
2246            goto err;
2247        }
2248        bs = blk_bs(blk);
2249
2250        bdrv_query_image_info(bs, &info, &err);
2251        if (err) {
2252            error_report_err(err);
2253            blk_unref(blk);
2254            goto err;
2255        }
2256
2257        elem = g_new0(ImageInfoList, 1);
2258        elem->value = info;
2259        *last = elem;
2260        last = &elem->next;
2261
2262        blk_unref(blk);
2263
2264        filename = fmt = NULL;
2265        if (chain) {
2266            if (info->has_full_backing_filename) {
2267                filename = info->full_backing_filename;
2268            } else if (info->has_backing_filename) {
2269                error_report("Could not determine absolute backing filename,"
2270                             " but backing filename '%s' present",
2271                             info->backing_filename);
2272                goto err;
2273            }
2274            if (info->has_backing_filename_format) {
2275                fmt = info->backing_filename_format;
2276            }
2277        }
2278    }
2279    g_hash_table_destroy(filenames);
2280    return head;
2281
2282err:
2283    qapi_free_ImageInfoList(head);
2284    g_hash_table_destroy(filenames);
2285    return NULL;
2286}
2287
2288static int img_info(int argc, char **argv)
2289{
2290    int c;
2291    OutputFormat output_format = OFORMAT_HUMAN;
2292    bool chain = false;
2293    const char *filename, *fmt, *output;
2294    ImageInfoList *list;
2295    bool image_opts = false;
2296
2297    fmt = NULL;
2298    output = NULL;
2299    for(;;) {
2300        int option_index = 0;
2301        static const struct option long_options[] = {
2302            {"help", no_argument, 0, 'h'},
2303            {"format", required_argument, 0, 'f'},
2304            {"output", required_argument, 0, OPTION_OUTPUT},
2305            {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
2306            {"object", required_argument, 0, OPTION_OBJECT},
2307            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2308            {0, 0, 0, 0}
2309        };
2310        c = getopt_long(argc, argv, "f:h",
2311                        long_options, &option_index);
2312        if (c == -1) {
2313            break;
2314        }
2315        switch(c) {
2316        case '?':
2317        case 'h':
2318            help();
2319            break;
2320        case 'f':
2321            fmt = optarg;
2322            break;
2323        case OPTION_OUTPUT:
2324            output = optarg;
2325            break;
2326        case OPTION_BACKING_CHAIN:
2327            chain = true;
2328            break;
2329        case OPTION_OBJECT: {
2330            QemuOpts *opts;
2331            opts = qemu_opts_parse_noisily(&qemu_object_opts,
2332                                           optarg, true);
2333            if (!opts) {
2334                return 1;
2335            }
2336        }   break;
2337        case OPTION_IMAGE_OPTS:
2338            image_opts = true;
2339            break;
2340        }
2341    }
2342    if (optind != argc - 1) {
2343        error_exit("Expecting one image file name");
2344    }
2345    filename = argv[optind++];
2346
2347    if (output && !strcmp(output, "json")) {
2348        output_format = OFORMAT_JSON;
2349    } else if (output && !strcmp(output, "human")) {
2350        output_format = OFORMAT_HUMAN;
2351    } else if (output) {
2352        error_report("--output must be used with human or json as argument.");
2353        return 1;
2354    }
2355
2356    if (qemu_opts_foreach(&qemu_object_opts,
2357                          user_creatable_add_opts_foreach,
2358                          NULL, NULL)) {
2359        return 1;
2360    }
2361
2362    list = collect_image_info_list(image_opts, filename, fmt, chain);
2363    if (!list) {
2364        return 1;
2365    }
2366
2367    switch (output_format) {
2368    case OFORMAT_HUMAN:
2369        dump_human_image_info_list(list);
2370        break;
2371    case OFORMAT_JSON:
2372        if (chain) {
2373            dump_json_image_info_list(list);
2374        } else {
2375            dump_json_image_info(list->value);
2376        }
2377        break;
2378    }
2379
2380    qapi_free_ImageInfoList(list);
2381    return 0;
2382}
2383
2384static void dump_map_entry(OutputFormat output_format, MapEntry *e,
2385                           MapEntry *next)
2386{
2387    switch (output_format) {
2388    case OFORMAT_HUMAN:
2389        if (e->data && !e->has_offset) {
2390            error_report("File contains external, encrypted or compressed clusters.");
2391            exit(1);
2392        }
2393        if (e->data && !e->zero) {
2394            printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
2395                   e->start, e->length,
2396                   e->has_offset ? e->offset : 0,
2397                   e->has_filename ? e->filename : "");
2398        }
2399        /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
2400         * Modify the flags here to allow more coalescing.
2401         */
2402        if (next && (!next->data || next->zero)) {
2403            next->data = false;
2404            next->zero = true;
2405        }
2406        break;
2407    case OFORMAT_JSON:
2408        printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64","
2409               " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s",
2410               (e->start == 0 ? "[" : ",\n"),
2411               e->start, e->length, e->depth,
2412               e->zero ? "true" : "false",
2413               e->data ? "true" : "false");
2414        if (e->has_offset) {
2415            printf(", \"offset\": %"PRId64"", e->offset);
2416        }
2417        putchar('}');
2418
2419        if (!next) {
2420            printf("]\n");
2421        }
2422        break;
2423    }
2424}
2425
2426static int get_block_status(BlockDriverState *bs, int64_t sector_num,
2427                            int nb_sectors, MapEntry *e)
2428{
2429    int64_t ret;
2430    int depth;
2431    BlockDriverState *file;
2432    bool has_offset;
2433
2434    /* As an optimization, we could cache the current range of unallocated
2435     * clusters in each file of the chain, and avoid querying the same
2436     * range repeatedly.
2437     */
2438
2439    depth = 0;
2440    for (;;) {
2441        ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors,
2442                                    &file);
2443        if (ret < 0) {
2444            return ret;
2445        }
2446        assert(nb_sectors);
2447        if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
2448            break;
2449        }
2450        bs = backing_bs(bs);
2451        if (bs == NULL) {
2452            ret = 0;
2453            break;
2454        }
2455
2456        depth++;
2457    }
2458
2459    has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
2460
2461    *e = (MapEntry) {
2462        .start = sector_num * BDRV_SECTOR_SIZE,
2463        .length = nb_sectors * BDRV_SECTOR_SIZE,
2464        .data = !!(ret & BDRV_BLOCK_DATA),
2465        .zero = !!(ret & BDRV_BLOCK_ZERO),
2466        .offset = ret & BDRV_BLOCK_OFFSET_MASK,
2467        .has_offset = has_offset,
2468        .depth = depth,
2469        .has_filename = file && has_offset,
2470        .filename = file && has_offset ? file->filename : NULL,
2471    };
2472
2473    return 0;
2474}
2475
2476static inline bool entry_mergeable(const MapEntry *curr, const MapEntry *next)
2477{
2478    if (curr->length == 0) {
2479        return false;
2480    }
2481    if (curr->zero != next->zero ||
2482        curr->data != next->data ||
2483        curr->depth != next->depth ||
2484        curr->has_filename != next->has_filename ||
2485        curr->has_offset != next->has_offset) {
2486        return false;
2487    }
2488    if (curr->has_filename && strcmp(curr->filename, next->filename)) {
2489        return false;
2490    }
2491    if (curr->has_offset && curr->offset + curr->length != next->offset) {
2492        return false;
2493    }
2494    return true;
2495}
2496
2497static int img_map(int argc, char **argv)
2498{
2499    int c;
2500    OutputFormat output_format = OFORMAT_HUMAN;
2501    BlockBackend *blk;
2502    BlockDriverState *bs;
2503    const char *filename, *fmt, *output;
2504    int64_t length;
2505    MapEntry curr = { .length = 0 }, next;
2506    int ret = 0;
2507    bool image_opts = false;
2508
2509    fmt = NULL;
2510    output = NULL;
2511    for (;;) {
2512        int option_index = 0;
2513        static const struct option long_options[] = {
2514            {"help", no_argument, 0, 'h'},
2515            {"format", required_argument, 0, 'f'},
2516            {"output", required_argument, 0, OPTION_OUTPUT},
2517            {"object", required_argument, 0, OPTION_OBJECT},
2518            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2519            {0, 0, 0, 0}
2520        };
2521        c = getopt_long(argc, argv, "f:h",
2522                        long_options, &option_index);
2523        if (c == -1) {
2524            break;
2525        }
2526        switch (c) {
2527        case '?':
2528        case 'h':
2529            help();
2530            break;
2531        case 'f':
2532            fmt = optarg;
2533            break;
2534        case OPTION_OUTPUT:
2535            output = optarg;
2536            break;
2537        case OPTION_OBJECT: {
2538            QemuOpts *opts;
2539            opts = qemu_opts_parse_noisily(&qemu_object_opts,
2540                                           optarg, true);
2541            if (!opts) {
2542                return 1;
2543            }
2544        }   break;
2545        case OPTION_IMAGE_OPTS:
2546            image_opts = true;
2547            break;
2548        }
2549    }
2550    if (optind != argc - 1) {
2551        error_exit("Expecting one image file name");
2552    }
2553    filename = argv[optind];
2554
2555    if (output && !strcmp(output, "json")) {
2556        output_format = OFORMAT_JSON;
2557    } else if (output && !strcmp(output, "human")) {
2558        output_format = OFORMAT_HUMAN;
2559    } else if (output) {
2560        error_report("--output must be used with human or json as argument.");
2561        return 1;
2562    }
2563
2564    if (qemu_opts_foreach(&qemu_object_opts,
2565                          user_creatable_add_opts_foreach,
2566                          NULL, NULL)) {
2567        return 1;
2568    }
2569
2570    blk = img_open(image_opts, filename, fmt, 0, false, false);
2571    if (!blk) {
2572        return 1;
2573    }
2574    bs = blk_bs(blk);
2575
2576    if (output_format == OFORMAT_HUMAN) {
2577        printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
2578    }
2579
2580    length = blk_getlength(blk);
2581    while (curr.start + curr.length < length) {
2582        int64_t nsectors_left;
2583        int64_t sector_num;
2584        int n;
2585
2586        sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
2587
2588        /* Probe up to 1 GiB at a time.  */
2589        nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
2590        n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
2591        ret = get_block_status(bs, sector_num, n, &next);
2592
2593        if (ret < 0) {
2594            error_report("Could not read file metadata: %s", strerror(-ret));
2595            goto out;
2596        }
2597
2598        if (entry_mergeable(&curr, &next)) {
2599            curr.length += next.length;
2600            continue;
2601        }
2602
2603        if (curr.length > 0) {
2604            dump_map_entry(output_format, &curr, &next);
2605        }
2606        curr = next;
2607    }
2608
2609    dump_map_entry(output_format, &curr, NULL);
2610
2611out:
2612    blk_unref(blk);
2613    return ret < 0;
2614}
2615
2616#define SNAPSHOT_LIST   1
2617#define SNAPSHOT_CREATE 2
2618#define SNAPSHOT_APPLY  3
2619#define SNAPSHOT_DELETE 4
2620
2621static int img_snapshot(int argc, char **argv)
2622{
2623    BlockBackend *blk;
2624    BlockDriverState *bs;
2625    QEMUSnapshotInfo sn;
2626    char *filename, *snapshot_name = NULL;
2627    int c, ret = 0, bdrv_oflags;
2628    int action = 0;
2629    qemu_timeval tv;
2630    bool quiet = false;
2631    Error *err = NULL;
2632    bool image_opts = false;
2633
2634    bdrv_oflags = BDRV_O_RDWR;
2635    /* Parse commandline parameters */
2636    for(;;) {
2637        static const struct option long_options[] = {
2638            {"help", no_argument, 0, 'h'},
2639            {"object", required_argument, 0, OPTION_OBJECT},
2640            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2641            {0, 0, 0, 0}
2642        };
2643        c = getopt_long(argc, argv, "la:c:d:hq",
2644                        long_options, NULL);
2645        if (c == -1) {
2646            break;
2647        }
2648        switch(c) {
2649        case '?':
2650        case 'h':
2651            help();
2652            return 0;
2653        case 'l':
2654            if (action) {
2655                error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2656                return 0;
2657            }
2658            action = SNAPSHOT_LIST;
2659            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
2660            break;
2661        case 'a':
2662            if (action) {
2663                error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2664                return 0;
2665            }
2666            action = SNAPSHOT_APPLY;
2667            snapshot_name = optarg;
2668            break;
2669        case 'c':
2670            if (action) {
2671                error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2672                return 0;
2673            }
2674            action = SNAPSHOT_CREATE;
2675            snapshot_name = optarg;
2676            break;
2677        case 'd':
2678            if (action) {
2679                error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2680                return 0;
2681            }
2682            action = SNAPSHOT_DELETE;
2683            snapshot_name = optarg;
2684            break;
2685        case 'q':
2686            quiet = true;
2687            break;
2688        case OPTION_OBJECT: {
2689            QemuOpts *opts;
2690            opts = qemu_opts_parse_noisily(&qemu_object_opts,
2691                                           optarg, true);
2692            if (!opts) {
2693                return 1;
2694            }
2695        }   break;
2696        case OPTION_IMAGE_OPTS:
2697            image_opts = true;
2698            break;
2699        }
2700    }
2701
2702    if (optind != argc - 1) {
2703        error_exit("Expecting one image file name");
2704    }
2705    filename = argv[optind++];
2706
2707    if (qemu_opts_foreach(&qemu_object_opts,
2708                          user_creatable_add_opts_foreach,
2709                          NULL, NULL)) {
2710        return 1;
2711    }
2712
2713    /* Open the image */
2714    blk = img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet);
2715    if (!blk) {
2716        return 1;
2717    }
2718    bs = blk_bs(blk);
2719
2720    /* Perform the requested action */
2721    switch(action) {
2722    case SNAPSHOT_LIST:
2723        dump_snapshots(bs);
2724        break;
2725
2726    case SNAPSHOT_CREATE:
2727        memset(&sn, 0, sizeof(sn));
2728        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
2729
2730        qemu_gettimeofday(&tv);
2731        sn.date_sec = tv.tv_sec;
2732        sn.date_nsec = tv.tv_usec * 1000;
2733
2734        ret = bdrv_snapshot_create(bs, &sn);
2735        if (ret) {
2736            error_report("Could not create snapshot '%s': %d (%s)",
2737                snapshot_name, ret, strerror(-ret));
2738        }
2739        break;
2740
2741    case SNAPSHOT_APPLY:
2742        ret = bdrv_snapshot_goto(bs, snapshot_name);
2743        if (ret) {
2744            error_report("Could not apply snapshot '%s': %d (%s)",
2745                snapshot_name, ret, strerror(-ret));
2746        }
2747        break;
2748
2749    case SNAPSHOT_DELETE:
2750        bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
2751        if (err) {
2752            error_reportf_err(err, "Could not delete snapshot '%s': ",
2753                              snapshot_name);
2754            ret = 1;
2755        }
2756        break;
2757    }
2758
2759    /* Cleanup */
2760    blk_unref(blk);
2761    if (ret) {
2762        return 1;
2763    }
2764    return 0;
2765}
2766
2767static int img_rebase(int argc, char **argv)
2768{
2769    BlockBackend *blk = NULL, *blk_old_backing = NULL, *blk_new_backing = NULL;
2770    uint8_t *buf_old = NULL;
2771    uint8_t *buf_new = NULL;
2772    BlockDriverState *bs = NULL;
2773    char *filename;
2774    const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg;
2775    int c, flags, src_flags, ret;
2776    bool writethrough, src_writethrough;
2777    int unsafe = 0;
2778    int progress = 0;
2779    bool quiet = false;
2780    Error *local_err = NULL;
2781    bool image_opts = false;
2782
2783    /* Parse commandline parameters */
2784    fmt = NULL;
2785    cache = BDRV_DEFAULT_CACHE;
2786    src_cache = BDRV_DEFAULT_CACHE;
2787    out_baseimg = NULL;
2788    out_basefmt = NULL;
2789    for(;;) {
2790        static const struct option long_options[] = {
2791            {"help", no_argument, 0, 'h'},
2792            {"object", required_argument, 0, OPTION_OBJECT},
2793            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2794            {0, 0, 0, 0}
2795        };
2796        c = getopt_long(argc, argv, "hf:F:b:upt:T:q",
2797                        long_options, NULL);
2798        if (c == -1) {
2799            break;
2800        }
2801        switch(c) {
2802        case '?':
2803        case 'h':
2804            help();
2805            return 0;
2806        case 'f':
2807            fmt = optarg;
2808            break;
2809        case 'F':
2810            out_basefmt = optarg;
2811            break;
2812        case 'b':
2813            out_baseimg = optarg;
2814            break;
2815        case 'u':
2816            unsafe = 1;
2817            break;
2818        case 'p':
2819            progress = 1;
2820            break;
2821        case 't':
2822            cache = optarg;
2823            break;
2824        case 'T':
2825            src_cache = optarg;
2826            break;
2827        case 'q':
2828            quiet = true;
2829            break;
2830        case OPTION_OBJECT: {
2831            QemuOpts *opts;
2832            opts = qemu_opts_parse_noisily(&qemu_object_opts,
2833                                           optarg, true);
2834            if (!opts) {
2835                return 1;
2836            }
2837        }   break;
2838        case OPTION_IMAGE_OPTS:
2839            image_opts = true;
2840            break;
2841        }
2842    }
2843
2844    if (quiet) {
2845        progress = 0;
2846    }
2847
2848    if (optind != argc - 1) {
2849        error_exit("Expecting one image file name");
2850    }
2851    if (!unsafe && !out_baseimg) {
2852        error_exit("Must specify backing file (-b) or use unsafe mode (-u)");
2853    }
2854    filename = argv[optind++];
2855
2856    if (qemu_opts_foreach(&qemu_object_opts,
2857                          user_creatable_add_opts_foreach,
2858                          NULL, NULL)) {
2859        return 1;
2860    }
2861
2862    qemu_progress_init(progress, 2.0);
2863    qemu_progress_print(0, 100);
2864
2865    flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
2866    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
2867    if (ret < 0) {
2868        error_report("Invalid cache option: %s", cache);
2869        goto out;
2870    }
2871
2872    src_flags = 0;
2873    ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
2874    if (ret < 0) {
2875        error_report("Invalid source cache option: %s", src_cache);
2876        goto out;
2877    }
2878
2879    /* The source files are opened read-only, don't care about WCE */
2880    assert((src_flags & BDRV_O_RDWR) == 0);
2881    (void) src_writethrough;
2882
2883    /*
2884     * Open the images.
2885     *
2886     * Ignore the old backing file for unsafe rebase in case we want to correct
2887     * the reference to a renamed or moved backing file.
2888     */
2889    blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet);
2890    if (!blk) {
2891        ret = -1;
2892        goto out;
2893    }
2894    bs = blk_bs(blk);
2895
2896    if (out_basefmt != NULL) {
2897        if (bdrv_find_format(out_basefmt) == NULL) {
2898            error_report("Invalid format name: '%s'", out_basefmt);
2899            ret = -1;
2900            goto out;
2901        }
2902    }
2903
2904    /* For safe rebasing we need to compare old and new backing file */
2905    if (!unsafe) {
2906        char backing_name[PATH_MAX];
2907        QDict *options = NULL;
2908
2909        if (bs->backing_format[0] != '\0') {
2910            options = qdict_new();
2911            qdict_put(options, "driver", qstring_from_str(bs->backing_format));
2912        }
2913
2914        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2915        blk_old_backing = blk_new_open(backing_name, NULL,
2916                                       options, src_flags, &local_err);
2917        if (!blk_old_backing) {
2918            error_reportf_err(local_err,
2919                              "Could not open old backing file '%s': ",
2920                              backing_name);
2921            goto out;
2922        }
2923
2924        if (out_baseimg[0]) {
2925            if (out_basefmt) {
2926                options = qdict_new();
2927                qdict_put(options, "driver", qstring_from_str(out_basefmt));
2928            } else {
2929                options = NULL;
2930            }
2931
2932            blk_new_backing = blk_new_open(out_baseimg, NULL,
2933                                           options, src_flags, &local_err);
2934            if (!blk_new_backing) {
2935                error_reportf_err(local_err,
2936                                  "Could not open new backing file '%s': ",
2937                                  out_baseimg);
2938                goto out;
2939            }
2940        }
2941    }
2942
2943    /*
2944     * Check each unallocated cluster in the COW file. If it is unallocated,
2945     * accesses go to the backing file. We must therefore compare this cluster
2946     * in the old and new backing file, and if they differ we need to copy it
2947     * from the old backing file into the COW file.
2948     *
2949     * If qemu-img crashes during this step, no harm is done. The content of
2950     * the image is the same as the original one at any time.
2951     */
2952    if (!unsafe) {
2953        int64_t num_sectors;
2954        int64_t old_backing_num_sectors;
2955        int64_t new_backing_num_sectors = 0;
2956        uint64_t sector;
2957        int n;
2958        float local_progress = 0;
2959
2960        buf_old = blk_blockalign(blk, IO_BUF_SIZE);
2961        buf_new = blk_blockalign(blk, IO_BUF_SIZE);
2962
2963        num_sectors = blk_nb_sectors(blk);
2964        if (num_sectors < 0) {
2965            error_report("Could not get size of '%s': %s",
2966                         filename, strerror(-num_sectors));
2967            ret = -1;
2968            goto out;
2969        }
2970        old_backing_num_sectors = blk_nb_sectors(blk_old_backing);
2971        if (old_backing_num_sectors < 0) {
2972            char backing_name[PATH_MAX];
2973
2974            bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2975            error_report("Could not get size of '%s': %s",
2976                         backing_name, strerror(-old_backing_num_sectors));
2977            ret = -1;
2978            goto out;
2979        }
2980        if (blk_new_backing) {
2981            new_backing_num_sectors = blk_nb_sectors(blk_new_backing);
2982            if (new_backing_num_sectors < 0) {
2983                error_report("Could not get size of '%s': %s",
2984                             out_baseimg, strerror(-new_backing_num_sectors));
2985                ret = -1;
2986                goto out;
2987            }
2988        }
2989
2990        if (num_sectors != 0) {
2991            local_progress = (float)100 /
2992                (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2993        }
2994
2995        for (sector = 0; sector < num_sectors; sector += n) {
2996
2997            /* How many sectors can we handle with the next read? */
2998            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2999                n = (IO_BUF_SIZE / 512);
3000            } else {
3001                n = num_sectors - sector;
3002            }
3003
3004            /* If the cluster is allocated, we don't need to take action */
3005            ret = bdrv_is_allocated(bs, sector, n, &n);
3006            if (ret < 0) {
3007                error_report("error while reading image metadata: %s",
3008                             strerror(-ret));
3009                goto out;
3010            }
3011            if (ret) {
3012                continue;
3013            }
3014
3015            /*
3016             * Read old and new backing file and take into consideration that
3017             * backing files may be smaller than the COW image.
3018             */
3019            if (sector >= old_backing_num_sectors) {
3020                memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
3021            } else {
3022                if (sector + n > old_backing_num_sectors) {
3023                    n = old_backing_num_sectors - sector;
3024                }
3025
3026                ret = blk_read(blk_old_backing, sector, buf_old, n);
3027                if (ret < 0) {
3028                    error_report("error while reading from old backing file");
3029                    goto out;
3030                }
3031            }
3032
3033            if (sector >= new_backing_num_sectors || !blk_new_backing) {
3034                memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
3035            } else {
3036                if (sector + n > new_backing_num_sectors) {
3037                    n = new_backing_num_sectors - sector;
3038                }
3039
3040                ret = blk_read(blk_new_backing, sector, buf_new, n);
3041                if (ret < 0) {
3042                    error_report("error while reading from new backing file");
3043                    goto out;
3044                }
3045            }
3046
3047            /* If they differ, we need to write to the COW file */
3048            uint64_t written = 0;
3049
3050            while (written < n) {
3051                int pnum;
3052
3053                if (compare_sectors(buf_old + written * 512,
3054                    buf_new + written * 512, n - written, &pnum))
3055                {
3056                    ret = blk_write(blk, sector + written,
3057                                    buf_old + written * 512, pnum);
3058                    if (ret < 0) {
3059                        error_report("Error while writing to COW image: %s",
3060                            strerror(-ret));
3061                        goto out;
3062                    }
3063                }
3064
3065                written += pnum;
3066            }
3067            qemu_progress_print(local_progress, 100);
3068        }
3069    }
3070
3071    /*
3072     * Change the backing file. All clusters that are different from the old
3073     * backing file are overwritten in the COW file now, so the visible content
3074     * doesn't change when we switch the backing file.
3075     */
3076    if (out_baseimg && *out_baseimg) {
3077        ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
3078    } else {
3079        ret = bdrv_change_backing_file(bs, NULL, NULL);
3080    }
3081
3082    if (ret == -ENOSPC) {
3083        error_report("Could not change the backing file to '%s': No "
3084                     "space left in the file header", out_baseimg);
3085    } else if (ret < 0) {
3086        error_report("Could not change the backing file to '%s': %s",
3087            out_baseimg, strerror(-ret));
3088    }
3089
3090    qemu_progress_print(100, 0);
3091    /*
3092     * TODO At this point it is possible to check if any clusters that are
3093     * allocated in the COW file are the same in the backing file. If so, they
3094     * could be dropped from the COW file. Don't do this before switching the
3095     * backing file, in case of a crash this would lead to corruption.
3096     */
3097out:
3098    qemu_progress_end();
3099    /* Cleanup */
3100    if (!unsafe) {
3101        blk_unref(blk_old_backing);
3102        blk_unref(blk_new_backing);
3103    }
3104    qemu_vfree(buf_old);
3105    qemu_vfree(buf_new);
3106
3107    blk_unref(blk);
3108    if (ret) {
3109        return 1;
3110    }
3111    return 0;
3112}
3113
3114static int img_resize(int argc, char **argv)
3115{
3116    Error *err = NULL;
3117    int c, ret, relative;
3118    const char *filename, *fmt, *size;
3119    int64_t n, total_size;
3120    bool quiet = false;
3121    BlockBackend *blk = NULL;
3122    QemuOpts *param;
3123
3124    static QemuOptsList resize_options = {
3125        .name = "resize_options",
3126        .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
3127        .desc = {
3128            {
3129                .name = BLOCK_OPT_SIZE,
3130                .type = QEMU_OPT_SIZE,
3131                .help = "Virtual disk size"
3132            }, {
3133                /* end of list */
3134            }
3135        },
3136    };
3137    bool image_opts = false;
3138
3139    /* Remove size from argv manually so that negative numbers are not treated
3140     * as options by getopt. */
3141    if (argc < 3) {
3142        error_exit("Not enough arguments");
3143        return 1;
3144    }
3145
3146    size = argv[--argc];
3147
3148    /* Parse getopt arguments */
3149    fmt = NULL;
3150    for(;;) {
3151        static const struct option long_options[] = {
3152            {"help", no_argument, 0, 'h'},
3153            {"object", required_argument, 0, OPTION_OBJECT},
3154            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3155            {0, 0, 0, 0}
3156        };
3157        c = getopt_long(argc, argv, "f:hq",
3158                        long_options, NULL);
3159        if (c == -1) {
3160            break;
3161        }
3162        switch(c) {
3163        case '?':
3164        case 'h':
3165            help();
3166            break;
3167        case 'f':
3168            fmt = optarg;
3169            break;
3170        case 'q':
3171            quiet = true;
3172            break;
3173        case OPTION_OBJECT: {
3174            QemuOpts *opts;
3175            opts = qemu_opts_parse_noisily(&qemu_object_opts,
3176                                           optarg, true);
3177            if (!opts) {
3178                return 1;
3179            }
3180        }   break;
3181        case OPTION_IMAGE_OPTS:
3182            image_opts = true;
3183            break;
3184        }
3185    }
3186    if (optind != argc - 1) {
3187        error_exit("Expecting one image file name");
3188    }
3189    filename = argv[optind++];
3190
3191    if (qemu_opts_foreach(&qemu_object_opts,
3192                          user_creatable_add_opts_foreach,
3193                          NULL, NULL)) {
3194        return 1;
3195    }
3196
3197    /* Choose grow, shrink, or absolute resize mode */
3198    switch (size[0]) {
3199    case '+':
3200        relative = 1;
3201        size++;
3202        break;
3203    case '-':
3204        relative = -1;
3205        size++;
3206        break;
3207    default:
3208        relative = 0;
3209        break;
3210    }
3211
3212    /* Parse size */
3213    param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
3214    qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err);
3215    if (err) {
3216        error_report_err(err);
3217        ret = -1;
3218        qemu_opts_del(param);
3219        goto out;
3220    }
3221    n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
3222    qemu_opts_del(param);
3223
3224    blk = img_open(image_opts, filename, fmt,
3225                   BDRV_O_RDWR, false, quiet);
3226    if (!blk) {
3227        ret = -1;
3228        goto out;
3229    }
3230
3231    if (relative) {
3232        total_size = blk_getlength(blk) + n * relative;
3233    } else {
3234        total_size = n;
3235    }
3236    if (total_size <= 0) {
3237        error_report("New image size must be positive");
3238        ret = -1;
3239        goto out;
3240    }
3241
3242    ret = blk_truncate(blk, total_size);
3243    switch (ret) {
3244    case 0:
3245        qprintf(quiet, "Image resized.\n");
3246        break;
3247    case -ENOTSUP:
3248        error_report("This image does not support resize");
3249        break;
3250    case -EACCES:
3251        error_report("Image is read-only");
3252        break;
3253    default:
3254        error_report("Error resizing image (%d)", -ret);
3255        break;
3256    }
3257out:
3258    blk_unref(blk);
3259    if (ret) {
3260        return 1;
3261    }
3262    return 0;
3263}
3264
3265static void amend_status_cb(BlockDriverState *bs,
3266                            int64_t offset, int64_t total_work_size,
3267                            void *opaque)
3268{
3269    qemu_progress_print(100.f * offset / total_work_size, 0);
3270}
3271
3272static int img_amend(int argc, char **argv)
3273{
3274    Error *err = NULL;
3275    int c, ret = 0;
3276    char *options = NULL;
3277    QemuOptsList *create_opts = NULL;
3278    QemuOpts *opts = NULL;
3279    const char *fmt = NULL, *filename, *cache;
3280    int flags;
3281    bool writethrough;
3282    bool quiet = false, progress = false;
3283    BlockBackend *blk = NULL;
3284    BlockDriverState *bs = NULL;
3285    bool image_opts = false;
3286
3287    cache = BDRV_DEFAULT_CACHE;
3288    for (;;) {
3289        static const struct option long_options[] = {
3290            {"help", no_argument, 0, 'h'},
3291            {"object", required_argument, 0, OPTION_OBJECT},
3292            {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3293            {0, 0, 0, 0}
3294        };
3295        c = getopt_long(argc, argv, "ho:f:t:pq",
3296                        long_options, NULL);
3297        if (c == -1) {
3298            break;
3299        }
3300
3301        switch (c) {
3302            case 'h':
3303            case '?':
3304                help();
3305                break;
3306            case 'o':
3307                if (!is_valid_option_list(optarg)) {
3308                    error_report("Invalid option list: %s", optarg);
3309                    ret = -1;
3310                    goto out_no_progress;
3311                }
3312                if (!options) {
3313                    options = g_strdup(optarg);
3314                } else {
3315                    char *old_options = options;
3316                    options = g_strdup_printf("%s,%s", options, optarg);
3317                    g_free(old_options);
3318                }
3319                break;
3320            case 'f':
3321                fmt = optarg;
3322                break;
3323            case 't':
3324                cache = optarg;
3325                break;
3326            case 'p':
3327                progress = true;
3328                break;
3329            case 'q':
3330                quiet = true;
3331                break;
3332            case OPTION_OBJECT:
3333                opts = qemu_opts_parse_noisily(&qemu_object_opts,
3334                                               optarg, true);
3335                if (!opts) {
3336                    ret = -1;
3337                    goto out_no_progress;
3338                }
3339                break;
3340            case OPTION_IMAGE_OPTS:
3341                image_opts = true;
3342                break;
3343        }
3344    }
3345
3346    if (!options) {
3347        error_exit("Must specify options (-o)");
3348    }
3349
3350    if (qemu_opts_foreach(&qemu_object_opts,
3351                          user_creatable_add_opts_foreach,
3352                          NULL, NULL)) {
3353        ret = -1;
3354        goto out_no_progress;
3355    }
3356
3357    if (quiet) {
3358        progress = false;
3359    }
3360    qemu_progress_init(progress, 1.0);
3361
3362    filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
3363    if (fmt && has_help_option(options)) {
3364        /* If a format is explicitly specified (and possibly no filename is
3365         * given), print option help here */
3366        ret = print_block_option_help(filename, fmt);
3367        goto out;
3368    }
3369
3370    if (optind != argc - 1) {
3371        error_report("Expecting one image file name");
3372        ret = -1;
3373        goto out;
3374    }
3375
3376    flags = BDRV_O_RDWR;
3377    ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
3378    if (ret < 0) {
3379        error_report("Invalid cache option: %s", cache);
3380        goto out;
3381    }
3382
3383    blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet);
3384    if (!blk) {
3385        ret = -1;
3386        goto out;
3387    }
3388    bs = blk_bs(blk);
3389
3390    fmt = bs->drv->format_name;
3391
3392    if (has_help_option(options)) {
3393        /* If the format was auto-detected, print option help here */
3394        ret = print_block_option_help(filename, fmt);
3395        goto out;
3396    }
3397
3398    if (!bs->drv->create_opts) {
3399        error_report("Format driver '%s' does not support any options to amend",
3400                     fmt);
3401        ret = -1;
3402        goto out;
3403    }
3404
3405    create_opts = qemu_opts_append(create_opts, bs->drv->create_opts);
3406    opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
3407    if (options) {
3408        qemu_opts_do_parse(opts, options, NULL, &err);
3409        if (err) {
3410            error_report_err(err);
3411            ret = -1;
3412            goto out;
3413        }
3414    }
3415
3416    /* In case the driver does not call amend_status_cb() */
3417    qemu_progress_print(0.f, 0);
3418    ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL);
3419    qemu_progress_print(100.f, 0);
3420    if (ret < 0) {
3421        error_report("Error while amending options: %s", strerror(-ret));
3422        goto out;
3423    }
3424
3425out:
3426    qemu_progress_end();
3427
3428out_no_progress:
3429    blk_unref(blk);
3430    qemu_opts_del(opts);
3431    qemu_opts_free(create_opts);
3432    g_free(options);
3433
3434    if (ret) {
3435        return 1;
3436    }
3437    return 0;
3438}
3439
3440static const img_cmd_t img_cmds[] = {
3441#define DEF(option, callback, arg_string)        \
3442    { option, callback },
3443#include "qemu-img-cmds.h"
3444#undef DEF
3445#undef GEN_DOCS
3446    { NULL, NULL, },
3447};
3448
3449int main(int argc, char **argv)
3450{
3451    const img_cmd_t *cmd;
3452    const char *cmdname;
3453    Error *local_error = NULL;
3454    int c;
3455    static const struct option long_options[] = {
3456        {"help", no_argument, 0, 'h'},
3457        {"version", no_argument, 0, 'v'},
3458        {0, 0, 0, 0}
3459    };
3460
3461#ifdef CONFIG_POSIX
3462    signal(SIGPIPE, SIG_IGN);
3463#endif
3464
3465    error_set_progname(argv[0]);
3466    qemu_init_exec_dir(argv[0]);
3467
3468    if (qemu_init_main_loop(&local_error)) {
3469        error_report_err(local_error);
3470        exit(EXIT_FAILURE);
3471    }
3472
3473    if (qcrypto_init(&local_error) < 0) {
3474        error_reportf_err(local_error, "cannot initialize crypto: ");
3475        exit(1);
3476    }
3477
3478    module_call_init(MODULE_INIT_QOM);
3479    bdrv_init();
3480    if (argc < 2) {
3481        error_exit("Not enough arguments");
3482    }
3483    cmdname = argv[1];
3484
3485    qemu_add_opts(&qemu_object_opts);
3486    qemu_add_opts(&qemu_source_opts);
3487
3488    /* find the command */
3489    for (cmd = img_cmds; cmd->name != NULL; cmd++) {
3490        if (!strcmp(cmdname, cmd->name)) {
3491            return cmd->handler(argc - 1, argv + 1);
3492        }
3493    }
3494
3495    c = getopt_long(argc, argv, "h", long_options, NULL);
3496
3497    if (c == 'h') {
3498        help();
3499    }
3500    if (c == 'v') {
3501        printf(QEMU_IMG_VERSION);
3502        return 0;
3503    }
3504
3505    /* not found */
3506    error_exit("Command not found: %s", cmdname);
3507}
3508