qemu/qemu-img.c
<<
>>
Prefs
   1/*
   2 * QEMU disk image utility
   3 *
   4 * Copyright (c) 2003-2008 Fabrice Bellard
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24#include "qemu-common.h"
  25#include "qemu-option.h"
  26#include "qemu-error.h"
  27#include "osdep.h"
  28#include "sysemu.h"
  29#include "block_int.h"
  30#include <stdio.h>
  31
  32#ifdef _WIN32
  33#include <windows.h>
  34#endif
  35
  36typedef struct img_cmd_t {
  37    const char *name;
  38    int (*handler)(int argc, char **argv);
  39} img_cmd_t;
  40
  41/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
  42#define BDRV_O_FLAGS BDRV_O_CACHE_WB
  43#define BDRV_DEFAULT_CACHE "writeback"
  44
  45static void format_print(void *opaque, const char *name)
  46{
  47    printf(" %s", name);
  48}
  49
  50/* Please keep in synch with qemu-img.texi */
  51static void help(void)
  52{
  53    const char *help_msg =
  54           "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
  55           "usage: qemu-img command [command options]\n"
  56           "QEMU disk image utility\n"
  57           "\n"
  58           "Command syntax:\n"
  59#define DEF(option, callback, arg_string)        \
  60           "  " arg_string "\n"
  61#include "qemu-img-cmds.h"
  62#undef DEF
  63#undef GEN_DOCS
  64           "\n"
  65           "Command parameters:\n"
  66           "  'filename' is a disk image filename\n"
  67           "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
  68           "  'cache' is the cache mode used to write the output disk image, the valid\n"
  69           "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
  70           "    'directsync' and 'unsafe' (default for convert)\n"
  71           "  'size' is the disk image size in bytes. Optional suffixes\n"
  72           "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
  73           "    and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
  74           "  'output_filename' is the destination disk image filename\n"
  75           "  'output_fmt' is the destination format\n"
  76           "  'options' is a comma separated list of format specific options in a\n"
  77           "    name=value format. Use -o ? for an overview of the options supported by the\n"
  78           "    used format\n"
  79           "  '-c' indicates that target image must be compressed (qcow format only)\n"
  80           "  '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
  81           "       match exactly. The image doesn't need a working backing file before\n"
  82           "       rebasing in this case (useful for renaming the backing file)\n"
  83           "  '-h' with or without a command shows this help and lists the supported formats\n"
  84           "  '-p' show progress of command (only certain commands)\n"
  85           "  '-S' indicates the consecutive number of bytes that must contain only zeros\n"
  86           "       for qemu-img to create a sparse image during conversion\n"
  87           "\n"
  88           "Parameters to check subcommand:\n"
  89           "  '-r' tries to repair any inconsistencies that are found during the check.\n"
  90           "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
  91           "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
  92           "       hiding corruption that has already occured.\n"
  93           "\n"
  94           "Parameters to snapshot subcommand:\n"
  95           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
  96           "  '-a' applies a snapshot (revert disk to saved state)\n"
  97           "  '-c' creates a snapshot\n"
  98           "  '-d' deletes a snapshot\n"
  99           "  '-l' lists all snapshots in the given image\n";
 100
 101    printf("%s\nSupported formats:", help_msg);
 102    bdrv_iterate_format(format_print, NULL);
 103    printf("\n");
 104    exit(1);
 105}
 106
 107#if defined(WIN32)
 108/* XXX: put correct support for win32 */
 109static int read_password(char *buf, int buf_size)
 110{
 111    int c, i;
 112    printf("Password: ");
 113    fflush(stdout);
 114    i = 0;
 115    for(;;) {
 116        c = getchar();
 117        if (c == '\n')
 118            break;
 119        if (i < (buf_size - 1))
 120            buf[i++] = c;
 121    }
 122    buf[i] = '\0';
 123    return 0;
 124}
 125
 126#else
 127
 128#include <termios.h>
 129
 130static struct termios oldtty;
 131
 132static void term_exit(void)
 133{
 134    tcsetattr (0, TCSANOW, &oldtty);
 135}
 136
 137static void term_init(void)
 138{
 139    struct termios tty;
 140
 141    tcgetattr (0, &tty);
 142    oldtty = tty;
 143
 144    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
 145                          |INLCR|IGNCR|ICRNL|IXON);
 146    tty.c_oflag |= OPOST;
 147    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
 148    tty.c_cflag &= ~(CSIZE|PARENB);
 149    tty.c_cflag |= CS8;
 150    tty.c_cc[VMIN] = 1;
 151    tty.c_cc[VTIME] = 0;
 152
 153    tcsetattr (0, TCSANOW, &tty);
 154
 155    atexit(term_exit);
 156}
 157
 158static int read_password(char *buf, int buf_size)
 159{
 160    uint8_t ch;
 161    int i, ret;
 162
 163    printf("password: ");
 164    fflush(stdout);
 165    term_init();
 166    i = 0;
 167    for(;;) {
 168        ret = read(0, &ch, 1);
 169        if (ret == -1) {
 170            if (errno == EAGAIN || errno == EINTR) {
 171                continue;
 172            } else {
 173                ret = -1;
 174                break;
 175            }
 176        } else if (ret == 0) {
 177            ret = -1;
 178            break;
 179        } else {
 180            if (ch == '\r') {
 181                ret = 0;
 182                break;
 183            }
 184            if (i < (buf_size - 1))
 185                buf[i++] = ch;
 186        }
 187    }
 188    term_exit();
 189    buf[i] = '\0';
 190    printf("\n");
 191    return ret;
 192}
 193#endif
 194
 195static int print_block_option_help(const char *filename, const char *fmt)
 196{
 197    BlockDriver *drv, *proto_drv;
 198    QEMUOptionParameter *create_options = NULL;
 199
 200    /* Find driver and parse its options */
 201    drv = bdrv_find_format(fmt);
 202    if (!drv) {
 203        error_report("Unknown file format '%s'", fmt);
 204        return 1;
 205    }
 206
 207    proto_drv = bdrv_find_protocol(filename);
 208    if (!proto_drv) {
 209        error_report("Unknown protocol '%s'", filename);
 210        return 1;
 211    }
 212
 213    create_options = append_option_parameters(create_options,
 214                                              drv->create_options);
 215    create_options = append_option_parameters(create_options,
 216                                              proto_drv->create_options);
 217    print_option_help(create_options);
 218    free_option_parameters(create_options);
 219    return 0;
 220}
 221
 222static BlockDriverState *bdrv_new_open(const char *filename,
 223                                       const char *fmt,
 224                                       int flags)
 225{
 226    BlockDriverState *bs;
 227    BlockDriver *drv;
 228    char password[256];
 229    int ret;
 230
 231    bs = bdrv_new("image");
 232
 233    if (fmt) {
 234        drv = bdrv_find_format(fmt);
 235        if (!drv) {
 236            error_report("Unknown file format '%s'", fmt);
 237            goto fail;
 238        }
 239    } else {
 240        drv = NULL;
 241    }
 242
 243    ret = bdrv_open(bs, filename, flags, drv);
 244    if (ret < 0) {
 245        error_report("Could not open '%s': %s", filename, strerror(-ret));
 246        goto fail;
 247    }
 248
 249    if (bdrv_is_encrypted(bs)) {
 250        printf("Disk image '%s' is encrypted.\n", filename);
 251        if (read_password(password, sizeof(password)) < 0) {
 252            error_report("No password given");
 253            goto fail;
 254        }
 255        if (bdrv_set_key(bs, password) < 0) {
 256            error_report("invalid password");
 257            goto fail;
 258        }
 259    }
 260    return bs;
 261fail:
 262    if (bs) {
 263        bdrv_delete(bs);
 264    }
 265    return NULL;
 266}
 267
 268static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
 269                                 const char *base_filename,
 270                                 const char *base_fmt)
 271{
 272    if (base_filename) {
 273        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
 274            error_report("Backing file not supported for file format '%s'",
 275                         fmt);
 276            return -1;
 277        }
 278    }
 279    if (base_fmt) {
 280        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
 281            error_report("Backing file format not supported for file "
 282                         "format '%s'", fmt);
 283            return -1;
 284        }
 285    }
 286    return 0;
 287}
 288
 289static int img_create(int argc, char **argv)
 290{
 291    int c, ret = 0;
 292    uint64_t img_size = -1;
 293    const char *fmt = "raw";
 294    const char *base_fmt = NULL;
 295    const char *filename;
 296    const char *base_filename = NULL;
 297    char *options = NULL;
 298
 299    for(;;) {
 300        c = getopt(argc, argv, "F:b:f:he6o:");
 301        if (c == -1) {
 302            break;
 303        }
 304        switch(c) {
 305        case '?':
 306        case 'h':
 307            help();
 308            break;
 309        case 'F':
 310            base_fmt = optarg;
 311            break;
 312        case 'b':
 313            base_filename = optarg;
 314            break;
 315        case 'f':
 316            fmt = optarg;
 317            break;
 318        case 'e':
 319            error_report("option -e is deprecated, please use \'-o "
 320                  "encryption\' instead!");
 321            return 1;
 322        case '6':
 323            error_report("option -6 is deprecated, please use \'-o "
 324                  "compat6\' instead!");
 325            return 1;
 326        case 'o':
 327            options = optarg;
 328            break;
 329        }
 330    }
 331
 332    /* Get the filename */
 333    if (optind >= argc) {
 334        help();
 335    }
 336    filename = argv[optind++];
 337
 338    /* Get image size, if specified */
 339    if (optind < argc) {
 340        int64_t sval;
 341        char *end;
 342        sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
 343        if (sval < 0 || *end) {
 344            error_report("Invalid image size specified! You may use k, M, G or "
 345                  "T suffixes for ");
 346            error_report("kilobytes, megabytes, gigabytes and terabytes.");
 347            ret = -1;
 348            goto out;
 349        }
 350        img_size = (uint64_t)sval;
 351    }
 352
 353    if (options && is_help_option(options)) {
 354        ret = print_block_option_help(filename, fmt);
 355        goto out;
 356    }
 357
 358    ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
 359                          options, img_size, BDRV_O_FLAGS);
 360out:
 361    if (ret) {
 362        return 1;
 363    }
 364    return 0;
 365}
 366
 367/*
 368 * Checks an image for consistency. Exit codes:
 369 *
 370 * 0 - Check completed, image is good
 371 * 1 - Check not completed because of internal errors
 372 * 2 - Check completed, image is corrupted
 373 * 3 - Check completed, image has leaked clusters, but is good otherwise
 374 */
 375static int img_check(int argc, char **argv)
 376{
 377    int c, ret;
 378    const char *filename, *fmt;
 379    BlockDriverState *bs;
 380    BdrvCheckResult result;
 381    int fix = 0;
 382    int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
 383
 384    fmt = NULL;
 385    for(;;) {
 386        c = getopt(argc, argv, "f:hr:");
 387        if (c == -1) {
 388            break;
 389        }
 390        switch(c) {
 391        case '?':
 392        case 'h':
 393            help();
 394            break;
 395        case 'f':
 396            fmt = optarg;
 397            break;
 398        case 'r':
 399            flags |= BDRV_O_RDWR;
 400
 401            if (!strcmp(optarg, "leaks")) {
 402                fix = BDRV_FIX_LEAKS;
 403            } else if (!strcmp(optarg, "all")) {
 404                fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
 405            } else {
 406                help();
 407            }
 408            break;
 409        }
 410    }
 411    if (optind >= argc) {
 412        help();
 413    }
 414    filename = argv[optind++];
 415
 416    bs = bdrv_new_open(filename, fmt, flags);
 417    if (!bs) {
 418        return 1;
 419    }
 420    ret = bdrv_check(bs, &result, fix);
 421
 422    if (ret == -ENOTSUP) {
 423        error_report("This image format does not support checks");
 424        bdrv_delete(bs);
 425        return 1;
 426    }
 427
 428    if (result.corruptions_fixed || result.leaks_fixed) {
 429        printf("The following inconsistencies were found and repaired:\n\n"
 430               "    %d leaked clusters\n"
 431               "    %d corruptions\n\n"
 432               "Double checking the fixed image now...\n",
 433               result.leaks_fixed,
 434               result.corruptions_fixed);
 435        ret = bdrv_check(bs, &result, 0);
 436    }
 437
 438    if (!(result.corruptions || result.leaks || result.check_errors)) {
 439        printf("No errors were found on the image.\n");
 440    } else {
 441        if (result.corruptions) {
 442            printf("\n%d errors were found on the image.\n"
 443                "Data may be corrupted, or further writes to the image "
 444                "may corrupt it.\n",
 445                result.corruptions);
 446        }
 447
 448        if (result.leaks) {
 449            printf("\n%d leaked clusters were found on the image.\n"
 450                "This means waste of disk space, but no harm to data.\n",
 451                result.leaks);
 452        }
 453
 454        if (result.check_errors) {
 455            printf("\n%d internal errors have occurred during the check.\n",
 456                result.check_errors);
 457        }
 458    }
 459
 460    if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
 461        printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
 462        result.bfi.allocated_clusters, result.bfi.total_clusters,
 463        result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
 464        result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
 465    }
 466
 467    bdrv_delete(bs);
 468
 469    if (ret < 0 || result.check_errors) {
 470        printf("\nAn error has occurred during the check: %s\n"
 471            "The check is not complete and may have missed error.\n",
 472            strerror(-ret));
 473        return 1;
 474    }
 475
 476    if (result.corruptions) {
 477        return 2;
 478    } else if (result.leaks) {
 479        return 3;
 480    } else {
 481        return 0;
 482    }
 483}
 484
 485static int img_commit(int argc, char **argv)
 486{
 487    int c, ret, flags;
 488    const char *filename, *fmt, *cache;
 489    BlockDriverState *bs;
 490
 491    fmt = NULL;
 492    cache = BDRV_DEFAULT_CACHE;
 493    for(;;) {
 494        c = getopt(argc, argv, "f:ht:");
 495        if (c == -1) {
 496            break;
 497        }
 498        switch(c) {
 499        case '?':
 500        case 'h':
 501            help();
 502            break;
 503        case 'f':
 504            fmt = optarg;
 505            break;
 506        case 't':
 507            cache = optarg;
 508            break;
 509        }
 510    }
 511    if (optind >= argc) {
 512        help();
 513    }
 514    filename = argv[optind++];
 515
 516    flags = BDRV_O_RDWR;
 517    ret = bdrv_parse_cache_flags(cache, &flags);
 518    if (ret < 0) {
 519        error_report("Invalid cache option: %s", cache);
 520        return -1;
 521    }
 522
 523    bs = bdrv_new_open(filename, fmt, flags);
 524    if (!bs) {
 525        return 1;
 526    }
 527    ret = bdrv_commit(bs);
 528    switch(ret) {
 529    case 0:
 530        printf("Image committed.\n");
 531        break;
 532    case -ENOENT:
 533        error_report("No disk inserted");
 534        break;
 535    case -EACCES:
 536        error_report("Image is read-only");
 537        break;
 538    case -ENOTSUP:
 539        error_report("Image is already committed");
 540        break;
 541    default:
 542        error_report("Error while committing image");
 543        break;
 544    }
 545
 546    bdrv_delete(bs);
 547    if (ret) {
 548        return 1;
 549    }
 550    return 0;
 551}
 552
 553/*
 554 * Returns true iff the first sector pointed to by 'buf' contains at least
 555 * a non-NUL byte.
 556 *
 557 * 'pnum' is set to the number of sectors (including and immediately following
 558 * the first one) that are known to be in the same allocated/unallocated state.
 559 */
 560static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
 561{
 562    bool is_zero;
 563    int i;
 564
 565    if (n <= 0) {
 566        *pnum = 0;
 567        return 0;
 568    }
 569    is_zero = buffer_is_zero(buf, 512);
 570    for(i = 1; i < n; i++) {
 571        buf += 512;
 572        if (is_zero != buffer_is_zero(buf, 512)) {
 573            break;
 574        }
 575    }
 576    *pnum = i;
 577    return !is_zero;
 578}
 579
 580/*
 581 * Like is_allocated_sectors, but if the buffer starts with a used sector,
 582 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
 583 * breaking up write requests for only small sparse areas.
 584 */
 585static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
 586    int min)
 587{
 588    int ret;
 589    int num_checked, num_used;
 590
 591    if (n < min) {
 592        min = n;
 593    }
 594
 595    ret = is_allocated_sectors(buf, n, pnum);
 596    if (!ret) {
 597        return ret;
 598    }
 599
 600    num_used = *pnum;
 601    buf += BDRV_SECTOR_SIZE * *pnum;
 602    n -= *pnum;
 603    num_checked = num_used;
 604
 605    while (n > 0) {
 606        ret = is_allocated_sectors(buf, n, pnum);
 607
 608        buf += BDRV_SECTOR_SIZE * *pnum;
 609        n -= *pnum;
 610        num_checked += *pnum;
 611        if (ret) {
 612            num_used = num_checked;
 613        } else if (*pnum >= min) {
 614            break;
 615        }
 616    }
 617
 618    *pnum = num_used;
 619    return 1;
 620}
 621
 622/*
 623 * Compares two buffers sector by sector. Returns 0 if the first sector of both
 624 * buffers matches, non-zero otherwise.
 625 *
 626 * pnum is set to the number of sectors (including and immediately following
 627 * the first one) that are known to have the same comparison result
 628 */
 629static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
 630    int *pnum)
 631{
 632    int res, i;
 633
 634    if (n <= 0) {
 635        *pnum = 0;
 636        return 0;
 637    }
 638
 639    res = !!memcmp(buf1, buf2, 512);
 640    for(i = 1; i < n; i++) {
 641        buf1 += 512;
 642        buf2 += 512;
 643
 644        if (!!memcmp(buf1, buf2, 512) != res) {
 645            break;
 646        }
 647    }
 648
 649    *pnum = i;
 650    return res;
 651}
 652
 653#define IO_BUF_SIZE (2 * 1024 * 1024)
 654
 655static int img_convert(int argc, char **argv)
 656{
 657    int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
 658    int progress = 0, flags;
 659    const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
 660    BlockDriver *drv, *proto_drv;
 661    BlockDriverState **bs = NULL, *out_bs = NULL;
 662    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
 663    uint64_t bs_sectors;
 664    uint8_t * buf = NULL;
 665    const uint8_t *buf1;
 666    BlockDriverInfo bdi;
 667    QEMUOptionParameter *param = NULL, *create_options = NULL;
 668    QEMUOptionParameter *out_baseimg_param;
 669    char *options = NULL;
 670    const char *snapshot_name = NULL;
 671    float local_progress;
 672    int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
 673
 674    fmt = NULL;
 675    out_fmt = "raw";
 676    cache = "unsafe";
 677    out_baseimg = NULL;
 678    compress = 0;
 679    for(;;) {
 680        c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
 681        if (c == -1) {
 682            break;
 683        }
 684        switch(c) {
 685        case '?':
 686        case 'h':
 687            help();
 688            break;
 689        case 'f':
 690            fmt = optarg;
 691            break;
 692        case 'O':
 693            out_fmt = optarg;
 694            break;
 695        case 'B':
 696            out_baseimg = optarg;
 697            break;
 698        case 'c':
 699            compress = 1;
 700            break;
 701        case 'e':
 702            error_report("option -e is deprecated, please use \'-o "
 703                  "encryption\' instead!");
 704            return 1;
 705        case '6':
 706            error_report("option -6 is deprecated, please use \'-o "
 707                  "compat6\' instead!");
 708            return 1;
 709        case 'o':
 710            options = optarg;
 711            break;
 712        case 's':
 713            snapshot_name = optarg;
 714            break;
 715        case 'S':
 716        {
 717            int64_t sval;
 718            char *end;
 719            sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
 720            if (sval < 0 || *end) {
 721                error_report("Invalid minimum zero buffer size for sparse output specified");
 722                return 1;
 723            }
 724
 725            min_sparse = sval / BDRV_SECTOR_SIZE;
 726            break;
 727        }
 728        case 'p':
 729            progress = 1;
 730            break;
 731        case 't':
 732            cache = optarg;
 733            break;
 734        }
 735    }
 736
 737    bs_n = argc - optind - 1;
 738    if (bs_n < 1) {
 739        help();
 740    }
 741
 742    out_filename = argv[argc - 1];
 743
 744    /* Initialize before goto out */
 745    qemu_progress_init(progress, 2.0);
 746
 747    if (options && is_help_option(options)) {
 748        ret = print_block_option_help(out_filename, out_fmt);
 749        goto out;
 750    }
 751
 752    if (bs_n > 1 && out_baseimg) {
 753        error_report("-B makes no sense when concatenating multiple input "
 754                     "images");
 755        ret = -1;
 756        goto out;
 757    }
 758
 759    qemu_progress_print(0, 100);
 760
 761    bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
 762
 763    total_sectors = 0;
 764    for (bs_i = 0; bs_i < bs_n; bs_i++) {
 765        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
 766        if (!bs[bs_i]) {
 767            error_report("Could not open '%s'", argv[optind + bs_i]);
 768            ret = -1;
 769            goto out;
 770        }
 771        bdrv_get_geometry(bs[bs_i], &bs_sectors);
 772        total_sectors += bs_sectors;
 773    }
 774
 775    if (snapshot_name != NULL) {
 776        if (bs_n > 1) {
 777            error_report("No support for concatenating multiple snapshot");
 778            ret = -1;
 779            goto out;
 780        }
 781        if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
 782            error_report("Failed to load snapshot");
 783            ret = -1;
 784            goto out;
 785        }
 786    }
 787
 788    /* Find driver and parse its options */
 789    drv = bdrv_find_format(out_fmt);
 790    if (!drv) {
 791        error_report("Unknown file format '%s'", out_fmt);
 792        ret = -1;
 793        goto out;
 794    }
 795
 796    proto_drv = bdrv_find_protocol(out_filename);
 797    if (!proto_drv) {
 798        error_report("Unknown protocol '%s'", out_filename);
 799        ret = -1;
 800        goto out;
 801    }
 802
 803    create_options = append_option_parameters(create_options,
 804                                              drv->create_options);
 805    create_options = append_option_parameters(create_options,
 806                                              proto_drv->create_options);
 807
 808    if (options) {
 809        param = parse_option_parameters(options, create_options, param);
 810        if (param == NULL) {
 811            error_report("Invalid options for file format '%s'.", out_fmt);
 812            ret = -1;
 813            goto out;
 814        }
 815    } else {
 816        param = parse_option_parameters("", create_options, param);
 817    }
 818
 819    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
 820    ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
 821    if (ret < 0) {
 822        goto out;
 823    }
 824
 825    /* Get backing file name if -o backing_file was used */
 826    out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
 827    if (out_baseimg_param) {
 828        out_baseimg = out_baseimg_param->value.s;
 829    }
 830
 831    /* Check if compression is supported */
 832    if (compress) {
 833        QEMUOptionParameter *encryption =
 834            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
 835        QEMUOptionParameter *preallocation =
 836            get_option_parameter(param, BLOCK_OPT_PREALLOC);
 837
 838        if (!drv->bdrv_write_compressed) {
 839            error_report("Compression not supported for this file format");
 840            ret = -1;
 841            goto out;
 842        }
 843
 844        if (encryption && encryption->value.n) {
 845            error_report("Compression and encryption not supported at "
 846                         "the same time");
 847            ret = -1;
 848            goto out;
 849        }
 850
 851        if (preallocation && preallocation->value.s
 852            && strcmp(preallocation->value.s, "off"))
 853        {
 854            error_report("Compression and preallocation not supported at "
 855                         "the same time");
 856            ret = -1;
 857            goto out;
 858        }
 859    }
 860
 861    /* Create the new image */
 862    ret = bdrv_create(drv, out_filename, param);
 863    if (ret < 0) {
 864        if (ret == -ENOTSUP) {
 865            error_report("Formatting not supported for file format '%s'",
 866                         out_fmt);
 867        } else if (ret == -EFBIG) {
 868            error_report("The image size is too large for file format '%s'",
 869                         out_fmt);
 870        } else {
 871            error_report("%s: error while converting %s: %s",
 872                         out_filename, out_fmt, strerror(-ret));
 873        }
 874        goto out;
 875    }
 876
 877    flags = BDRV_O_RDWR;
 878    ret = bdrv_parse_cache_flags(cache, &flags);
 879    if (ret < 0) {
 880        error_report("Invalid cache option: %s", cache);
 881        return -1;
 882    }
 883
 884    out_bs = bdrv_new_open(out_filename, out_fmt, flags);
 885    if (!out_bs) {
 886        ret = -1;
 887        goto out;
 888    }
 889
 890    bs_i = 0;
 891    bs_offset = 0;
 892    bdrv_get_geometry(bs[0], &bs_sectors);
 893    buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
 894
 895    if (compress) {
 896        ret = bdrv_get_info(out_bs, &bdi);
 897        if (ret < 0) {
 898            error_report("could not get block driver info");
 899            goto out;
 900        }
 901        cluster_size = bdi.cluster_size;
 902        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
 903            error_report("invalid cluster size");
 904            ret = -1;
 905            goto out;
 906        }
 907        cluster_sectors = cluster_size >> 9;
 908        sector_num = 0;
 909
 910        nb_sectors = total_sectors;
 911        local_progress = (float)100 /
 912            (nb_sectors / MIN(nb_sectors, cluster_sectors));
 913
 914        for(;;) {
 915            int64_t bs_num;
 916            int remainder;
 917            uint8_t *buf2;
 918
 919            nb_sectors = total_sectors - sector_num;
 920            if (nb_sectors <= 0)
 921                break;
 922            if (nb_sectors >= cluster_sectors)
 923                n = cluster_sectors;
 924            else
 925                n = nb_sectors;
 926
 927            bs_num = sector_num - bs_offset;
 928            assert (bs_num >= 0);
 929            remainder = n;
 930            buf2 = buf;
 931            while (remainder > 0) {
 932                int nlow;
 933                while (bs_num == bs_sectors) {
 934                    bs_i++;
 935                    assert (bs_i < bs_n);
 936                    bs_offset += bs_sectors;
 937                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
 938                    bs_num = 0;
 939                    /* printf("changing part: sector_num=%" PRId64 ", "
 940                       "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
 941                       "\n", sector_num, bs_i, bs_offset, bs_sectors); */
 942                }
 943                assert (bs_num < bs_sectors);
 944
 945                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
 946
 947                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
 948                if (ret < 0) {
 949                    error_report("error while reading sector %" PRId64 ": %s",
 950                                 bs_num, strerror(-ret));
 951                    goto out;
 952                }
 953
 954                buf2 += nlow * 512;
 955                bs_num += nlow;
 956
 957                remainder -= nlow;
 958            }
 959            assert (remainder == 0);
 960
 961            if (n < cluster_sectors) {
 962                memset(buf + n * 512, 0, cluster_size - n * 512);
 963            }
 964            if (!buffer_is_zero(buf, cluster_size)) {
 965                ret = bdrv_write_compressed(out_bs, sector_num, buf,
 966                                            cluster_sectors);
 967                if (ret != 0) {
 968                    error_report("error while compressing sector %" PRId64
 969                                 ": %s", sector_num, strerror(-ret));
 970                    goto out;
 971                }
 972            }
 973            sector_num += n;
 974            qemu_progress_print(local_progress, 100);
 975        }
 976        /* signal EOF to align */
 977        bdrv_write_compressed(out_bs, 0, NULL, 0);
 978    } else {
 979        int has_zero_init = bdrv_has_zero_init(out_bs);
 980
 981        sector_num = 0; // total number of sectors converted so far
 982        nb_sectors = total_sectors - sector_num;
 983        local_progress = (float)100 /
 984            (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
 985
 986        for(;;) {
 987            nb_sectors = total_sectors - sector_num;
 988            if (nb_sectors <= 0) {
 989                break;
 990            }
 991            if (nb_sectors >= (IO_BUF_SIZE / 512)) {
 992                n = (IO_BUF_SIZE / 512);
 993            } else {
 994                n = nb_sectors;
 995            }
 996
 997            while (sector_num - bs_offset >= bs_sectors) {
 998                bs_i ++;
 999                assert (bs_i < bs_n);
1000                bs_offset += bs_sectors;
1001                bdrv_get_geometry(bs[bs_i], &bs_sectors);
1002                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1003                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
1004                   sector_num, bs_i, bs_offset, bs_sectors); */
1005            }
1006
1007            if (n > bs_offset + bs_sectors - sector_num) {
1008                n = bs_offset + bs_sectors - sector_num;
1009            }
1010
1011            if (has_zero_init) {
1012                /* If the output image is being created as a copy on write image,
1013                   assume that sectors which are unallocated in the input image
1014                   are present in both the output's and input's base images (no
1015                   need to copy them). */
1016                if (out_baseimg) {
1017                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1018                                           n, &n1)) {
1019                        sector_num += n1;
1020                        continue;
1021                    }
1022                    /* The next 'n1' sectors are allocated in the input image. Copy
1023                       only those as they may be followed by unallocated sectors. */
1024                    n = n1;
1025                }
1026            } else {
1027                n1 = n;
1028            }
1029
1030            ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1031            if (ret < 0) {
1032                error_report("error while reading sector %" PRId64 ": %s",
1033                             sector_num - bs_offset, strerror(-ret));
1034                goto out;
1035            }
1036            /* NOTE: at the same time we convert, we do not write zero
1037               sectors to have a chance to compress the image. Ideally, we
1038               should add a specific call to have the info to go faster */
1039            buf1 = buf;
1040            while (n > 0) {
1041                /* If the output image is being created as a copy on write image,
1042                   copy all sectors even the ones containing only NUL bytes,
1043                   because they may differ from the sectors in the base image.
1044
1045                   If the output is to a host device, we also write out
1046                   sectors that are entirely 0, since whatever data was
1047                   already there is garbage, not 0s. */
1048                if (!has_zero_init || out_baseimg ||
1049                    is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1050                    ret = bdrv_write(out_bs, sector_num, buf1, n1);
1051                    if (ret < 0) {
1052                        error_report("error while writing sector %" PRId64
1053                                     ": %s", sector_num, strerror(-ret));
1054                        goto out;
1055                    }
1056                }
1057                sector_num += n1;
1058                n -= n1;
1059                buf1 += n1 * 512;
1060            }
1061            qemu_progress_print(local_progress, 100);
1062        }
1063    }
1064out:
1065    qemu_progress_end();
1066    free_option_parameters(create_options);
1067    free_option_parameters(param);
1068    qemu_vfree(buf);
1069    if (out_bs) {
1070        bdrv_delete(out_bs);
1071    }
1072    if (bs) {
1073        for (bs_i = 0; bs_i < bs_n; bs_i++) {
1074            if (bs[bs_i]) {
1075                bdrv_delete(bs[bs_i]);
1076            }
1077        }
1078        g_free(bs);
1079    }
1080    if (ret) {
1081        return 1;
1082    }
1083    return 0;
1084}
1085
1086
1087static void dump_snapshots(BlockDriverState *bs)
1088{
1089    QEMUSnapshotInfo *sn_tab, *sn;
1090    int nb_sns, i;
1091    char buf[256];
1092
1093    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1094    if (nb_sns <= 0)
1095        return;
1096    printf("Snapshot list:\n");
1097    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1098    for(i = 0; i < nb_sns; i++) {
1099        sn = &sn_tab[i];
1100        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1101    }
1102    g_free(sn_tab);
1103}
1104
1105static int img_info(int argc, char **argv)
1106{
1107    int c;
1108    const char *filename, *fmt;
1109    BlockDriverState *bs;
1110    char size_buf[128], dsize_buf[128];
1111    uint64_t total_sectors;
1112    int64_t allocated_size;
1113    char backing_filename[1024];
1114    char backing_filename2[1024];
1115    BlockDriverInfo bdi;
1116
1117    fmt = NULL;
1118    for(;;) {
1119        c = getopt(argc, argv, "f:h");
1120        if (c == -1) {
1121            break;
1122        }
1123        switch(c) {
1124        case '?':
1125        case 'h':
1126            help();
1127            break;
1128        case 'f':
1129            fmt = optarg;
1130            break;
1131        }
1132    }
1133    if (optind >= argc) {
1134        help();
1135    }
1136    filename = argv[optind++];
1137
1138    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1139    if (!bs) {
1140        return 1;
1141    }
1142    bdrv_get_geometry(bs, &total_sectors);
1143    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1144    allocated_size = bdrv_get_allocated_file_size(bs);
1145    if (allocated_size < 0) {
1146        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1147    } else {
1148        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1149                                allocated_size);
1150    }
1151    printf("image: %s\n"
1152           "file format: %s\n"
1153           "virtual size: %s (%" PRId64 " bytes)\n"
1154           "disk size: %s\n",
1155           filename, bdrv_get_format_name(bs), size_buf,
1156           (total_sectors * 512),
1157           dsize_buf);
1158    if (bdrv_is_encrypted(bs)) {
1159        printf("encrypted: yes\n");
1160    }
1161    if (bdrv_get_info(bs, &bdi) >= 0) {
1162        if (bdi.cluster_size != 0) {
1163            printf("cluster_size: %d\n", bdi.cluster_size);
1164        }
1165        if (bdi.is_dirty) {
1166            printf("cleanly shut down: no\n");
1167        }
1168    }
1169    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1170    if (backing_filename[0] != '\0') {
1171        bdrv_get_full_backing_filename(bs, backing_filename2,
1172                                       sizeof(backing_filename2));
1173        printf("backing file: %s", backing_filename);
1174        if (strcmp(backing_filename, backing_filename2) != 0) {
1175            printf(" (actual path: %s)", backing_filename2);
1176        }
1177        putchar('\n');
1178    }
1179    dump_snapshots(bs);
1180    bdrv_delete(bs);
1181    return 0;
1182}
1183
1184#define SNAPSHOT_LIST   1
1185#define SNAPSHOT_CREATE 2
1186#define SNAPSHOT_APPLY  3
1187#define SNAPSHOT_DELETE 4
1188
1189static int img_snapshot(int argc, char **argv)
1190{
1191    BlockDriverState *bs;
1192    QEMUSnapshotInfo sn;
1193    char *filename, *snapshot_name = NULL;
1194    int c, ret = 0, bdrv_oflags;
1195    int action = 0;
1196    qemu_timeval tv;
1197
1198    bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1199    /* Parse commandline parameters */
1200    for(;;) {
1201        c = getopt(argc, argv, "la:c:d:h");
1202        if (c == -1) {
1203            break;
1204        }
1205        switch(c) {
1206        case '?':
1207        case 'h':
1208            help();
1209            return 0;
1210        case 'l':
1211            if (action) {
1212                help();
1213                return 0;
1214            }
1215            action = SNAPSHOT_LIST;
1216            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1217            break;
1218        case 'a':
1219            if (action) {
1220                help();
1221                return 0;
1222            }
1223            action = SNAPSHOT_APPLY;
1224            snapshot_name = optarg;
1225            break;
1226        case 'c':
1227            if (action) {
1228                help();
1229                return 0;
1230            }
1231            action = SNAPSHOT_CREATE;
1232            snapshot_name = optarg;
1233            break;
1234        case 'd':
1235            if (action) {
1236                help();
1237                return 0;
1238            }
1239            action = SNAPSHOT_DELETE;
1240            snapshot_name = optarg;
1241            break;
1242        }
1243    }
1244
1245    if (optind >= argc) {
1246        help();
1247    }
1248    filename = argv[optind++];
1249
1250    /* Open the image */
1251    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1252    if (!bs) {
1253        return 1;
1254    }
1255
1256    /* Perform the requested action */
1257    switch(action) {
1258    case SNAPSHOT_LIST:
1259        dump_snapshots(bs);
1260        break;
1261
1262    case SNAPSHOT_CREATE:
1263        memset(&sn, 0, sizeof(sn));
1264        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1265
1266        qemu_gettimeofday(&tv);
1267        sn.date_sec = tv.tv_sec;
1268        sn.date_nsec = tv.tv_usec * 1000;
1269
1270        ret = bdrv_snapshot_create(bs, &sn);
1271        if (ret) {
1272            error_report("Could not create snapshot '%s': %d (%s)",
1273                snapshot_name, ret, strerror(-ret));
1274        }
1275        break;
1276
1277    case SNAPSHOT_APPLY:
1278        ret = bdrv_snapshot_goto(bs, snapshot_name);
1279        if (ret) {
1280            error_report("Could not apply snapshot '%s': %d (%s)",
1281                snapshot_name, ret, strerror(-ret));
1282        }
1283        break;
1284
1285    case SNAPSHOT_DELETE:
1286        ret = bdrv_snapshot_delete(bs, snapshot_name);
1287        if (ret) {
1288            error_report("Could not delete snapshot '%s': %d (%s)",
1289                snapshot_name, ret, strerror(-ret));
1290        }
1291        break;
1292    }
1293
1294    /* Cleanup */
1295    bdrv_delete(bs);
1296    if (ret) {
1297        return 1;
1298    }
1299    return 0;
1300}
1301
1302static int img_rebase(int argc, char **argv)
1303{
1304    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1305    BlockDriver *old_backing_drv, *new_backing_drv;
1306    char *filename;
1307    const char *fmt, *cache, *out_basefmt, *out_baseimg;
1308    int c, flags, ret;
1309    int unsafe = 0;
1310    int progress = 0;
1311
1312    /* Parse commandline parameters */
1313    fmt = NULL;
1314    cache = BDRV_DEFAULT_CACHE;
1315    out_baseimg = NULL;
1316    out_basefmt = NULL;
1317    for(;;) {
1318        c = getopt(argc, argv, "uhf:F:b:pt:");
1319        if (c == -1) {
1320            break;
1321        }
1322        switch(c) {
1323        case '?':
1324        case 'h':
1325            help();
1326            return 0;
1327        case 'f':
1328            fmt = optarg;
1329            break;
1330        case 'F':
1331            out_basefmt = optarg;
1332            break;
1333        case 'b':
1334            out_baseimg = optarg;
1335            break;
1336        case 'u':
1337            unsafe = 1;
1338            break;
1339        case 'p':
1340            progress = 1;
1341            break;
1342        case 't':
1343            cache = optarg;
1344            break;
1345        }
1346    }
1347
1348    if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1349        help();
1350    }
1351    filename = argv[optind++];
1352
1353    qemu_progress_init(progress, 2.0);
1354    qemu_progress_print(0, 100);
1355
1356    flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1357    ret = bdrv_parse_cache_flags(cache, &flags);
1358    if (ret < 0) {
1359        error_report("Invalid cache option: %s", cache);
1360        return -1;
1361    }
1362
1363    /*
1364     * Open the images.
1365     *
1366     * Ignore the old backing file for unsafe rebase in case we want to correct
1367     * the reference to a renamed or moved backing file.
1368     */
1369    bs = bdrv_new_open(filename, fmt, flags);
1370    if (!bs) {
1371        return 1;
1372    }
1373
1374    /* Find the right drivers for the backing files */
1375    old_backing_drv = NULL;
1376    new_backing_drv = NULL;
1377
1378    if (!unsafe && bs->backing_format[0] != '\0') {
1379        old_backing_drv = bdrv_find_format(bs->backing_format);
1380        if (old_backing_drv == NULL) {
1381            error_report("Invalid format name: '%s'", bs->backing_format);
1382            ret = -1;
1383            goto out;
1384        }
1385    }
1386
1387    if (out_basefmt != NULL) {
1388        new_backing_drv = bdrv_find_format(out_basefmt);
1389        if (new_backing_drv == NULL) {
1390            error_report("Invalid format name: '%s'", out_basefmt);
1391            ret = -1;
1392            goto out;
1393        }
1394    }
1395
1396    /* For safe rebasing we need to compare old and new backing file */
1397    if (unsafe) {
1398        /* Make the compiler happy */
1399        bs_old_backing = NULL;
1400        bs_new_backing = NULL;
1401    } else {
1402        char backing_name[1024];
1403
1404        bs_old_backing = bdrv_new("old_backing");
1405        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1406        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1407                        old_backing_drv);
1408        if (ret) {
1409            error_report("Could not open old backing file '%s'", backing_name);
1410            goto out;
1411        }
1412
1413        bs_new_backing = bdrv_new("new_backing");
1414        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1415                        new_backing_drv);
1416        if (ret) {
1417            error_report("Could not open new backing file '%s'", out_baseimg);
1418            goto out;
1419        }
1420    }
1421
1422    /*
1423     * Check each unallocated cluster in the COW file. If it is unallocated,
1424     * accesses go to the backing file. We must therefore compare this cluster
1425     * in the old and new backing file, and if they differ we need to copy it
1426     * from the old backing file into the COW file.
1427     *
1428     * If qemu-img crashes during this step, no harm is done. The content of
1429     * the image is the same as the original one at any time.
1430     */
1431    if (!unsafe) {
1432        uint64_t num_sectors;
1433        uint64_t old_backing_num_sectors;
1434        uint64_t new_backing_num_sectors;
1435        uint64_t sector;
1436        int n;
1437        uint8_t * buf_old;
1438        uint8_t * buf_new;
1439        float local_progress;
1440
1441        buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1442        buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1443
1444        bdrv_get_geometry(bs, &num_sectors);
1445        bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1446        bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1447
1448        local_progress = (float)100 /
1449            (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1450        for (sector = 0; sector < num_sectors; sector += n) {
1451
1452            /* How many sectors can we handle with the next read? */
1453            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1454                n = (IO_BUF_SIZE / 512);
1455            } else {
1456                n = num_sectors - sector;
1457            }
1458
1459            /* If the cluster is allocated, we don't need to take action */
1460            ret = bdrv_is_allocated(bs, sector, n, &n);
1461            if (ret) {
1462                continue;
1463            }
1464
1465            /*
1466             * Read old and new backing file and take into consideration that
1467             * backing files may be smaller than the COW image.
1468             */
1469            if (sector >= old_backing_num_sectors) {
1470                memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1471            } else {
1472                if (sector + n > old_backing_num_sectors) {
1473                    n = old_backing_num_sectors - sector;
1474                }
1475
1476                ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1477                if (ret < 0) {
1478                    error_report("error while reading from old backing file");
1479                    goto out;
1480                }
1481            }
1482
1483            if (sector >= new_backing_num_sectors) {
1484                memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1485            } else {
1486                if (sector + n > new_backing_num_sectors) {
1487                    n = new_backing_num_sectors - sector;
1488                }
1489
1490                ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1491                if (ret < 0) {
1492                    error_report("error while reading from new backing file");
1493                    goto out;
1494                }
1495            }
1496
1497            /* If they differ, we need to write to the COW file */
1498            uint64_t written = 0;
1499
1500            while (written < n) {
1501                int pnum;
1502
1503                if (compare_sectors(buf_old + written * 512,
1504                    buf_new + written * 512, n - written, &pnum))
1505                {
1506                    ret = bdrv_write(bs, sector + written,
1507                        buf_old + written * 512, pnum);
1508                    if (ret < 0) {
1509                        error_report("Error while writing to COW image: %s",
1510                            strerror(-ret));
1511                        goto out;
1512                    }
1513                }
1514
1515                written += pnum;
1516            }
1517            qemu_progress_print(local_progress, 100);
1518        }
1519
1520        qemu_vfree(buf_old);
1521        qemu_vfree(buf_new);
1522    }
1523
1524    /*
1525     * Change the backing file. All clusters that are different from the old
1526     * backing file are overwritten in the COW file now, so the visible content
1527     * doesn't change when we switch the backing file.
1528     */
1529    ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1530    if (ret == -ENOSPC) {
1531        error_report("Could not change the backing file to '%s': No "
1532                     "space left in the file header", out_baseimg);
1533    } else if (ret < 0) {
1534        error_report("Could not change the backing file to '%s': %s",
1535            out_baseimg, strerror(-ret));
1536    }
1537
1538    qemu_progress_print(100, 0);
1539    /*
1540     * TODO At this point it is possible to check if any clusters that are
1541     * allocated in the COW file are the same in the backing file. If so, they
1542     * could be dropped from the COW file. Don't do this before switching the
1543     * backing file, in case of a crash this would lead to corruption.
1544     */
1545out:
1546    qemu_progress_end();
1547    /* Cleanup */
1548    if (!unsafe) {
1549        if (bs_old_backing != NULL) {
1550            bdrv_delete(bs_old_backing);
1551        }
1552        if (bs_new_backing != NULL) {
1553            bdrv_delete(bs_new_backing);
1554        }
1555    }
1556
1557    bdrv_delete(bs);
1558    if (ret) {
1559        return 1;
1560    }
1561    return 0;
1562}
1563
1564static int img_resize(int argc, char **argv)
1565{
1566    int c, ret, relative;
1567    const char *filename, *fmt, *size;
1568    int64_t n, total_size;
1569    BlockDriverState *bs = NULL;
1570    QemuOpts *param;
1571    static QemuOptsList resize_options = {
1572        .name = "resize_options",
1573        .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1574        .desc = {
1575            {
1576                .name = BLOCK_OPT_SIZE,
1577                .type = QEMU_OPT_SIZE,
1578                .help = "Virtual disk size"
1579            }, {
1580                /* end of list */
1581            }
1582        },
1583    };
1584
1585    /* Remove size from argv manually so that negative numbers are not treated
1586     * as options by getopt. */
1587    if (argc < 3) {
1588        help();
1589        return 1;
1590    }
1591
1592    size = argv[--argc];
1593
1594    /* Parse getopt arguments */
1595    fmt = NULL;
1596    for(;;) {
1597        c = getopt(argc, argv, "f:h");
1598        if (c == -1) {
1599            break;
1600        }
1601        switch(c) {
1602        case '?':
1603        case 'h':
1604            help();
1605            break;
1606        case 'f':
1607            fmt = optarg;
1608            break;
1609        }
1610    }
1611    if (optind >= argc) {
1612        help();
1613    }
1614    filename = argv[optind++];
1615
1616    /* Choose grow, shrink, or absolute resize mode */
1617    switch (size[0]) {
1618    case '+':
1619        relative = 1;
1620        size++;
1621        break;
1622    case '-':
1623        relative = -1;
1624        size++;
1625        break;
1626    default:
1627        relative = 0;
1628        break;
1629    }
1630
1631    /* Parse size */
1632    param = qemu_opts_create(&resize_options, NULL, 0, NULL);
1633    if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
1634        /* Error message already printed when size parsing fails */
1635        ret = -1;
1636        qemu_opts_del(param);
1637        goto out;
1638    }
1639    n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1640    qemu_opts_del(param);
1641
1642    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1643    if (!bs) {
1644        ret = -1;
1645        goto out;
1646    }
1647
1648    if (relative) {
1649        total_size = bdrv_getlength(bs) + n * relative;
1650    } else {
1651        total_size = n;
1652    }
1653    if (total_size <= 0) {
1654        error_report("New image size must be positive");
1655        ret = -1;
1656        goto out;
1657    }
1658
1659    ret = bdrv_truncate(bs, total_size);
1660    switch (ret) {
1661    case 0:
1662        printf("Image resized.\n");
1663        break;
1664    case -ENOTSUP:
1665        error_report("This image does not support resize");
1666        break;
1667    case -EACCES:
1668        error_report("Image is read-only");
1669        break;
1670    default:
1671        error_report("Error resizing image (%d)", -ret);
1672        break;
1673    }
1674out:
1675    if (bs) {
1676        bdrv_delete(bs);
1677    }
1678    if (ret) {
1679        return 1;
1680    }
1681    return 0;
1682}
1683
1684static const img_cmd_t img_cmds[] = {
1685#define DEF(option, callback, arg_string)        \
1686    { option, callback },
1687#include "qemu-img-cmds.h"
1688#undef DEF
1689#undef GEN_DOCS
1690    { NULL, NULL, },
1691};
1692
1693int main(int argc, char **argv)
1694{
1695    const img_cmd_t *cmd;
1696    const char *cmdname;
1697
1698    error_set_progname(argv[0]);
1699
1700    bdrv_init();
1701    if (argc < 2)
1702        help();
1703    cmdname = argv[1];
1704    argc--; argv++;
1705
1706    qemu_init_main_loop();
1707
1708    /* find the command */
1709    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1710        if (!strcmp(cmdname, cmd->name)) {
1711            return cmd->handler(argc, argv);
1712        }
1713    }
1714
1715    /* not found */
1716    help();
1717    return 0;
1718}
1719