Statistics
| Branch: | Revision:

root / qemu-img.c @ 1a6d39fd

History | View | Annotate | Download (46.2 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
 * Returns true iff the first sector pointed to by 'buf' contains at least
519
 * a non-NUL byte.
520
 *
521
 * 'pnum' is set to the number of sectors (including and immediately following
522
 * the first one) that are known to be in the same allocated/unallocated state.
523
 */
524
static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
525
{
526
    bool is_zero;
527
    int i;
528

    
529
    if (n <= 0) {
530
        *pnum = 0;
531
        return 0;
532
    }
533
    is_zero = buffer_is_zero(buf, 512);
534
    for(i = 1; i < n; i++) {
535
        buf += 512;
536
        if (is_zero != buffer_is_zero(buf, 512)) {
537
            break;
538
        }
539
    }
540
    *pnum = i;
541
    return !is_zero;
542
}
543

    
544
/*
545
 * Like is_allocated_sectors, but if the buffer starts with a used sector,
546
 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
547
 * breaking up write requests for only small sparse areas.
548
 */
549
static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
550
    int min)
551
{
552
    int ret;
553
    int num_checked, num_used;
554

    
555
    if (n < min) {
556
        min = n;
557
    }
558

    
559
    ret = is_allocated_sectors(buf, n, pnum);
560
    if (!ret) {
561
        return ret;
562
    }
563

    
564
    num_used = *pnum;
565
    buf += BDRV_SECTOR_SIZE * *pnum;
566
    n -= *pnum;
567
    num_checked = num_used;
568

    
569
    while (n > 0) {
570
        ret = is_allocated_sectors(buf, n, pnum);
571

    
572
        buf += BDRV_SECTOR_SIZE * *pnum;
573
        n -= *pnum;
574
        num_checked += *pnum;
575
        if (ret) {
576
            num_used = num_checked;
577
        } else if (*pnum >= min) {
578
            break;
579
        }
580
    }
581

    
582
    *pnum = num_used;
583
    return 1;
584
}
585

    
586
/*
587
 * Compares two buffers sector by sector. Returns 0 if the first sector of both
588
 * buffers matches, non-zero otherwise.
589
 *
590
 * pnum is set to the number of sectors (including and immediately following
591
 * the first one) that are known to have the same comparison result
592
 */
593
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
594
    int *pnum)
