Statistics
| Branch: | Revision:

root / qemu-img.c @ 73f5e313

History | View | Annotate | Download (45.9 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), 'writethrough', 'directsync'\n"
70
           "    and 'unsafe'\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 snapshot subcommand:\n"
89
           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
90
           "  '-a' applies a snapshot (revert disk to saved state)\n"
91
           "  '-c' creates a snapshot\n"
92
           "  '-d' deletes a snapshot\n"
93
           "  '-l' lists all snapshots in the given image\n";
94

    
95
    printf("%s\nSupported formats:", help_msg);
96
    bdrv_iterate_format(format_print, NULL);
97
    printf("\n");
98
    exit(1);
99
}
100

    
101
#if defined(WIN32)
102
/* XXX: put correct support for win32 */
103
static int read_password(char *buf, int buf_size)
104
{
105
    int c, i;
106
    printf("Password: ");
107
    fflush(stdout);
108
    i = 0;
109
    for(;;) {
110
        c = getchar();
111
        if (c == '\n')
112
            break;
113
        if (i < (buf_size - 1))
114
            buf[i++] = c;
115
    }
116
    buf[i] = '\0';
117
    return 0;
118
}
119

    
120
#else
121

    
122
#include <termios.h>
123

    
124
static struct termios oldtty;
125

    
126
static void term_exit(void)
127
{
128
    tcsetattr (0, TCSANOW, &oldtty);
129
}
130

    
131
static void term_init(void)
132
{
133
    struct termios tty;
134

    
135
    tcgetattr (0, &tty);
136
    oldtty = tty;
137

    
138
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
139
                          |INLCR|IGNCR|ICRNL|IXON);
140
    tty.c_oflag |= OPOST;
141
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
142
    tty.c_cflag &= ~(CSIZE|PARENB);
143
    tty.c_cflag |= CS8;
144
    tty.c_cc[VMIN] = 1;
145
    tty.c_cc[VTIME] = 0;
146

    
147
    tcsetattr (0, TCSANOW, &tty);
148

    
149
    atexit(term_exit);
150
}
151

    
152
static int read_password(char *buf, int buf_size)
153
{
154
    uint8_t ch;
155
    int i, ret;
156

    
157
    printf("password: ");
158
    fflush(stdout);
159
    term_init();
160
    i = 0;
161
    for(;;) {
162
        ret = read(0, &ch, 1);
163
        if (ret == -1) {
164
            if (errno == EAGAIN || errno == EINTR) {
165
                continue;
166
            } else {
167
                ret = -1;
168
                break;
169
            }
170
        } else if (ret == 0) {
171
            ret = -1;
172
            break;
173
        } else {
174
            if (ch == '\r') {
175
                ret = 0;
176
                break;
177
            }
178
            if (i < (buf_size - 1))
179
                buf[i++] = ch;
180
        }
181
    }
182
    term_exit();
183
    buf[i] = '\0';
184
    printf("\n");
185
    return ret;
186
}
187
#endif
188

    
189
static int print_block_option_help(const char *filename, const char *fmt)
190
{
191
    BlockDriver *drv, *proto_drv;
192
    QEMUOptionParameter *create_options = NULL;
193

    
194
    /* Find driver and parse its options */
195
    drv = bdrv_find_format(fmt);
196
    if (!drv) {
197
        error_report("Unknown file format '%s'", fmt);
198
        return 1;
199
    }
200

    
201
    proto_drv = bdrv_find_protocol(filename);
202
    if (!proto_drv) {
203
        error_report("Unknown protocol '%s'", filename);
204
        return 1;
205
    }
206

    
207
    create_options = append_option_parameters(create_options,
208
                                              drv->create_options);
209
    create_options = append_option_parameters(create_options,
210
                                              proto_drv->create_options);
211
    print_option_help(create_options);
212
    free_option_parameters(create_options);
213
    return 0;
214
}
215

    
216
static BlockDriverState *bdrv_new_open(const char *filename,
217
                                       const char *fmt,
218
                                       int flags)
219
{
220
    BlockDriverState *bs;
221
    BlockDriver *drv;
222
    char password[256];
223
    int ret;
224

    
225
    bs = bdrv_new("image");
226

    
227
    if (fmt) {
228
        drv = bdrv_find_format(fmt);
229
        if (!drv) {
230
            error_report("Unknown file format '%s'", fmt);
231
            goto fail;
232
        }
233
    } else {
234
        drv = NULL;
235
    }
236

    
237
    ret = bdrv_open(bs, filename, flags, drv);
238
    if (ret < 0) {
239
        error_report("Could not open '%s': %s", filename, strerror(-ret));
240
        goto fail;
241
    }
242

    
243
    if (bdrv_is_encrypted(bs)) {
244
        printf("Disk image '%s' is encrypted.\n", filename);
245
        if (read_password(password, sizeof(password)) < 0) {
246
            error_report("No password given");
247
            goto fail;
248
        }
249
        if (bdrv_set_key(bs, password) < 0) {
250
            error_report("invalid password");
251
            goto fail;
252
        }
253
    }
254
    return bs;
255
fail:
256
    if (bs) {
257
        bdrv_delete(bs);
258
    }
259
    return NULL;
260
}
261

    
262
static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
263
                                 const char *base_filename,
264
                                 const char *base_fmt)
265
{
266
    if (base_filename) {
267
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
268
            error_report("Backing file not supported for file format '%s'",
269
                         fmt);
270
            return -1;
271
        }
272
    }
273
    if (base_fmt) {
274
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
275
            error_report("Backing file format not supported for file "
276
                         "format '%s'", fmt);
277
            return -1;
278
        }
279
    }
280
    return 0;
