cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qemu-img.c (163176B)


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