595
{
596
    int res, i;
597

    
598
    if (n <= 0) {
599
        *pnum = 0;
600
        return 0;
601
    }
602

    
603
    res = !!memcmp(buf1, buf2, 512);
604
    for(i = 1; i < n; i++) {
605
        buf1 += 512;
606
        buf2 += 512;
607

    
608
        if (!!memcmp(buf1, buf2, 512) != res) {
609
            break;
610
        }
611
    }
612

    
613
    *pnum = i;
614
    return res;
615
}
616

    
617
#define IO_BUF_SIZE (2 * 1024 * 1024)
618

    
619
static int img_convert(int argc, char **argv)
620
{
621
    int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
622
    int progress = 0, flags;
623
    const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
624
    BlockDriver *drv, *proto_drv;
625
    BlockDriverState **bs = NULL, *out_bs = NULL;
626
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
627
    uint64_t bs_sectors;
628
    uint8_t * buf = NULL;
629
    const uint8_t *buf1;
630
    BlockDriverInfo bdi;
631
    QEMUOptionParameter *param = NULL, *create_options = NULL;
632
    QEMUOptionParameter *out_baseimg_param;
633
    char *options = NULL;
634
    const char *snapshot_name = NULL;
635
    float local_progress;
636
    int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
637

    
638
    fmt = NULL;
639
    out_fmt = "raw";
640
    cache = "unsafe";
641
    out_baseimg = NULL;
642
    compress = 0;
643
    for(;;) {
644
        c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
645
        if (c == -1) {
646
            break;
647
        }
648
        switch(c) {
649
        case '?':
650
        case 'h':
651
            help();
652
            break;
653
        case 'f':
654
            fmt = optarg;
655
            break;
656
        case 'O':
657
            out_fmt = optarg;
658
            break;
659
        case 'B':
660
            out_baseimg = optarg;
661
            break;
662
        case 'c':
663
            compress = 1;
664
            break;
665
        case 'e':
666
            error_report("option -e is deprecated, please use \'-o "
667
                  "encryption\' instead!");
668
            return 1;
669
        case '6':
670
            error_report("option -6 is deprecated, please use \'-o "
671
                  "compat6\' instead!");
672
            return 1;
673
        case 'o':
674
            options = optarg;
675
            break;
676
        case 's':
677
            snapshot_name = optarg;
678
            break;
679
        case 'S':
680
        {
681
            int64_t sval;
682
            char *end;
683
            sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
684
            if (sval < 0 || *end) {
685
                error_report("Invalid minimum zero buffer size for sparse output specified");
686
                return 1;
687
            }
688

    
689
            min_sparse = sval / BDRV_SECTOR_SIZE;
690
            break;
691
        }
692
        case 'p':
693
            progress = 1;
694
            break;
695
        case 't':
696
            cache = optarg;
697
            break;
698
        }
699
    }
700

    
701
    bs_n = argc - optind - 1;
702
    if (bs_n < 1) {
703
        help();
704
    }
705

    
706
    out_filename = argv[argc - 1];
707

    
708
    if (options && !strcmp(options, "?")) {
709
        ret = print_block_option_help(out_filename, out_fmt);
710
        goto out;
711
    }
712

    
713
    if (bs_n > 1 && out_baseimg) {
714
        error_report("-B makes no sense when concatenating multiple input "
715
                     "images");
716
        ret = -1;
717
        goto out;
718
    }
719
        
720
    qemu_progress_init(progress, 2.0);
721
    qemu_progress_print(0, 100);
722

    
723
    bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
724

    
725
    total_sectors = 0;
726
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
727
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
728
        if (!bs[bs_i]) {
729
            error_report("Could not open '%s'", argv[optind + bs_i]);
730
            ret = -1;
731
            goto out;
732
        }
733
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
734
        total_sectors += bs_sectors;
735
    }
736

    
737
    if (snapshot_name != NULL) {
738
        if (bs_n > 1) {
739
            error_report("No support for concatenating multiple snapshot");
740
            ret = -1;
741
            goto out;
742
        }
743
        if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
744
            error_report("Failed to load snapshot");
745
            ret = -1;
746
            goto out;
747
        }
748
    }
749

    
750
    /* Find driver and parse its options */
751
    drv = bdrv_find_format(out_fmt);
752
    if (!drv) {
753
        error_report("Unknown file format '%s'", out_fmt);
754
        ret = -1;
755
        goto out;
756
    }
757

    
758
    proto_drv = bdrv_find_protocol(out_filename);
759
    if (!proto_drv) {
760
        error_report("Unknown protocol '%s'", out_filename);
761
        ret = -1;
762
        goto out;
763
    }
764

    
765
    create_options = append_option_parameters(create_options,
766
                                              drv->create_options);
767
    create_options = append_option_parameters(create_options,
768
                                              proto_drv->create_options);
769

    
770
    if (options) {
771
        param = parse_option_parameters(options, create_options, param);
772
        if (param == NULL) {
773
            error_report("Invalid options for file format '%s'.", out_fmt);
774
            ret = -1;
775
            goto out;
776
        }
777
    } else {
778
        param = parse_option_parameters("", create_options, param);
779
    }
780

    
781
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
782
    ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
783
    if (ret < 0) {
784
        goto out;
785
    }
786

    
787
    /* Get backing file name if -o backing_file was used */
788
    out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
789
    if (out_baseimg_param) {
790
        out_baseimg = out_baseimg_param->value.s;
791
    }
792

    
793
    /* Check if compression is supported */
794
    if (compress) {
795
        QEMUOptionParameter *encryption =
796
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
797
        QEMUOptionParameter *preallocation =
798
            get_option_parameter(param, BLOCK_OPT_PREALLOC);
799

    
800
        if (!drv->bdrv_write_compressed) {
801
            error_report("Compression not supported for this file format");
802
            ret = -1;
803
            goto out;
804
        }
805

    
806
        if (encryption && encryption->value.n) {
807
            error_report("Compression and encryption not supported at "
808
                         "the same time");
809
            ret = -1;
810
            goto out;
811
        }
812

    
813
        if (preallocation && preallocation->value.s
814
            && strcmp(preallocation->value.s, "off"))
815
        {
816
            error_report("Compression and preallocation not supported at "
817
                         "the same time");
818
            ret = -1;
819
            goto out;
820
        }
821
    }