281
}
282

    
283
static int img_create(int argc, char **argv)
284
{
285
    int c, ret = 0;
286
    uint64_t img_size = -1;
287
    const char *fmt = "raw";
288
    const char *base_fmt = NULL;
289
    const char *filename;
290
    const char *base_filename = NULL;
291
    char *options = NULL;
292

    
293
    for(;;) {
294
        c = getopt(argc, argv, "F:b:f:he6o:");
295
        if (c == -1) {
296
            break;
297
        }
298
        switch(c) {
299
        case '?':
300
        case 'h':
301
            help();
302
            break;
303
        case 'F':
304
            base_fmt = optarg;
305
            break;
306
        case 'b':
307
            base_filename = optarg;
308
            break;
309
        case 'f':
310
            fmt = optarg;
311
            break;
312
        case 'e':
313
            error_report("option -e is deprecated, please use \'-o "
314
                  "encryption\' instead!");
315
            return 1;
316
        case '6':
317
            error_report("option -6 is deprecated, please use \'-o "
318
                  "compat6\' instead!");
319
            return 1;
320
        case 'o':
321
            options = optarg;
322
            break;
323
        }
324
    }
325

    
326
    /* Get the filename */
327
    if (optind >= argc) {
328
        help();
329
    }
330
    filename = argv[optind++];
331

    
332
    /* Get image size, if specified */
333
    if (optind < argc) {
334
        int64_t sval;
335
        char *end;
336
        sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
337
        if (sval < 0 || *end) {
338
            error_report("Invalid image size specified! You may use k, M, G or "
339
                  "T suffixes for ");
340
            error_report("kilobytes, megabytes, gigabytes and terabytes.");
341
            ret = -1;
342
            goto out;
343
        }
344
        img_size = (uint64_t)sval;
345
    }
346

    
347
    if (options && !strcmp(options, "?")) {
348
        ret = print_block_option_help(filename, fmt);
349
        goto out;
350
    }
351

    
352
    ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
353
                          options, img_size, BDRV_O_FLAGS);
354
out:
355
    if (ret) {
356
        return 1;
357
    }
358
    return 0;
359
}
360

    
361
/*
362
 * Checks an image for consistency. Exit codes:
363
 *
364
 * 0 - Check completed, image is good
365
 * 1 - Check not completed because of internal errors
366
 * 2 - Check completed, image is corrupted
367
 * 3 - Check completed, image has leaked clusters, but is good otherwise
368
 */
369
static int img_check(int argc, char **argv)
370
{
371
    int c, ret;
372
    const char *filename, *fmt;
373
    BlockDriverState *bs;
374
    BdrvCheckResult result;
375

    
376
    fmt = NULL;
377
    for(;;) {
378
        c = getopt(argc, argv, "f:h");
379
        if (c == -1) {
380
            break;
381
        }
382
        switch(c) {
383
        case '?':
384
        case 'h':
385
            help();
386
            break;
387
        case 'f':
388
            fmt = optarg;
389
            break;
390
        }
391
    }
392
    if (optind >= argc) {
393
        help();
394
    }
395
    filename = argv[optind++];
396

    
397
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
398
    if (!bs) {
399
        return 1;
400
    }
401
    ret = bdrv_check(bs, &result);
402

    
403
    if (ret == -ENOTSUP) {
404
        error_report("This image format does not support checks");
405
        bdrv_delete(bs);
406
        return 1;
407
    }
408

    
409
    if (!(result.corruptions || result.leaks || result.check_errors)) {
410
        printf("No errors were found on the image.\n");
411
    } else {
412
        if (result.corruptions) {
413
            printf("\n%d errors were found on the image.\n"
414
                "Data may be corrupted, or further writes to the image "
415
                "may corrupt it.\n",
416
                result.corruptions);
417
        }
418

    
419
        if (result.leaks) {
420
            printf("\n%d leaked clusters were found on the image.\n"
421
                "This means waste of disk space, but no harm to data.\n",
422
                result.leaks);
423
        }
424

    
425
        if (result.check_errors) {
426
            printf("\n%d internal errors have occurred during the check.\n",
427
                result.check_errors);
428
        }
429
    }
430

    
431
    bdrv_delete(bs);
432

    
433
    if (ret < 0 || result.check_errors) {
434
        printf("\nAn error has occurred during the check: %s\n"
435
            "The check is not complete and may have missed error.\n",
436
            strerror(-ret));
437
        return 1;
438
    }
439

    
440
    if (result.corruptions) {
441
        return 2;
442
    } else if (result.leaks) {
443
        return 3;
444
    } else {
445
        return 0;
446
    }
447
}
448

    
449
static int img_commit(int argc, char **argv)
450
{
451
    int c, ret, flags;
452
    const char *filename, *fmt, *cache;
453
    BlockDriverState *bs;
454

    
455
    fmt = NULL;
456
    cache = BDRV_DEFAULT_CACHE;
457
    for(;;) {
458
        c = getopt(argc, argv, "f:ht:");
459
        if (c == -1) {
460
            break;
461
        }
462
        switch(c) {
463
        case '?':
464
        case 'h':
465
            help();
466
            break;
467
        case 'f':
468
            fmt = optarg;
469
            break;
470
        case 't':
471
            cache = optarg;
472
            break;
473
        }
474
    }
475
    if (optind >= argc) {
476
        help();
477
    }
478
    filename = argv[optind++];
479

    
480
    flags = BDRV_O_RDWR;
481
    ret = bdrv_parse_cache_flags(cache, &flags);
482
    if (ret < 0) {
483
        error_report("Invalid cache option: %s", cache);
484
        return -1;
485
    }
486

    
487
    bs = bdrv_new_open(filename, fmt, flags);
488
    if (!bs) {
489
        return 1;
490
    }
491
    ret = bdrv_commit(bs);
492
    switch(ret) {
493
    case 0:
494
        printf("Image committed.\n");
495
        break;
496
    case -ENOENT:
497
        error_report("No disk inserted");
498
        break;
499
    case -EACCES:
500
        error_report("Image is read-only");
501
        break;
502
    case -ENOTSUP:
503
        error_report("Image is already committed");
504
        break;
505
    default:
506
        error_report("Error while committing image");
507
        break;
508
    }
509

    
510
    bdrv_delete(bs);
511
    if (ret) {
512
        return 1;
513
    }
514
    return 0;
515
}
516

    
517
/*
518
 * Checks whether the sector is not a zero sector.
519
 *
520
 * Attention! The len must be a multiple of 4 * sizeof(long) due to
521
 * restriction of optimizations in this function.
522
 */
