Statistics
| Branch: | Revision:

root / qemu-img.c @ 20caf0f7

History | View | Annotate | Download (48.1 kB)

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

    
36
typedef 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

    
45
static void format_print(void *opaque, const char *name)
46
{
47
    printf(" %s", name);
48
}
49

    
50
/* Please keep in synch with qemu-img.texi */
51
static 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 */
109
static 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

    
130
static struct termios oldtty;
131

    
132
static void term_exit(void)
133
{
134
    tcsetattr (0, TCSANOW, &oldtty);
135
}
136

    
137
static 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

    
158
static 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

    
195
static 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

    
222
static 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;
261
fail:
262
    if (bs) {
263
        bdrv_delete(bs);
264
    }
265
    return NULL;
266
}
267

    
268
static 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

    
289
static 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);
360
out:
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
 */
375
static 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;
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

    
485
static 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
 */
560
static 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
 */
585
static 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
 */
629
static 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

    
655
static 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
    }
1064
out:
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

    
1087
static 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

    
1105
static 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

    
1189
static 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

    
1302
static 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
     */
1545
out:
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

    
1564
static 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
    }
1674
out:
1675
    if (bs) {
1676
        bdrv_delete(bs);
1677
    }
1678
    if (ret) {
1679
        return 1;
1680
    }
1681
    return 0;
1682
}
1683

    
1684
static 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

    
1693
int 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
}