822

    
823
    /* Create the new image */
824
    ret = bdrv_create(drv, out_filename, param);
825
    if (ret < 0) {
826
        if (ret == -ENOTSUP) {
827
            error_report("Formatting not supported for file format '%s'",
828
                         out_fmt);
829
        } else if (ret == -EFBIG) {
830
            error_report("The image size is too large for file format '%s'",
831
                         out_fmt);
832
        } else {
833
            error_report("%s: error while converting %s: %s",
834
                         out_filename, out_fmt, strerror(-ret));
835
        }
836
        goto out;
837
    }
838

    
839
    flags = BDRV_O_RDWR;
840
    ret = bdrv_parse_cache_flags(cache, &flags);
841
    if (ret < 0) {
842
        error_report("Invalid cache option: %s", cache);
843
        return -1;
844
    }
845

    
846
    out_bs = bdrv_new_open(out_filename, out_fmt, flags);
847
    if (!out_bs) {
848
        ret = -1;
849
        goto out;
850
    }
851

    
852
    bs_i = 0;
853
    bs_offset = 0;
854
    bdrv_get_geometry(bs[0], &bs_sectors);
855
    buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
856

    
857
    if (compress) {
858
        ret = bdrv_get_info(out_bs, &bdi);
859
        if (ret < 0) {
860
            error_report("could not get block driver info");
861
            goto out;
862
        }
863
        cluster_size = bdi.cluster_size;
864
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
865
            error_report("invalid cluster size");
866
            ret = -1;
867
            goto out;
868
        }
869
        cluster_sectors = cluster_size >> 9;
870
        sector_num = 0;
871

    
872
        nb_sectors = total_sectors;
873
        local_progress = (float)100 /
874
            (nb_sectors / MIN(nb_sectors, cluster_sectors));
875

    
876
        for(;;) {
877
            int64_t bs_num;
878
            int remainder;
879
            uint8_t *buf2;
880

    
881
            nb_sectors = total_sectors - sector_num;
882
            if (nb_sectors <= 0)
883
                break;
884
            if (nb_sectors >= cluster_sectors)
885
                n = cluster_sectors;
886
            else
887
                n = nb_sectors;
888

    
889
            bs_num = sector_num - bs_offset;
890
            assert (bs_num >= 0);
891
            remainder = n;
892
            buf2 = buf;
893
            while (remainder > 0) {
894
                int nlow;
895
                while (bs_num == bs_sectors) {
896
                    bs_i++;
897
                    assert (bs_i < bs_n);
898
                    bs_offset += bs_sectors;
899
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
900
                    bs_num = 0;
901
                    /* printf("changing part: sector_num=%" PRId64 ", "
902
                       "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
903
                       "\n", sector_num, bs_i, bs_offset, bs_sectors); */
904
                }
905
                assert (bs_num < bs_sectors);
906

    
907
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
908

    
909
                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
910
                if (ret < 0) {
911
                    error_report("error while reading sector %" PRId64 ": %s",
912
                                 bs_num, strerror(-ret));
913
                    goto out;
914
                }
915

    
916
                buf2 += nlow * 512;
917
                bs_num += nlow;
918

    
919
                remainder -= nlow;
920
            }
921
            assert (remainder == 0);
922

    
923
            if (n < cluster_sectors) {
924
                memset(buf + n * 512, 0, cluster_size - n * 512);
925
            }
926
            if (!buffer_is_zero(buf, cluster_size)) {
927
                ret = bdrv_write_compressed(out_bs, sector_num, buf,
928
                                            cluster_sectors);
929
                if (ret != 0) {
930
                    error_report("error while compressing sector %" PRId64
931
                                 ": %s", sector_num, strerror(-ret));
932
                    goto out;
933
                }
934
            }
935
            sector_num += n;
936
            qemu_progress_print(local_progress, 100);
937
        }
938
        /* signal EOF to align */
939
        bdrv_write_compressed(out_bs, 0, NULL, 0);