523
static int is_not_zero(const uint8_t *sector, int len)
524
{
525
    /*
526
     * Use long as the biggest available internal data type that fits into the
527
     * CPU register and unroll the loop to smooth out the effect of memory
528
     * latency.
529
     */
530

    
531
    int i;
532
    long d0, d1, d2, d3;
533
    const long * const data = (const long *) sector;
534

    
535
    len /= sizeof(long);
536

    
537
    for(i = 0; i < len; i += 4) {
538
        d0 = data[i + 0];
539
        d1 = data[i + 1];
540
        d2 = data[i + 2];
541
        d3 = data[i + 3];
542

    
543
        if (d0 || d1 || d2 || d3) {
544
            return 1;
545
        }
546
    }
547

    
548
    return 0;
549
}
550

    
551
/*
552
 * Returns true iff the first sector pointed to by 'buf' contains at least
553
 * a non-NUL byte.
554
 *
555
 * 'pnum' is set to the number of sectors (including and immediately following
556
 * the first one) that are known to be in the same allocated/unallocated state.
557
 */
558
static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
559
{
560
    int v, i;
561

    
562
    if (n <= 0) {
563
        *pnum = 0;
564
        return 0;
565
    }
566
    v = is_not_zero(buf, 512);
567
    for(i = 1; i < n; i++) {
568
        buf += 512;
569
        if (v != is_not_zero(buf, 512))
570
            break;
571
    }
572
    *pnum = i;
573
    return v;
574
}
575

    
576
/*
577
 * Like is_allocated_sectors, but if the buffer starts with a used sector,
578
 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
579
 * breaking up write requests for only small sparse areas.
580
 */
581
static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
582
    int min)
583
{
584
    int ret;
585
    int num_checked, num_used;
586

    
587
    if (n < min) {
588
        min = n;
589
    }
590

    
591
    ret = is_allocated_sectors(buf, n, pnum);
592
    if (!ret) {
593
        return ret;
594
    }
595

    
596
    num_used = *pnum;
597
    buf += BDRV_SECTOR_SIZE * *pnum;
598
    n -= *pnum;
599
    num_checked = num_used;
600

    
601
    while (n > 0) {
602
        ret = is_allocated_sectors(buf, n, pnum);
603

    
604
        buf += BDRV_SECTOR_SIZE * *pnum;
605
        n -= *pnum;
606
        num_checked += *pnum;
607
        if (ret) {
608
            num_used = num_checked;
609
        } else if (*pnum >= min) {
610
            break;
611
        }
612
    }
613

    
614
    *pnum = num_used;
615
    return 1;
616
}
617

    
618
/*
619
 * Compares two buffers sector by sector. Returns 0 if the first sector of both
620
 * buffers matches, non-zero otherwise.
621
 *
622
 * pnum is set to the number of sectors (including and immediately following
623
 * the first one) that are known to have the same comparison result
624
 */
625
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
626
    int *pnum)
627
{
628
    int res, i;
629

    
630
    if (n <= 0) {
631
        *pnum = 0;
632
        return 0;
633
    }
634

    
635
    res = !!memcmp(buf1, buf2, 512);
636
    for(i = 1; i < n; i++) {
637
        buf1 += 512;
638
        buf2 += 512;
639

    
640
        if (!!memcmp(buf1, buf2, 512) != res) {
641
            break;
642
        }
643
    }
644

    
645
    *pnum = i;
646
    return res;
647
}
648

    
649
#define IO_BUF_SIZE (2 * 1024 * 1024)
650

    
651
static int img_convert(int argc, char **argv)
652
{
653
    int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
654
    int progress = 0, flags;
655
    const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
656
    BlockDriver *drv, *proto_drv;
657
    BlockDriverState **bs = NULL, *out_bs = NULL;
658
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
659
    uint64_t bs_sectors;
660
    uint8_t * buf = NULL;
661
    const uint8_t *buf1;
662
    BlockDriverInfo bdi;
663
    QEMUOptionParameter *param = NULL, *create_options = NULL;
664
    QEMUOptionParameter *out_baseimg_param;
665
    char *options = NULL;
666
    const char *snapshot_name = NULL;
667
    float local_progress;
668
    int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
669

    
670
    fmt = NULL;
671
    out_fmt = "raw";
672
    cache = "unsafe";
673
    out_baseimg = NULL;
674
    compress = 0;
675
    for(;;) {
676
        c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
677
        if (c == -1) {
678
            break;
679
        }
680
        switch(c) {
681
        case '?':
682
        case 'h':
683
            help();
684
            break;
685
        case 'f':
686
            fmt = optarg;
687
            break;
688
        case 'O':
689
            out_fmt = optarg;
690
            break;
691
        case 'B':
692
            out_baseimg = optarg;
693
            break;
694
        case 'c':
695
            compress = 1;
696
            break;
697
        case 'e':
698
            error_report("option -e is deprecated, please use \'-o "
699
                  "encryption\' instead!");
700
            return 1;
701
        case '6':
702
            error_report("option -6 is deprecated, please use \'-o "
703
                  "compat6\' instead!");
704
            return 1;
705
        case 'o':
706
            options = optarg;
707
            break;
708
        case 's':
709
            snapshot_name = optarg;
710
            break;
711
        case 'S':
712
        {
713
            int64_t sval;
714
            char *end;
715
            sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
716
            if (sval < 0 || *end) {
717
                error_report("Invalid minimum zero buffer size for sparse output specified");
718
                return 1;
719
            }
720

    
721
            min_sparse = sval / BDRV_SECTOR_SIZE;
722
            break;
723
        }
724
        case 'p':
725
            progress = 1;
726
            break;
727
        case 't':
728
            cache = optarg;
729
            break;
730
        }
731
    }
732

    
733
    bs_n = argc - optind - 1;
734
    if (bs_n < 1) {
735
        help();
736
    }
737

    
738
    out_filename = argv[argc - 1];
739

    
740
    if (options && !strcmp(options, "?")) {
741
        ret = print_block_option_help(out_filename, out_fmt);
742
        goto out;
743
    }
744

    
745
    if (bs_n > 1 && out_baseimg) {
746
        error_report("-B makes no sense when concatenating multiple input "
747
                     "images");
748
        ret = -1;
749
        goto out;
750
    }
751
        
752
    qemu_progress_init(progress, 2.0);
753
    qemu_progress_print(0, 100);
754

    
755
    bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
756

    
757
    total_sectors = 0;
758
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
759
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
760
        if (!bs[bs_i]) {
761
            error_report("Could not open '%s'", argv[optind + bs_i]);
762
            ret = -1;
763
            goto out;
764
        }
765
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
766
        total_sectors += bs_sectors;
767
    }