940
    } else {
941
        int has_zero_init = bdrv_has_zero_init(out_bs);
942

    
943
        sector_num = 0; // total number of sectors converted so far
944
        nb_sectors = total_sectors - sector_num;
945
        local_progress = (float)100 /
946
            (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
947

    
948
        for(;;) {
949
            nb_sectors = total_sectors - sector_num;
950
            if (nb_sectors <= 0) {
951
                break;
952
            }
953
            if (nb_sectors >= (IO_BUF_SIZE / 512)) {
954
                n = (IO_BUF_SIZE / 512);
955
            } else {
956
                n = nb_sectors;
957
            }
958

    
959
            while (sector_num - bs_offset >= bs_sectors) {
960
                bs_i ++;
961
                assert (bs_i < bs_n);
962
                bs_offset += bs_sectors;
963
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
964
                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
965
                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
966
                   sector_num, bs_i, bs_offset, bs_sectors); */
967
            }
968

    
969
            if (n > bs_offset + bs_sectors - sector_num) {
970
                n = bs_offset + bs_sectors - sector_num;
971
            }
972

    
973
            if (has_zero_init) {
974
                /* If the output image is being created as a copy on write image,
975
                   assume that sectors which are unallocated in the input image
976
                   are present in both the output's and input's base images (no
977
                   need to copy them). */
978
                if (out_baseimg) {
979
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
980
                                           n, &n1)) {
981
                        sector_num += n1;
982
                        continue;
983
                    }
984
                    /* The next 'n1' sectors are allocated in the input image. Copy
985
                       only those as they may be followed by unallocated sectors. */
986
                    n = n1;
987
                }
988
            } else {
989
                n1 = n;
990
            }
991

    
992
            ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
993
            if (ret < 0) {
994
                error_report("error while reading sector %" PRId64 ": %s",
995
                             sector_num - bs_offset, strerror(-ret));
996
                goto out;
997
            }
998
            /* NOTE: at the same time we convert, we do not write zero
999
               sectors to have a chance to compress the image. Ideally, we
1000
               should add a specific call to have the info to go faster */
1001
            buf1 = buf;
1002
            while (n > 0) {
1003
                /* If the output image is being created as a copy on write image,
1004
                   copy all sectors even the ones containing only NUL bytes,
1005
                   because they may differ from the sectors in the base image.
1006

1007
                   If the output is to a host device, we also write out
1008
                   sectors that are entirely 0, since whatever data was
1009
                   already there is garbage, not 0s. */
1010
                if (!has_zero_init || out_baseimg ||
1011
                    is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1012
                    ret = bdrv_write(out_bs, sector_num, buf1, n1);
1013
                    if (ret < 0) {
1014
                        error_report("error while writing sector %" PRId64
1015
                                     ": %s", sector_num, strerror(-ret));
1016
                        goto out;
1017
                    }
1018
                }
1019
                sector_num += n1;
1020
                n -= n1;
1021
                buf1 += n1 * 512;
1022
            }
1023
            qemu_progress_print(local_progress, 100);
1024
        }
1025
    }
1026
out:
1027
    qemu_progress_end();
1028
    free_option_parameters(create_options);
1029
    free_option_parameters(param);
1030
    qemu_vfree(buf);
1031
    if (out_bs) {
1032
        bdrv_delete(out_bs);
1033
    }
1034
    if (bs) {
1035
        for (bs_i = 0; bs_i < bs_n; bs_i++) {
1036
            if (bs[bs_i]) {
1037
                bdrv_delete(bs[bs_i]);
1038
            }
1039
        }
1040
        g_free(bs);
1041
    }
1042
    if (ret) {
1043
        return 1;
1044
    }
1045
    return 0;
1046
}
1047

    
1048

    
1049
static void dump_snapshots(BlockDriverState *bs)
1050
{
1051
    QEMUSnapshotInfo *sn_tab, *sn;
1052
    int nb_sns, i;
1053
    char buf[256];
1054

    
1055
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1056
    if (nb_sns <= 0)
1057
        return;
1058
    printf("Snapshot list:\n");
1059
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1060
    for(i = 0; i < nb_sns; i++) {
1061
        sn = &sn_tab[i];
1062
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1063
    }
1064
    g_free(sn_tab);
1065
}
1066

    
1067
static int img_info(int argc, char **argv)
1068
{
1069
    int c;
1070
    const char *filename, *fmt;
1071
    BlockDriverState *bs;
1072
    char fmt_name[128], size_buf[128], dsize_buf[128];
1073
    uint64_t total_sectors;
1074
    int64_t allocated_size;
1075
    char backing_filename[1024];
1076
    char backing_filename2[1024];
1077
    BlockDriverInfo bdi;
1078

    
1079
    fmt = NULL;
1080
    for(;;) {
1081
        c = getopt(argc, argv, "f:h");
1082
        if (c == -1) {
1083
            break;
1084
        }
1085
        switch(c) {
1086
        case '?':
1087
        case 'h':
1088
            help();
1089
            break;
1090
        case 'f':
1091
            fmt = optarg;
1092
            break;
1093
        }
1094
    }
1095
    if (optind >= argc) {
1096
        help();
1097
    }
1098
    filename = argv[optind++];
1099

    
1100
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1101
    if (!bs) {
1102
        return 1;
1103
    }
1104
    bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1105
    bdrv_get_geometry(bs, &total_sectors);
1106
    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1107
    allocated_size = bdrv_get_allocated_file_size(bs);
1108
    if (allocated_size < 0) {
1109
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1110
    } else {
1111
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1112
                                allocated_size);
1113
    }
1114
    printf("image: %s\n"
1115
           "file format: %s\n"
1116
           "virtual size: %s (%" PRId64 " bytes)\n"
1117
           "disk size: %s\n",
1118
           filename, fmt_name, size_buf,
1119
           (total_sectors * 512),
1120
           dsize_buf);
1121
    if (bdrv_is_encrypted(bs)) {
1122
        printf("encrypted: yes\n");
1123
    }
1124
    if (bdrv_get_info(bs, &bdi) >= 0) {
1125
        if (bdi.cluster_size != 0) {
1126
            printf("cluster_size: %d\n", bdi.cluster_size);
1127
        }
1128
    }
1129
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1130
    if (backing_filename[0] != '\0') {
1131
        path_combine(backing_filename2, sizeof(backing_filename2),
1132
                     filename, backing_filename);
1133
        printf("backing file: %s (actual path: %s)\n",
1134
               backing_filename,
1135
               backing_filename2);
1136
    }
1137
    dump_snapshots(bs);
1138
    bdrv_delete(bs);
1139
    return 0;