768

    
769
    if (snapshot_name != NULL) {
770
        if (bs_n > 1) {
771
            error_report("No support for concatenating multiple snapshot");
772
            ret = -1;
773
            goto out;
774
        }
775
        if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
776
            error_report("Failed to load snapshot");
777
            ret = -1;
778
            goto out;
779
        }
780
    }
781

    
782
    /* Find driver and parse its options */
783
    drv = bdrv_find_format(out_fmt);
784
    if (!drv) {
785
        error_report("Unknown file format '%s'", out_fmt);
786
        ret = -1;
787
        goto out;
788
    }
789

    
790
    proto_drv = bdrv_find_protocol(out_filename);
791
    if (!proto_drv) {
792
        error_report("Unknown protocol '%s'", out_filename);
793
        ret = -1;
794
        goto out;
795
    }
796

    
797
    create_options = append_option_parameters(create_options,
798
                                              drv->create_options);
799
    create_options = append_option_parameters(create_options,
800
                                              proto_drv->create_options);
801

    
802
    if (options) {
803
        param = parse_option_parameters(options, create_options, param);
804
        if (param == NULL) {
805
            error_report("Invalid options for file format '%s'.", out_fmt);
806
            ret = -1;
807
            goto out;
808
        }
809
    } else {
810
        param = parse_option_parameters("", create_options, param);
811
    }
812

    
813
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
814
    ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
815
    if (ret < 0) {
816
        goto out;
817
    }
818

    
819
    /* Get backing file name if -o backing_file was used */
820
    out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
821
    if (out_baseimg_param) {
822
        out_baseimg = out_baseimg_param->value.s;
823
    }
824

    
825
    /* Check if compression is supported */
826
    if (compress) {
827
        QEMUOptionParameter *encryption =
828
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
829
        QEMUOptionParameter *preallocation =
830
            get_option_parameter(param, BLOCK_OPT_PREALLOC);
831

    
832
        if (!drv->bdrv_write_compressed) {
833
            error_report("Compression not supported for this file format");
834
            ret = -1;
835
            goto out;
836
        }
837

    
838
        if (encryption && encryption->value.n) {
839
            error_report("Compression and encryption not supported at "
840
                         "the same time");
841
            ret = -1;
842
            goto out;
843
        }
844

    
845
        if (preallocation && preallocation->value.s
846
            && strcmp(preallocation->value.s, "off"))
847
        {
848
            error_report("Compression and preallocation not supported at "
849
                         "the same time");
850
            ret = -1;
851
            goto out;
852
        }
853
    }
854

    
855
    /* Create the new image */
856
    ret = bdrv_create(drv, out_filename, param);
857
    if (ret < 0) {
858
        if (ret == -ENOTSUP) {
859
            error_report("Formatting not supported for file format '%s'",
860
                         out_fmt);
861
        } else if (ret == -EFBIG) {
862
            error_report("The image size is too large for file format '%s'",
863
                         out_fmt);
864
        } else {
865
            error_report("%s: error while converting %s: %s",
866
                         out_filename, out_fmt, strerror(-ret));
867
        }
868
        goto out;
869
    }
870

    
871
    flags = BDRV_O_RDWR;
872
    ret = bdrv_parse_cache_flags(cache, &flags);
873
    if (ret < 0) {
874
        error_report("Invalid cache option: %s", cache);
875
        return -1;
876
    }
877

    
878
    out_bs = bdrv_new_open(out_filename, out_fmt, flags);
879
    if (!out_bs) {
880
        ret = -1;
881
        goto out;
882
    }
883

    
884
    bs_i = 0;
885
    bs_offset = 0;
886
    bdrv_get_geometry(bs[0], &bs_sectors);
887
    buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
888

    
889
    if (compress) {
890
        ret = bdrv_get_info(out_bs, &bdi);
891
        if (ret < 0) {
892
            error_report("could not get block driver info");
893
            goto out;
894
        }
895
        cluster_size = bdi.cluster_size;
896
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
897
            error_report("invalid cluster size");
898
            ret = -1;
899
            goto out;
900
        }
901
        cluster_sectors = cluster_size >> 9;
902
        sector_num = 0;
903

    
904
        nb_sectors = total_sectors;
905
        local_progress = (float)100 /
906
            (nb_sectors / MIN(nb_sectors, cluster_sectors));