1140
}
1141

    
1142
#define SNAPSHOT_LIST   1
1143
#define SNAPSHOT_CREATE 2
1144
#define SNAPSHOT_APPLY  3
1145
#define SNAPSHOT_DELETE 4
1146

    
1147
static int img_snapshot(int argc, char **argv)
1148
{
1149
    BlockDriverState *bs;
1150
    QEMUSnapshotInfo sn;
1151
    char *filename, *snapshot_name = NULL;
1152
    int c, ret = 0, bdrv_oflags;
1153
    int action = 0;
1154
    qemu_timeval tv;
1155

    
1156
    bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1157
    /* Parse commandline parameters */
1158
    for(;;) {
1159
        c = getopt(argc, argv, "la:c:d:h");
1160
        if (c == -1) {
1161
            break;
1162
        }
1163
        switch(c) {
1164
        case '?':
1165
        case 'h':
1166
            help();
1167
            return 0;
1168
        case 'l':
1169
            if (action) {
1170
                help();
1171
                return 0;
1172
            }
1173
            action = SNAPSHOT_LIST;
1174
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1175
            break;
1176
        case 'a':
1177
            if (action) {
1178
                help();
1179
                return 0;
1180
            }
1181
            action = SNAPSHOT_APPLY;
1182
            snapshot_name = optarg;
1183
            break;
1184
        case 'c':
1185
            if (action) {
1186
                help();
1187
                return 0;
1188
            }
1189
            action = SNAPSHOT_CREATE;
1190
            snapshot_name = optarg;
1191
            break;
1192
        case 'd':
1193
            if (action) {
1194
                help();
1195
                return 0;
1196
            }
1197
            action = SNAPSHOT_DELETE;
1198
            snapshot_name = optarg;
1199
            break;
1200
        }
1201
    }
1202

    
1203
    if (optind >= argc) {
1204
        help();
1205
    }
1206
    filename = argv[optind++];
1207

    
1208
    /* Open the image */
1209
    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1210
    if (!bs) {
1211
        return 1;
1212
    }
1213

    
1214
    /* Perform the requested action */
1215
    switch(action) {
1216
    case SNAPSHOT_LIST:
1217
        dump_snapshots(bs);
1218
        break;
1219

    
1220
    case SNAPSHOT_CREATE:
1221
        memset(&sn, 0, sizeof(sn));
1222
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1223

    
1224
        qemu_gettimeofday(&tv);
1225
        sn.date_sec = tv.tv_sec;
1226
        sn.date_nsec = tv.tv_usec * 1000;
1227

    
1228
        ret = bdrv_snapshot_create(bs, &sn);
1229
        if (ret) {
1230
            error_report("Could not create snapshot '%s': %d (%s)",
1231
                snapshot_name, ret, strerror(-ret));
1232
        }
1233
        break;
1234

    
1235
    case SNAPSHOT_APPLY:
1236
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1237
        if (ret) {
1238
            error_report("Could not apply snapshot '%s': %d (%s)",
1239
                snapshot_name, ret, strerror(-ret));
1240
        }
1241
        break;
1242

    
1243
    case SNAPSHOT_DELETE:
1244
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1245
        if (ret) {
1246
            error_report("Could not delete snapshot '%s': %d (%s)",
1247
                snapshot_name, ret, strerror(-ret));
1248
        }
1249
        break;
1250
    }
1251

    
1252
    /* Cleanup */
1253
    bdrv_delete(bs);
1254
    if (ret) {
1255
        return 1;
1256
    }
1257
    return 0;
1258
}
1259

    
1260
static int img_rebase(int argc, char **argv)
1261
{
1262
    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1263
    BlockDriver *old_backing_drv, *new_backing_drv;
1264
    char *filename;
1265
    const char *fmt, *cache, *out_basefmt, *out_baseimg;
1266
    int c, flags, ret;
1267
    int unsafe = 0;
1268
    int progress = 0;
1269

    
1270
    /* Parse commandline parameters */
1271
    fmt = NULL;
1272
    cache = BDRV_DEFAULT_CACHE;
1273
    out_baseimg = NULL;
1274
    out_basefmt = NULL;
1275
    for(;;) {
1276
        c = getopt(argc, argv, "uhf:F:b:pt:");
1277
        if (c == -1) {
1278
            break;
1279
        }
1280
        switch(c) {
1281
        case '?':
1282
        case 'h':
1283
            help();
1284
            return 0;
1285
        case 'f':
1286
            fmt = optarg;
1287
            break;
1288
        case 'F':
1289
            out_basefmt = optarg;
1290
            break;
1291
        case 'b':
1292
            out_baseimg = optarg;
1293
            break;
1294
        case 'u':
1295
            unsafe = 1;
1296
            break;
1297
        case 'p':
1298
            progress = 1;
1299
            break;
1300
        case 't':
1301
            cache = optarg;
1302
            break;
1303
        }
1304
    }
1305

    
1306
    if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1307
        help();
1308
    }
1309
    filename = argv[optind++];
1310

    
1311
    qemu_progress_init(progress, 2.0);
1312
    qemu_progress_print(0, 100);
1313

    
1314
    flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1315
    ret = bdrv_parse_cache_flags(cache, &flags);
1316
    if (ret < 0) {
1317
        error_report("Invalid cache option: %s", cache);
1318
        return -1;
1319
    }
1320

    
1321
    /*
1322
     * Open the images.
1323
     *
1324
     * Ignore the old backing file for unsafe rebase in case we want to correct
1325
     * the reference to a renamed or moved backing file.
1326
     */
1327
    bs = bdrv_new_open(filename, fmt, flags);
1328
    if (!bs) {
1329
        return 1;
1330
    }
1331

    
1332
    /* Find the right drivers for the backing files */
1333
    old_backing_drv = NULL;
1334
    new_backing_drv = NULL;