907

    
908
        for(;;) {
909
            int64_t bs_num;
910
            int remainder;
911
            uint8_t *buf2;
912

    
913
            nb_sectors = total_sectors - sector_num;
914
            if (nb_sectors <= 0)
915
                break;
916
            if (nb_sectors >= cluster_sectors)
917
                n = cluster_sectors;
918
            else
919
                n = nb_sectors;
920

    
921
            bs_num = sector_num - bs_offset;
922
            assert (bs_num >= 0);
923
            remainder = n;
924
            buf2 = buf;
925
            while (remainder > 0) {
926
                int nlow;
927
                while (bs_num == bs_sectors) {
928
                    bs_i++;
929
                    assert (bs_i < bs_n);
930
                    bs_offset += bs_sectors;
931
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
932
                    bs_num = 0;
933
                    /* printf("changing part: sector_num=%" PRId64 ", "
934
                       "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
935
                       "\n", sector_num, bs_i, bs_offset, bs_sectors); */
936
                }
937
                assert (bs_num < bs_sectors);
938

    
939
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
940

    
941
                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
942
                if (ret < 0) {
943
                    error_report("error while reading sector %" PRId64 ": %s",
944
                                 bs_num, strerror(-ret));
945
                    goto out;
946
                }
947

    
948
                buf2 += nlow * 512;
949
                bs_num += nlow;
950

    
951
                remainder -= nlow;
952
            }
953
            assert (remainder == 0);
954

    
955
            if (n < cluster_sectors) {
956
                memset(buf + n * 512, 0, cluster_size - n * 512);
957
            }
958
            if (is_not_zero(buf, cluster_size)) {
959
                ret = bdrv_write_compressed(out_bs, sector_num, buf,
960
                                            cluster_sectors);
961
                if (ret != 0) {
962
                    error_report("error while compressing sector %" PRId64
963
                                 ": %s", sector_num, strerror(-ret));
964
                    goto out;
965
                }
966
            }
967
            sector_num += n;
968
            qemu_progress_print(local_progress, 100);
969
        }
970
        /* signal EOF to align */
971
        bdrv_write_compressed(out_bs, 0, NULL, 0);
972
    } else {
973
        int has_zero_init = bdrv_has_zero_init(out_bs);
974

    
975
        sector_num = 0; // total number of sectors converted so far
976
        nb_sectors = total_sectors - sector_num;
977
        local_progress = (float)100 /
978
            (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
979

    
980
        for(;;) {
981
            nb_sectors = total_sectors - sector_num;
982
            if (nb_sectors <= 0) {
983
                break;
984
            }
985
            if (nb_sectors >= (IO_BUF_SIZE / 512)) {
986
                n = (IO_BUF_SIZE / 512);
987
            } else {
988
                n = nb_sectors;
989
            }
990

    
991
            while (sector_num - bs_offset >= bs_sectors) {
992
                bs_i ++;
993
                assert (bs_i < bs_n);
994
                bs_offset += bs_sectors;
995
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
996
                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
997
                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
998
                   sector_num, bs_i, bs_offset, bs_sectors); */
999
            }
1000

    
1001
            if (n > bs_offset + bs_sectors - sector_num) {
1002
                n = bs_offset + bs_sectors - sector_num;
1003
            }
1004

    
1005
            if (has_zero_init) {
1006
                /* If the output image is being created as a copy on write image,
1007
                   assume that sectors which are unallocated in the input image
1008
                   are present in both the output's and input's base images (no
1009
                   need to copy them). */
1010
                if (out_baseimg) {
1011
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1012
                                           n, &n1)) {
1013
                        sector_num += n1;
1014
                        continue;
1015
                    }
1016
                    /* The next 'n1' sectors are allocated in the input image. Copy
1017
                       only those as they may be followed by unallocated sectors. */
1018
                    n = n1;
1019
                }
1020
            } else {
1021
                n1 = n;
1022
            }
1023

    
1024
            ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1025
            if (ret < 0) {
1026
                error_report("error while reading sector %" PRId64 ": %s",
1027
                             sector_num - bs_offset, strerror(-ret));
1028
                goto out;
1029
            }
1030
            /* NOTE: at the same time we convert, we do not write zero
1031
               sectors to have a chance to compress the image. Ideally, we
1032
               should add a specific call to have the info to go faster */
1033
            buf1 = buf;
1034
            while (n > 0) {
1035
                /* If the output image is being created as a copy on write image,
1036
                   copy all sectors even the ones containing only NUL bytes,
1037
                   because they may differ from the sectors in the base image.
1038

1039
                   If the output is to a host device, we also write out
1040
                   sectors that are entirely 0, since whatever data was
1041
                   already there is garbage, not 0s. */
1042
                if (!has_zero_init || out_baseimg ||
1043
                    is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1044
                    ret = bdrv_write(out_bs, sector_num, buf1, n1);
1045
                    if (ret < 0) {
1046
                        error_report("error while writing sector %" PRId64
1047
                                     ": %s", sector_num, strerror(-ret));
1048
                        goto out;
1049
                    }
1050
                }
1051
                sector_num += n1;
1052
                n -= n1;
1053
                buf1 += n1 * 512;
1054
            }
1055
            qemu_progress_print(local_progress, 100);
1056
        }
1057
    }
1058
out:
1059
    qemu_progress_end();
1060
    free_option_parameters(create_options);
1061
    free_option_parameters(param);
1062
    qemu_vfree(buf);
1063
    if (out_bs) {
1064
        bdrv_delete(out_bs);
1065
    }
1066
    if (bs) {
1067
        for (bs_i = 0; bs_i < bs_n; bs_i++) {
1068
            if (bs[bs_i]) {
1069
                bdrv_delete(bs[bs_i]);
1070
            }
1071
        }
1072
        g_free(bs);
1073
    }
1074
    if (ret) {
1075
        return 1;
1076
    }
1077
    return 0;