1335

    
1336
    if (!unsafe && bs->backing_format[0] != '\0') {
1337
        old_backing_drv = bdrv_find_format(bs->backing_format);
1338
        if (old_backing_drv == NULL) {
1339
            error_report("Invalid format name: '%s'", bs->backing_format);
1340
            ret = -1;
1341
            goto out;
1342
        }
1343
    }
1344

    
1345
    if (out_basefmt != NULL) {
1346
        new_backing_drv = bdrv_find_format(out_basefmt);
1347
        if (new_backing_drv == NULL) {
1348
            error_report("Invalid format name: '%s'", out_basefmt);
1349
            ret = -1;
1350
            goto out;
1351
        }
1352
    }
1353

    
1354
    /* For safe rebasing we need to compare old and new backing file */
1355
    if (unsafe) {
1356
        /* Make the compiler happy */
1357
        bs_old_backing = NULL;
1358
        bs_new_backing = NULL;
1359
    } else {
1360
        char backing_name[1024];
1361

    
1362
        bs_old_backing = bdrv_new("old_backing");
1363
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1364
        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1365
                        old_backing_drv);
1366
        if (ret) {
1367
            error_report("Could not open old backing file '%s'", backing_name);
1368
            goto out;
1369
        }
1370

    
1371
        bs_new_backing = bdrv_new("new_backing");
1372
        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1373
                        new_backing_drv);
1374
        if (ret) {
1375
            error_report("Could not open new backing file '%s'", out_baseimg);
1376
            goto out;
1377
        }
1378
    }
1379

    
1380
    /*
1381
     * Check each unallocated cluster in the COW file. If it is unallocated,
1382
     * accesses go to the backing file. We must therefore compare this cluster
1383
     * in the old and new backing file, and if they differ we need to copy it
1384
     * from the old backing file into the COW file.
1385
     *
1386
     * If qemu-img crashes during this step, no harm is done. The content of
1387
     * the image is the same as the original one at any time.
1388
     */
1389
    if (!unsafe) {
1390
        uint64_t num_sectors;
1391
        uint64_t old_backing_num_sectors;
1392
        uint64_t new_backing_num_sectors;
1393
        uint64_t sector;
1394
        int n;
1395
        uint8_t * buf_old;
1396
        uint8_t * buf_new;
1397
        float local_progress;
1398

    
1399
        buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1400
        buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1401

    
1402
        bdrv_get_geometry(bs, &num_sectors);
1403
        bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1404
        bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1405

    
1406
        local_progress = (float)100 /
1407
            (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1408
        for (sector = 0; sector < num_sectors; sector += n) {
1409

    
1410
            /* How many sectors can we handle with the next read? */
1411
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1412
                n = (IO_BUF_SIZE / 512);
1413
            } else {
1414
                n = num_sectors - sector;
1415
            }
1416

    
1417
            /* If the cluster is allocated, we don't need to take action */
1418
            ret = bdrv_is_allocated(bs, sector, n, &n);
1419
            if (ret) {
1420
                continue;
1421
            }
1422

    
1423
            /*
1424
             * Read old and new backing file and take into consideration that
1425
             * backing files may be smaller than the COW image.
1426
             */
1427
            if (sector >= old_backing_num_sectors) {
1428
                memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1429
            } else {
1430
                if (sector + n > old_backing_num_sectors) {
1431
                    n = old_backing_num_sectors - sector;
1432
                }
1433

    
1434
                ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1435
                if (ret < 0) {
1436
                    error_report("error while reading from old backing file");
1437
                    goto out;
1438
                }
1439
            }
1440

    
1441
            if (sector >= new_backing_num_sectors) {
1442
                memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1443
            } else {
1444
                if (sector + n > new_backing_num_sectors) {
1445
                    n = new_backing_num_sectors - sector;
1446
                }
1447

    
1448
                ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1449
                if (ret < 0) {
1450
                    error_report("error while reading from new backing file");
1451
                    goto out;
1452
                }
1453
            }
1454

    
1455
            /* If they differ, we need to write to the COW file */
1456
            uint64_t written = 0;
1457

    
1458
            while (written < n) {
1459
                int pnum;
1460

    
1461
                if (compare_sectors(buf_old + written * 512,
1462
                    buf_new + written * 512, n - written, &pnum))
1463
                {
1464
                    ret = bdrv_write(bs, sector + written,
1465
                        buf_old + written * 512, pnum);
1466
                    if (ret < 0) {
1467
                        error_report("Error while writing to COW image: %s",
1468
                            strerror(-ret));
1469
                        goto out;
1470
                    }
1471
                }
1472

    
1473
                written += pnum;
1474
            }
1475
            qemu_progress_print(local_progress, 100);
1476
        }
1477

    
1478
        qemu_vfree(buf_old);
1479
        qemu_vfree(buf_new);
1480
    }
1481

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

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

    
1515
    bdrv_delete(bs);
1516
    if (ret) {
1517
        return 1;
1518
    }
1519
    return 0;
1520
}
1521

    
1522
static int img_resize(int argc, char **argv)
1523
{
1524
    int c, ret, relative;
1525
    const char *filename, *fmt, *size;
1526
    int64_t n, total_size;
1527
    BlockDriverState *bs = NULL;
1528
    QEMUOptionParameter *param;
1529
    QEMUOptionParameter resize_options[] = {
1530
        {
1531
            .name = BLOCK_OPT_SIZE,
1532
            .type = OPT_SIZE,
1533
            .help = "Virtual disk size"
1534
        },
1535
        { NULL }
1536
    };
1537

    
1538
    /* Remove size from argv manually so that negative numbers are not treated
1539
     * as options by getopt. */
1540
    if (argc < 3) {
1541
        help();
1542
        return 1;
1543
    }
1544

    
1545
    size = argv[--argc];
1546

    
1547
    /* Parse getopt arguments */
1548
    fmt = NULL;
1549
    for(;;) {
1550
        c = getopt(argc, argv, "f:h");
1551
        if (c == -1) {
1552
            break;
1553
        }
1554
        switch(c) {
1555
        case '?':
1556
        case 'h':
1557
            help();
1558
            break;
1559
        case 'f':
1560
            fmt = optarg;
1561
            break;
1562
        }
1563
    }
1564
    if (optind >= argc) {
1565
        help();
1566
    }
1567
    filename = argv[optind++];
1568

    
1569
    /* Choose grow, shrink, or absolute resize mode */
1570
    switch (size[0]) {
1571
    case '+':
1572
        relative = 1;
1573
        size++;
1574
        break;
1575
    case '-':
1576
        relative = -1;
1577
        size++;
1578
        break;
1579
    default:
1580
        relative = 0;
1581
        break;
1582
    }
1583

    
1584
    /* Parse size */
1585
    param = parse_option_parameters("", resize_options, NULL);
1586
    if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1587
        /* Error message already printed when size parsing fails */
1588
        ret = -1;
1589
        goto out;
1590
    }
1591
    n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1592
    free_option_parameters(param);
1593

    
1594
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1595
    if (!bs) {
1596
        ret = -1;
1597
        goto out;
1598
    }
1599

    
1600
    if (relative) {
1601
        total_size = bdrv_getlength(bs) + n * relative;
1602
    } else {
1603
        total_size = n;
1604
    }
1605
    if (total_size <= 0) {
1606
        error_report("New image size must be positive");
1607
        ret = -1;
1608
        goto out;
1609
    }
1610

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

    
1636
static const img_cmd_t img_cmds[] = {
1637
#define DEF(option, callback, arg_string)        \
1638
    { option, callback },
1639
#include "qemu-img-cmds.h"
1640
#undef DEF
1641
#undef GEN_DOCS
1642
    { NULL, NULL, },
1643
};
1644

    
1645
int main(int argc, char **argv)
1646
{
1647
    const img_cmd_t *cmd;
1648
    const char *cmdname;
1649

    
1650
    error_set_progname(argv[0]);
1651

    
1652
    bdrv_init();
1653
    if (argc < 2)
1654
        help();
1655
    cmdname = argv[1];
1656
    argc--; argv++;
1657

    
1658
    /* find the command */
1659
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1660
        if (!strcmp(cmdname, cmd->name)) {
1661
            return cmd->handler(argc, argv);
1662
        }
1663
    }
1664

    
1665
    /* not found */
1666
    help();
1667
    return 0;
1668
}