1078
}
1079

    
1080

    
1081
static void dump_snapshots(BlockDriverState *bs)
1082
{
1083
    QEMUSnapshotInfo *sn_tab, *sn;
1084
    int nb_sns, i;
1085
    char buf[256];
1086

    
1087
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1088
    if (nb_sns <= 0)
1089
        return;
1090
    printf("Snapshot list:\n");
1091
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1092
    for(i = 0; i < nb_sns; i++) {
1093
        sn = &sn_tab[i];
1094
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1095
    }
1096
    g_free(sn_tab);
1097
}
1098

    
1099
static int img_info(int argc, char **argv)
1100
{
1101
    int c;
1102
    const char *filename, *fmt;
1103
    BlockDriverState *bs;
1104
    char fmt_name[128], size_buf[128], dsize_buf[128];
1105
    uint64_t total_sectors;
1106
    int64_t allocated_size;
1107
    char backing_filename[1024];
1108
    char backing_filename2[1024];
1109
    BlockDriverInfo bdi;
1110

    
1111
    fmt = NULL;
1112
    for(;;) {
1113
        c = getopt(argc, argv, "f:h");
1114
        if (c == -1) {
1115
            break;
1116
        }
1117
        switch(c) {
1118
        case '?':
1119
        case 'h':
1120
            help();
1121
            break;
1122
        case 'f':
1123
            fmt = optarg;
1124
            break;
1125
        }
1126
    }
1127
    if (optind >= argc) {
1128
        help();
1129
    }
1130
    filename = argv[optind++];
1131

    
1132
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1133
    if (!bs) {
1134
        return 1;
1135
    }
1136
    bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1137
    bdrv_get_geometry(bs, &total_sectors);
1138
    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1139
    allocated_size = bdrv_get_allocated_file_size(bs);
1140
    if (allocated_size < 0) {
1141
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1142
    } else {
1143
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1144
                                allocated_size);
1145
    }
1146
    printf("image: %s\n"
1147
           "file format: %s\n"
1148
           "virtual size: %s (%" PRId64 " bytes)\n"
1149
           "disk size: %s\n",
1150
           filename, fmt_name, size_buf,
1151
           (total_sectors * 512),
1152
           dsize_buf);
1153
    if (bdrv_is_encrypted(bs)) {
1154
        printf("encrypted: yes\n");
1155
    }
1156
    if (bdrv_get_info(bs, &bdi) >= 0) {
1157
        if (bdi.cluster_size != 0) {
1158
            printf("cluster_size: %d\n", bdi.cluster_size);
1159
        }
1160
    }
1161
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1162
    if (backing_filename[0] != '\0') {
1163
        path_combine(backing_filename2, sizeof(backing_filename2),
1164
                     filename, backing_filename);
1165
        printf("backing file: %s (actual path: %s)\n",
1166
               backing_filename,
1167
               backing_filename2);
1168
    }
1169
    dump_snapshots(bs);
1170
    bdrv_delete(bs);
1171
    return 0;
1172
}
1173

    
1174
#define SNAPSHOT_LIST   1
1175
#define SNAPSHOT_CREATE 2
1176
#define SNAPSHOT_APPLY  3
1177
#define SNAPSHOT_DELETE 4
1178

    
1179
static int img_snapshot(int argc, char **argv)
1180
{
1181
    BlockDriverState *bs;
1182
    QEMUSnapshotInfo sn;
1183
    char *filename, *snapshot_name = NULL;
1184
    int c, ret = 0, bdrv_oflags;
1185
    int action = 0;
1186
    qemu_timeval tv;
1187

    
1188
    bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1189
    /* Parse commandline parameters */
1190
    for(;;) {
1191
        c = getopt(argc, argv, "la:c:d:h");
1192
        if (c == -1) {
1193
            break;
1194
        }
1195
        switch(c) {
1196
        case '?':
1197
        case 'h':
1198
            help();
1199
            return 0;
1200
        case 'l':
1201
            if (action) {
1202
                help();
1203
                return 0;
1204
            }
1205
            action = SNAPSHOT_LIST;
1206
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1207
            break;
1208
        case 'a':
1209
            if (action) {
1210
                help();
1211
                return 0;
1212
            }
1213
            action = SNAPSHOT_APPLY;
1214
            snapshot_name = optarg;
1215
            break;
1216
        case 'c':
1217
            if (action) {
1218
                help();
1219
                return 0;
1220
            }
1221
            action = SNAPSHOT_CREATE;
1222
            snapshot_name = optarg;
1223
            break;
1224
        case 'd':
1225
            if (action) {
1226
                help();
1227
                return 0;
1228
            }
1229
            action = SNAPSHOT_DELETE;
1230
            snapshot_name = optarg;
1231
            break;
1232
        }
1233
    }
1234

    
1235
    if (optind >= argc) {
1236
        help();
1237
    }
1238
    filename = argv[optind++];
1239

    
1240
    /* Open the image */
1241
    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1242
    if (!bs) {
1243
        return 1;
1244
    }
1245

    
1246
    /* Perform the requested action */
1247
    switch(action) {
1248
    case SNAPSHOT_LIST:
1249
        dump_snapshots(bs);
1250
        break;
1251

    
1252
    case SNAPSHOT_CREATE:
1253
        memset(&sn, 0, sizeof(sn));
1254
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1255

    
1256
        qemu_gettimeofday(&tv);
1257
        sn.date_sec = tv.tv_sec;
1258
        sn.date_nsec = tv.tv_usec * 1000;
1259

    
1260
        ret = bdrv_snapshot_create(bs, &sn);
1261
        if (ret) {
1262
            error_report("Could not create snapshot '%s': %d (%s)",
1263
                snapshot_name, ret, strerror(-ret));
1264
        }
1265
        break;
1266

    
1267
    case SNAPSHOT_APPLY:
1268
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1269
        if (ret) {
1270
            error_report("Could not apply snapshot '%s': %d (%s)",
1271
                snapshot_name, ret, strerror(-ret));
1272
        }
1273
        break;
1274

    
1275
    case SNAPSHOT_DELETE:
1276
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1277
        if (ret) {
1278
            error_report("Could not delete snapshot '%s': %d (%s)",
1279
                snapshot_name, ret, strerror(-ret));
1280
        }
1281
        break;
1282
    }
1283

    
1284
    /* Cleanup */
1285
    bdrv_delete(bs);
1286
    if (ret) {
1287
        return 1;
1288
    }
1289
    return 0;
1290
}
1291

    
1292
static int img_rebase(int argc, char **argv)
1293
{
1294
    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1295
    BlockDriver *old_backing_drv, *new_backing_drv;
1296
    char *filename;
1297
    const char *fmt, *cache, *out_basefmt, *out_baseimg;
1298
    int c, flags, ret;
1299
    int unsafe = 0;
1300
    int progress = 0;
1301

    
1302
    /* Parse commandline parameters */
1303
    fmt = NULL;
1304
    cache = BDRV_DEFAULT_CACHE;
1305
    out_baseimg = NULL;
1306
    out_basefmt = NULL;
1307
    for(;;) {
1308
        c = getopt(argc, argv, "uhf:F:b:pt:");
1309
        if (c == -1) {
1310
            break;
1311
        }
1312
        switch(c) {
1313
        case '?':
1314
        case 'h':
1315
            help();
1316
            return 0;
1317
        case 'f':
1318
            fmt = optarg;
1319
            break;
1320
        case 'F':
1321
            out_basefmt = optarg;
1322
            break;
1323
        case 'b':
1324
            out_baseimg = optarg;
1325
            break;
1326
        case 'u':
1327
            unsafe = 1;
1328
            break;
1329
        case 'p':
1330
            progress = 1;
1331
            break;
1332
        case 't':
1333
            cache = optarg;
1334
            break;
1335
        }
1336
    }
1337

    
1338
    if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1339
        help();
1340
    }
1341
    filename = argv[optind++];
1342

    
1343
    qemu_progress_init(progress, 2.0);
1344
    qemu_progress_print(0, 100);
1345

    
1346
    flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1347
    ret = bdrv_parse_cache_flags(cache, &flags);
1348
    if (ret < 0) {
1349
        error_report("Invalid cache option: %s", cache);
1350
        return -1;
1351
    }
1352

    
1353
    /*
1354
     * Open the images.
1355
     *
1356
     * Ignore the old backing file for unsafe rebase in case we want to correct
1357
     * the reference to a renamed or moved backing file.
1358
     */
1359
    bs = bdrv_new_open(filename, fmt, flags);
1360
    if (!bs) {
1361
        return 1;
1362
    }
1363

    
1364
    /* Find the right drivers for the backing files */
1365
    old_backing_drv = NULL;
1366
    new_backing_drv = NULL;
1367

    
1368
    if (!unsafe && bs->backing_format[0] != '\0') {
1369
        old_backing_drv = bdrv_find_format(bs->backing_format);
1370
        if (old_backing_drv == NULL) {
1371
            error_report("Invalid format name: '%s'", bs->backing_format);
1372
            ret = -1;
1373
            goto out;
1374
        }
1375
    }
1376

    
1377
    if (out_basefmt != NULL) {
1378
        new_backing_drv = bdrv_find_format(out_basefmt);
1379
        if (new_backing_drv == NULL) {
1380
            error_report("Invalid format name: '%s'", out_basefmt);
1381
            ret = -1;
1382
            goto out;
1383
        }
1384
    }
1385

    
1386
    /* For safe rebasing we need to compare old and new backing file */
1387
    if (unsafe) {
1388
        /* Make the compiler happy */
1389
        bs_old_backing = NULL;
1390
        bs_new_backing = NULL;
1391
    } else {
1392
        char backing_name[1024];
1393

    
1394
        bs_old_backing = bdrv_new("old_backing");
1395
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1396
        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1397
                        old_backing_drv);
1398
        if (ret) {
1399
            error_report("Could not open old backing file '%s'", backing_name);
1400
            goto out;
1401
        }
1402

    
1403
        bs_new_backing = bdrv_new("new_backing");
1404
        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1405
                        new_backing_drv);
1406
        if (ret) {
1407
            error_report("Could not open new backing file '%s'", out_baseimg);
1408
            goto out;
1409
        }
1410
    }
1411

    
1412
    /*
1413
     * Check each unallocated cluster in the COW file. If it is unallocated,
1414
     * accesses go to the backing file. We must therefore compare this cluster
1415
     * in the old and new backing file, and if they differ we need to copy it
1416
     * from the old backing file into the COW file.
1417
     *
1418
     * If qemu-img crashes during this step, no harm is done. The content of
1419
     * the image is the same as the original one at any time.
1420
     */
1421
    if (!unsafe) {
1422
        uint64_t num_sectors;
1423
        uint64_t sector;
1424
        int n;
1425
        uint8_t * buf_old;
1426
        uint8_t * buf_new;
1427
        float local_progress;
1428

    
1429
        buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1430
        buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1431

    
1432
        bdrv_get_geometry(bs, &num_sectors);
1433

    
1434
        local_progress = (float)100 /
1435
            (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1436
        for (sector = 0; sector < num_sectors; sector += n) {
1437

    
1438
            /* How many sectors can we handle with the next read? */
1439
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1440
                n = (IO_BUF_SIZE / 512);
1441
            } else {
1442
                n = num_sectors - sector;
1443
            }
1444

    
1445
            /* If the cluster is allocated, we don't need to take action */
1446
            ret = bdrv_is_allocated(bs, sector, n, &n);
1447
            if (ret) {
1448
                continue;
1449
            }
1450

    
1451
            /* Read old and new backing file */
1452
            ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1453
            if (ret < 0) {
1454
                error_report("error while reading from old backing file");
1455
                goto out;
1456
            }
1457
            ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1458
            if (ret < 0) {
1459
                error_report("error while reading from new backing file");
1460
                goto out;
1461
            }
1462

    
1463
            /* If they differ, we need to write to the COW file */
1464
            uint64_t written = 0;
1465

    
1466
            while (written < n) {
1467
                int pnum;
1468

    
1469
                if (compare_sectors(buf_old + written * 512,
1470
                    buf_new + written * 512, n - written, &pnum))
1471
                {
1472
                    ret = bdrv_write(bs, sector + written,
1473
                        buf_old + written * 512, pnum);
1474
                    if (ret < 0) {
1475
                        error_report("Error while writing to COW image: %s",
1476
                            strerror(-ret));
1477
                        goto out;
1478
                    }
1479
                }
1480

    
1481
                written += pnum;
1482
            }
1483
            qemu_progress_print(local_progress, 100);
1484
        }
1485

    
1486
        qemu_vfree(buf_old);
1487
        qemu_vfree(buf_new);
1488
    }
1489

    
1490
    /*
1491
     * Change the backing file. All clusters that are different from the old
1492
     * backing file are overwritten in the COW file now, so the visible content
1493
     * doesn't change when we switch the backing file.
1494
     */
1495
    ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1496
    if (ret == -ENOSPC) {
1497
        error_report("Could not change the backing file to '%s': No "
1498
                     "space left in the file header", out_baseimg);
1499
    } else if (ret < 0) {
1500
        error_report("Could not change the backing file to '%s': %s",
1501
            out_baseimg, strerror(-ret));
1502
    }
1503

    
1504
    qemu_progress_print(100, 0);
1505
    /*
1506
     * TODO At this point it is possible to check if any clusters that are
1507
     * allocated in the COW file are the same in the backing file. If so, they
1508
     * could be dropped from the COW file. Don't do this before switching the
1509
     * backing file, in case of a crash this would lead to corruption.
1510
     */
1511
out:
1512
    qemu_progress_end();
1513
    /* Cleanup */
1514
    if (!unsafe) {
1515
        if (bs_old_backing != NULL) {
1516
            bdrv_delete(bs_old_backing);
1517
        }
1518
        if (bs_new_backing != NULL) {
1519
            bdrv_delete(bs_new_backing);
1520
        }
1521
    }
1522

    
1523
    bdrv_delete(bs);
1524
    if (ret) {
1525
        return 1;
1526
    }
1527
    return 0;
1528
}
1529

    
1530
static int img_resize(int argc, char **argv)
1531
{
1532
    int c, ret, relative;
1533
    const char *filename, *fmt, *size;
1534
    int64_t n, total_size;
1535
    BlockDriverState *bs = NULL;
1536
    QEMUOptionParameter *param;
1537
    QEMUOptionParameter resize_options[] = {
1538
        {
1539
            .name = BLOCK_OPT_SIZE,
1540
            .type = OPT_SIZE,
1541
            .help = "Virtual disk size"
1542
        },
1543
        { NULL }
1544
    };
1545

    
1546
    /* Remove size from argv manually so that negative numbers are not treated
1547
     * as options by getopt. */
1548
    if (argc < 3) {
1549
        help();
1550
        return 1;
1551
    }
1552

    
1553
    size = argv[--argc];
1554

    
1555
    /* Parse getopt arguments */
1556
    fmt = NULL;
1557
    for(;;) {
1558
        c = getopt(argc, argv, "f:h");
1559
        if (c == -1) {
1560
            break;
1561
        }
1562
        switch(c) {
1563
        case '?':
1564
        case 'h':
1565
            help();
1566
            break;
1567
        case 'f':
1568
            fmt = optarg;
1569
            break;
1570
        }
1571
    }
1572
    if (optind >= argc) {
1573
        help();
1574
    }
1575
    filename = argv[optind++];
1576

    
1577
    /* Choose grow, shrink, or absolute resize mode */
1578
    switch (size[0]) {
1579
    case '+':
1580
        relative = 1;
1581
        size++;
1582
        break;
1583
    case '-':
1584
        relative = -1;
1585
        size++;
1586
        break;
1587
    default:
1588
        relative = 0;
1589
        break;
1590
    }
1591

    
1592
    /* Parse size */
1593
    param = parse_option_parameters("", resize_options, NULL);
1594
    if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1595
        /* Error message already printed when size parsing fails */
1596
        ret = -1;
1597
        goto out;
1598
    }
1599
    n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1600
    free_option_parameters(param);
1601

    
1602
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1603
    if (!bs) {
1604
        ret = -1;
1605
        goto out;
1606
    }
1607

    
1608
    if (relative) {
1609
        total_size = bdrv_getlength(bs) + n * relative;
1610
    } else {
1611
        total_size = n;
1612
    }
1613
    if (total_size <= 0) {
1614
        error_report("New image size must be positive");
1615
        ret = -1;
1616
        goto out;
1617
    }
1618

    
1619
    ret = bdrv_truncate(bs, total_size);
1620
    switch (ret) {
1621
    case 0:
1622
        printf("Image resized.\n");
1623
        break;
1624
    case -ENOTSUP:
1625
        error_report("This image format does not support resize");
1626
        break;
1627
    case -EACCES:
1628
        error_report("Image is read-only");
1629
        break;
1630
    default:
1631
        error_report("Error resizing image (%d)", -ret);
1632
        break;
1633
    }
1634
out:
1635
    if (bs) {
1636
        bdrv_delete(bs);
1637
    }
1638
    if (ret) {
1639
        return 1;
1640
    }
1641
    return 0;
1642
}
1643

    
1644
static const img_cmd_t img_cmds[] = {
1645
#define DEF(option, callback, arg_string)        \
1646
    { option, callback },
1647
#include "qemu-img-cmds.h"
1648
#undef DEF
1649
#undef GEN_DOCS
1650
    { NULL, NULL, },
1651
};
1652

    
1653
int main(int argc, char **argv)
1654
{
1655
    const img_cmd_t *cmd;
1656
    const char *cmdname;
1657

    
1658
    error_set_progname(argv[0]);
1659

    
1660
    bdrv_init();
1661
    if (argc < 2)
1662
        help();
1663
    cmdname = argv[1];
1664
    argc--; argv++;
1665

    
1666
    /* find the command */
1667
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1668
        if (!strcmp(cmdname, cmd->name)) {
1669
            return cmd->handler(argc, argv);
1670
        }
1671
    }
1672

    
1673
    /* not found */
1674
    help();
1675
    return 0;
1676
}