Statistics
| Branch: | Revision:

root / qemu-img.c @ c054b3fd

History | View | Annotate | Download (52.6 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 "qapi-visit.h"
25
#include "qapi/qmp-output-visitor.h"
26
#include "qjson.h"
27
#include "qemu-common.h"
28
#include "qemu-option.h"
29
#include "qemu-error.h"
30
#include "osdep.h"
31
#include "sysemu.h"
32
#include "block_int.h"
33
#include <getopt.h>
34
#include <stdio.h>
35

    
36
#ifdef _WIN32
37
#include <windows.h>
38
#endif
39

    
40
typedef struct img_cmd_t {
41
    const char *name;
42
    int (*handler)(int argc, char **argv);
43
} img_cmd_t;
44

    
45
/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
46
#define BDRV_O_FLAGS BDRV_O_CACHE_WB
47
#define BDRV_DEFAULT_CACHE "writeback"
48

    
49
static void format_print(void *opaque, const char *name)
50
{
51
    printf(" %s", name);
52
}
53

    
54
/* Please keep in synch with qemu-img.texi */
55
static void help(void)
56
{
57
    const char *help_msg =
58
           "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
59
           "usage: qemu-img command [command options]\n"
60
           "QEMU disk image utility\n"
61
           "\n"
62
           "Command syntax:\n"
63
#define DEF(option, callback, arg_string)        \
64
           "  " arg_string "\n"
65
#include "qemu-img-cmds.h"
66
#undef DEF
67
#undef GEN_DOCS
68
           "\n"
69
           "Command parameters:\n"
70
           "  'filename' is a disk image filename\n"
71
           "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
72
           "  'cache' is the cache mode used to write the output disk image, the valid\n"
73
           "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
74
           "    'directsync' and 'unsafe' (default for convert)\n"
75
           "  'size' is the disk image size in bytes. Optional suffixes\n"
76
           "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
77
           "    and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
78
           "  'output_filename' is the destination disk image filename\n"
79
           "  'output_fmt' is the destination format\n"
80
           "  'options' is a comma separated list of format specific options in a\n"
81
           "    name=value format. Use -o ? for an overview of the options supported by the\n"
82
           "    used format\n"
83
           "  '-c' indicates that target image must be compressed (qcow format only)\n"
84
           "  '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
85
           "       match exactly. The image doesn't need a working backing file before\n"
86
           "       rebasing in this case (useful for renaming the backing file)\n"
87
           "  '-h' with or without a command shows this help and lists the supported formats\n"
88
           "  '-p' show progress of command (only certain commands)\n"
89
           "  '-S' indicates the consecutive number of bytes that must contain only zeros\n"
90
           "       for qemu-img to create a sparse image during conversion\n"
91
           "  '--output' takes the format in which the output must be done (human or json)\n"
92
           "\n"
93
           "Parameters to check subcommand:\n"
94
           "  '-r' tries to repair any inconsistencies that are found during the check.\n"
95
           "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
96
           "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
97
           "       hiding corruption that has already occured.\n"
98
           "\n"
99
           "Parameters to snapshot subcommand:\n"
100
           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
101
           "  '-a' applies a snapshot (revert disk to saved state)\n"
102
           "  '-c' creates a snapshot\n"
103
           "  '-d' deletes a snapshot\n"
104
           "  '-l' lists all snapshots in the given image\n";
105

    
106
    printf("%s\nSupported formats:", help_msg);
107
    bdrv_iterate_format(format_print, NULL);
108
    printf("\n");
109
    exit(1);
110
}
111

    
112
#if defined(WIN32)
113
/* XXX: put correct support for win32 */
114
static int read_password(char *buf, int buf_size)
115
{
116
    int c, i;
117
    printf("Password: ");
118
    fflush(stdout);
119
    i = 0;
120
    for(;;) {
121
        c = getchar();
122
        if (c == '\n')
123
            break;
124
        if (i < (buf_size - 1))
125
            buf[i++] = c;
126
    }
127
    buf[i] = '\0';
128
    return 0;
129
}
130

    
131
#else
132

    
133
#include <termios.h>
134

    
135
static struct termios oldtty;
136

    
137
static void term_exit(void)
138
{
139
    tcsetattr (0, TCSANOW, &oldtty);
140
}
141

    
142
static void term_init(void)
143
{
144
    struct termios tty;
145

    
146
    tcgetattr (0, &tty);
147
    oldtty = tty;
148

    
149
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
150
                          |INLCR|IGNCR|ICRNL|IXON);
151
    tty.c_oflag |= OPOST;
152
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
153
    tty.c_cflag &= ~(CSIZE|PARENB);
154
    tty.c_cflag |= CS8;
155
    tty.c_cc[VMIN] = 1;
156
    tty.c_cc[VTIME] = 0;
157

    
158
    tcsetattr (0, TCSANOW, &tty);
159

    
160
    atexit(term_exit);
161
}
162

    
163
static int read_password(char *buf, int buf_size)
164
{
165
    uint8_t ch;
166
    int i, ret;
167

    
168
    printf("password: ");
169
    fflush(stdout);
170
    term_init();
171
    i = 0;
172
    for(;;) {
173
        ret = read(0, &ch, 1);
174
        if (ret == -1) {
175
            if (errno == EAGAIN || errno == EINTR) {
176
                continue;
177
            } else {
178
                ret = -1;
179
                break;
180
            }
181
        } else if (ret == 0) {
182
            ret = -1;
183
            break;
184
        } else {
185
            if (ch == '\r') {
186
                ret = 0;
187
                break;
188
            }
189
            if (i < (buf_size - 1))
190
                buf[i++] = ch;
191
        }
192
    }
193
    term_exit();
194
    buf[i] = '\0';
195
    printf("\n");
196
    return ret;
197
}
198
#endif
199

    
200
static int print_block_option_help(const char *filename, const char *fmt)
201
{
202
    BlockDriver *drv, *proto_drv;
203
    QEMUOptionParameter *create_options = NULL;
204

    
205
    /* Find driver and parse its options */
206
    drv = bdrv_find_format(fmt);
207
    if (!drv) {
208
        error_report("Unknown file format '%s'", fmt);
209
        return 1;
210
    }
211

    
212
    proto_drv = bdrv_find_protocol(filename);
213
    if (!proto_drv) {
214
        error_report("Unknown protocol '%s'", filename);
215
        return 1;
216
    }
217

    
218
    create_options = append_option_parameters(create_options,
219
                                              drv->create_options);
220
    create_options = append_option_parameters(create_options,
221
                                              proto_drv->create_options);
222
    print_option_help(create_options);
223
    free_option_parameters(create_options);
224
    return 0;
225
}
226

    
227
static BlockDriverState *bdrv_new_open(const char *filename,
228
                                       const char *fmt,
229
                                       int flags)
230
{
231
    BlockDriverState *bs;
232
    BlockDriver *drv;
233
    char password[256];
234
    int ret;
235

    
236
    bs = bdrv_new("image");
237

    
238
    if (fmt) {
239
        drv = bdrv_find_format(fmt);
240
        if (!drv) {
241
            error_report("Unknown file format '%s'", fmt);
242
            goto fail;
243
        }
244
    } else {
245
        drv = NULL;
246
    }
247

    
248
    ret = bdrv_open(bs, filename, flags, drv);
249
    if (ret < 0) {
250
        error_report("Could not open '%s': %s", filename, strerror(-ret));
251
        goto fail;
252
    }
253

    
254
    if (bdrv_is_encrypted(bs)) {
255
        printf("Disk image '%s' is encrypted.\n", filename);
256
        if (read_password(password, sizeof(password)) < 0) {
257
            error_report("No password given");
258
            goto fail;
259
        }
260
        if (bdrv_set_key(bs, password) < 0) {
261
            error_report("invalid password");
262
            goto fail;
263
        }
264
    }
265
    return bs;
266
fail:
267
    if (bs) {
268
        bdrv_delete(bs);
269
    }
270
    return NULL;
271
}
272

    
273
static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
274
                                 const char *base_filename,
275
                                 const char *base_fmt)
276
{
277
    if (base_filename) {
278
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
279
            error_report("Backing file not supported for file format '%s'",
280
                         fmt);
281
            return -1;
282
        }
283
    }
284
    if (base_fmt) {
285
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
286
            error_report("Backing file format not supported for file "
287
                         "format '%s'", fmt);
288
            return -1;
289
        }
290
    }
291
    return 0;
292
}
293

    
294
static int img_create(int argc, char **argv)
295
{
296
    int c, ret = 0;
297
    uint64_t img_size = -1;
298
    const char *fmt = "raw";
299
    const char *base_fmt = NULL;
300
    const char *filename;
301
    const char *base_filename = NULL;
302
    char *options = NULL;
303

    
304
    for(;;) {
305
        c = getopt(argc, argv, "F:b:f:he6o:");
306
        if (c == -1) {
307
            break;
308
        }
309
        switch(c) {
310
        case '?':
311
        case 'h':
312
            help();
313
            break;
314
        case 'F':
315
            base_fmt = optarg;
316
            break;
317
        case 'b':
318
            base_filename = optarg;
319
            break;
320
        case 'f':
321
            fmt = optarg;
322
            break;
323
        case 'e':
324
            error_report("option -e is deprecated, please use \'-o "
325
                  "encryption\' instead!");
326
            return 1;
327
        case '6':
328
            error_report("option -6 is deprecated, please use \'-o "
329
                  "compat6\' instead!");
330
            return 1;
331
        case 'o':
332
            options = optarg;
333
            break;
334
        }
335
    }
336

    
337
    /* Get the filename */
338
    if (optind >= argc) {
339
        help();
340
    }
341
    filename = argv[optind++];
342

    
343
    /* Get image size, if specified */
344
    if (optind < argc) {
345
        int64_t sval;
346
        char *end;
347
        sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
348
        if (sval < 0 || *end) {
349
            error_report("Invalid image size specified! You may use k, M, G or "
350
                  "T suffixes for ");
351
            error_report("kilobytes, megabytes, gigabytes and terabytes.");
352
            ret = -1;
353
            goto out;
354
        }
355
        img_size = (uint64_t)sval;
356
    }
357

    
358
    if (options && is_help_option(options)) {
359
        ret = print_block_option_help(filename, fmt);
360
        goto out;
361
    }
362

    
363
    ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
364
                          options, img_size, BDRV_O_FLAGS);
365
out:
366
    if (ret) {
367
        return 1;
368
    }
369
    return 0;
370
}
371

    
372
/*
373
 * Checks an image for consistency. Exit codes:
374
 *
375
 * 0 - Check completed, image is good
376
 * 1 - Check not completed because of internal errors
377
 * 2 - Check completed, image is corrupted
378
 * 3 - Check completed, image has leaked clusters, but is good otherwise
379
 */
380
static int img_check(int argc, char **argv)
381
{
382
    int c, ret;
383
    const char *filename, *fmt;
384
    BlockDriverState *bs;
385
    BdrvCheckResult result;
386
    int fix = 0;
387
    int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
388

    
389
    fmt = NULL;
390
    for(;;) {
391
        c = getopt(argc, argv, "f:hr:");
392
        if (c == -1) {
393
            break;
394
        }
395
        switch(c) {
396
        case '?':
397
        case 'h':
398
            help();
399
            break;
400
        case 'f':
401
            fmt = optarg;
402
            break;
403
        case 'r':
404
            flags |= BDRV_O_RDWR;
405

    
406
            if (!strcmp(optarg, "leaks")) {
407
                fix = BDRV_FIX_LEAKS;
408
            } else if (!strcmp(optarg, "all")) {
409
                fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
410
            } else {
411
                help();
412
            }
413
            break;
414
        }
415
    }
416
    if (optind >= argc) {
417
        help();
418
    }
419
    filename = argv[optind++];
420

    
421
    bs = bdrv_new_open(filename, fmt, flags);
422
    if (!bs) {
423
        return 1;
424
    }
425
    ret = bdrv_check(bs, &result, fix);
426

    
427
    if (ret == -ENOTSUP) {
428
        error_report("This image format does not support checks");
429
        bdrv_delete(bs);
430
        return 1;
431
    }
432

    
433
    if (result.corruptions_fixed || result.leaks_fixed) {
434
        printf("The following inconsistencies were found and repaired:\n\n"
435
               "    %d leaked clusters\n"
436
               "    %d corruptions\n\n"
437
               "Double checking the fixed image now...\n",
438
               result.leaks_fixed,
439
               result.corruptions_fixed);
440
        ret = bdrv_check(bs, &result, 0);
441
    }
442

    
443
    if (!(result.corruptions || result.leaks || result.check_errors)) {
444
        printf("No errors were found on the image.\n");
445
    } else {
446
        if (result.corruptions) {
447
            printf("\n%d errors were found on the image.\n"
448
                "Data may be corrupted, or further writes to the image "
449
                "may corrupt it.\n",
450
                result.corruptions);
451
        }
452

    
453
        if (result.leaks) {
454
            printf("\n%d leaked clusters were found on the image.\n"
455
                "This means waste of disk space, but no harm to data.\n",
456
                result.leaks);
457
        }
458

    
459
        if (result.check_errors) {
460
            printf("\n%d internal errors have occurred during the check.\n",
461
                result.check_errors);
462
        }
463
    }
464

    
465
    if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
466
        printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
467
        result.bfi.allocated_clusters, result.bfi.total_clusters,
468
        result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
469
        result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
470
    }
471

    
472
    bdrv_delete(bs);
473

    
474
    if (ret < 0 || result.check_errors) {
475
        printf("\nAn error has occurred during the check: %s\n"
476
            "The check is not complete and may have missed error.\n",
477
            strerror(-ret));
478
        return 1;
479
    }
480

    
481
    if (result.corruptions) {
482
        return 2;
483
    } else if (result.leaks) {
484
        return 3;
485
    } else {
486
        return 0;
487
    }
488
}
489

    
490
static int img_commit(int argc, char **argv)
491
{
492
    int c, ret, flags;
493
    const char *filename, *fmt, *cache;
494
    BlockDriverState *bs;
495

    
496
    fmt = NULL;
497
    cache = BDRV_DEFAULT_CACHE;
498
    for(;;) {
499
        c = getopt(argc, argv, "f:ht:");
500
        if (c == -1) {
501
            break;
502
        }
503
        switch(c) {
504
        case '?':
505
        case 'h':
506
            help();
507
            break;
508
        case 'f':
509
            fmt = optarg;
510
            break;
511
        case 't':
512
            cache = optarg;
513
            break;
514
        }
515
    }
516
    if (optind >= argc) {
517
        help();
518
    }
519
    filename = argv[optind++];
520

    
521
    flags = BDRV_O_RDWR;
522
    ret = bdrv_parse_cache_flags(cache, &flags);
523
    if (ret < 0) {
524
        error_report("Invalid cache option: %s", cache);
525
        return -1;
526
    }
527

    
528
    bs = bdrv_new_open(filename, fmt, flags);
529
    if (!bs) {
530
        return 1;
531
    }
532
    ret = bdrv_commit(bs);
533
    switch(ret) {
534
    case 0:
535
        printf("Image committed.\n");
536
        break;
537
    case -ENOENT:
538
        error_report("No disk inserted");
539
        break;
540
    case -EACCES:
541
        error_report("Image is read-only");
542
        break;
543
    case -ENOTSUP:
544
        error_report("Image is already committed");
545
        break;
546
    default:
547
        error_report("Error while committing image");
548
        break;
549
    }
550

    
551
    bdrv_delete(bs);
552
    if (ret) {
553
        return 1;
554
    }
555
    return 0;
556
}
557

    
558
/*
559
 * Returns true iff the first sector pointed to by 'buf' contains at least
560
 * a non-NUL byte.
561
 *
562
 * 'pnum' is set to the number of sectors (including and immediately following
563
 * the first one) that are known to be in the same allocated/unallocated state.
564
 */
565
static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
566
{
567
    bool is_zero;
568
    int i;
569

    
570
    if (n <= 0) {
571
        *pnum = 0;
572
        return 0;
573
    }
574
    is_zero = buffer_is_zero(buf, 512);
575
    for(i = 1; i < n; i++) {
576
        buf += 512;
577
        if (is_zero != buffer_is_zero(buf, 512)) {
578
            break;
579
        }
580
    }
581
    *pnum = i;
582
    return !is_zero;
583
}
584

    
585
/*
586
 * Like is_allocated_sectors, but if the buffer starts with a used sector,
587
 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
588
 * breaking up write requests for only small sparse areas.
589
 */
590
static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
591
    int min)
592
{
593
    int ret;
594
    int num_checked, num_used;
595

    
596
    if (n < min) {
597
        min = n;
598
    }
599

    
600
    ret = is_allocated_sectors(buf, n, pnum);
601
    if (!ret) {
602
        return ret;
603
    }
604

    
605
    num_used = *pnum;
606
    buf += BDRV_SECTOR_SIZE * *pnum;
607
    n -= *pnum;
608
    num_checked = num_used;
609

    
610
    while (n > 0) {
611
        ret = is_allocated_sectors(buf, n, pnum);
612

    
613
        buf += BDRV_SECTOR_SIZE * *pnum;
614
        n -= *pnum;
615
        num_checked += *pnum;
616
        if (ret) {
617
            num_used = num_checked;
618
        } else if (*pnum >= min) {
619
            break;
620
        }
621
    }
622

    
623
    *pnum = num_used;
624
    return 1;
625
}
626

    
627
/*
628
 * Compares two buffers sector by sector. Returns 0 if the first sector of both
629
 * buffers matches, non-zero otherwise.
630
 *
631
 * pnum is set to the number of sectors (including and immediately following
632
 * the first one) that are known to have the same comparison result
633
 */
634
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
635
    int *pnum)
636
{
637
    int res, i;
638

    
639
    if (n <= 0) {
640
        *pnum = 0;
641
        return 0;
642
    }
643

    
644
    res = !!memcmp(buf1, buf2, 512);
645
    for(i = 1; i < n; i++) {
646
        buf1 += 512;
647
        buf2 += 512;
648

    
649
        if (!!memcmp(buf1, buf2, 512) != res) {
650
            break;
651
        }
652
    }
653

    
654
    *pnum = i;
655
    return res;
656
}
657

    
658
#define IO_BUF_SIZE (2 * 1024 * 1024)
659

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

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

    
730
            min_sparse = sval / BDRV_SECTOR_SIZE;
731
            break;
732
        }
733
        case 'p':
734
            progress = 1;
735
            break;
736
        case 't':
737
            cache = optarg;
738
            break;
739
        }
740
    }
741

    
742
    bs_n = argc - optind - 1;
743
    if (bs_n < 1) {
744
        help();
745
    }
746

    
747
    out_filename = argv[argc - 1];
748

    
749
    /* Initialize before goto out */
750
    qemu_progress_init(progress, 2.0);
751

    
752
    if (options && is_help_option(options)) {
753
        ret = print_block_option_help(out_filename, out_fmt);
754
        goto out;
755
    }
756

    
757
    if (bs_n > 1 && out_baseimg) {
758
        error_report("-B makes no sense when concatenating multiple input "
759
                     "images");
760
        ret = -1;
761
        goto out;
762
    }
763

    
764
    qemu_progress_print(0, 100);
765

    
766
    bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
767

    
768
    total_sectors = 0;
769
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
770
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
771
        if (!bs[bs_i]) {
772
            error_report("Could not open '%s'", argv[optind + bs_i]);
773
            ret = -1;
774
            goto out;
775
        }
776
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
777
        total_sectors += bs_sectors;
778
    }
779

    
780
    if (snapshot_name != NULL) {
781
        if (bs_n > 1) {
782
            error_report("No support for concatenating multiple snapshot");
783
            ret = -1;
784
            goto out;
785
        }
786
        if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
787
            error_report("Failed to load snapshot");
788
            ret = -1;
789
            goto out;
790
        }
791
    }
792

    
793
    /* Find driver and parse its options */
794
    drv = bdrv_find_format(out_fmt);
795
    if (!drv) {
796
        error_report("Unknown file format '%s'", out_fmt);
797
        ret = -1;
798
        goto out;
799
    }
800

    
801
    proto_drv = bdrv_find_protocol(out_filename);
802
    if (!proto_drv) {
803
        error_report("Unknown protocol '%s'", out_filename);
804
        ret = -1;
805
        goto out;
806
    }
807

    
808
    create_options = append_option_parameters(create_options,
809
                                              drv->create_options);
810
    create_options = append_option_parameters(create_options,
811
                                              proto_drv->create_options);
812

    
813
    if (options) {
814
        param = parse_option_parameters(options, create_options, param);
815
        if (param == NULL) {
816
            error_report("Invalid options for file format '%s'.", out_fmt);
817
            ret = -1;
818
            goto out;
819
        }
820
    } else {
821
        param = parse_option_parameters("", create_options, param);
822
    }
823

    
824
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
825
    ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
826
    if (ret < 0) {
827
        goto out;
828
    }
829

    
830
    /* Get backing file name if -o backing_file was used */
831
    out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
832
    if (out_baseimg_param) {
833
        out_baseimg = out_baseimg_param->value.s;
834
    }
835

    
836
    /* Check if compression is supported */
837
    if (compress) {
838
        QEMUOptionParameter *encryption =
839
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
840
        QEMUOptionParameter *preallocation =
841
            get_option_parameter(param, BLOCK_OPT_PREALLOC);
842

    
843
        if (!drv->bdrv_write_compressed) {
844
            error_report("Compression not supported for this file format");
845
            ret = -1;
846
            goto out;
847
        }
848

    
849
        if (encryption && encryption->value.n) {
850
            error_report("Compression and encryption not supported at "
851
                         "the same time");
852
            ret = -1;
853
            goto out;
854
        }
855

    
856
        if (preallocation && preallocation->value.s
857
            && strcmp(preallocation->value.s, "off"))
858
        {
859
            error_report("Compression and preallocation not supported at "
860
                         "the same time");
861
            ret = -1;
862
            goto out;
863
        }
864
    }
865

    
866
    /* Create the new image */
867
    ret = bdrv_create(drv, out_filename, param);
868
    if (ret < 0) {
869
        if (ret == -ENOTSUP) {
870
            error_report("Formatting not supported for file format '%s'",
871
                         out_fmt);
872
        } else if (ret == -EFBIG) {
873
            error_report("The image size is too large for file format '%s'",
874
                         out_fmt);
875
        } else {
876
            error_report("%s: error while converting %s: %s",
877
                         out_filename, out_fmt, strerror(-ret));
878
        }
879
        goto out;
880
    }
881

    
882
    flags = BDRV_O_RDWR;
883
    ret = bdrv_parse_cache_flags(cache, &flags);
884
    if (ret < 0) {
885
        error_report("Invalid cache option: %s", cache);
886
        return -1;
887
    }
888

    
889
    out_bs = bdrv_new_open(out_filename, out_fmt, flags);
890
    if (!out_bs) {
891
        ret = -1;
892
        goto out;
893
    }
894

    
895
    bs_i = 0;
896
    bs_offset = 0;
897
    bdrv_get_geometry(bs[0], &bs_sectors);
898
    buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
899

    
900
    if (compress) {
901
        ret = bdrv_get_info(out_bs, &bdi);
902
        if (ret < 0) {
903
            error_report("could not get block driver info");
904
            goto out;
905
        }
906
        cluster_size = bdi.cluster_size;
907
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
908
            error_report("invalid cluster size");
909
            ret = -1;
910
            goto out;
911
        }
912
        cluster_sectors = cluster_size >> 9;
913
        sector_num = 0;
914

    
915
        nb_sectors = total_sectors;
916
        local_progress = (float)100 /
917
            (nb_sectors / MIN(nb_sectors, cluster_sectors));
918

    
919
        for(;;) {
920
            int64_t bs_num;
921
            int remainder;
922
            uint8_t *buf2;
923

    
924
            nb_sectors = total_sectors - sector_num;
925
            if (nb_sectors <= 0)
926
                break;
927
            if (nb_sectors >= cluster_sectors)
928
                n = cluster_sectors;
929
            else
930
                n = nb_sectors;
931

    
932
            bs_num = sector_num - bs_offset;
933
            assert (bs_num >= 0);
934
            remainder = n;
935
            buf2 = buf;
936
            while (remainder > 0) {
937
                int nlow;
938
                while (bs_num == bs_sectors) {
939
                    bs_i++;
940
                    assert (bs_i < bs_n);
941
                    bs_offset += bs_sectors;
942
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
943
                    bs_num = 0;
944
                    /* printf("changing part: sector_num=%" PRId64 ", "
945
                       "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
946
                       "\n", sector_num, bs_i, bs_offset, bs_sectors); */
947
                }
948
                assert (bs_num < bs_sectors);
949

    
950
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
951

    
952
                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
953
                if (ret < 0) {
954
                    error_report("error while reading sector %" PRId64 ": %s",
955
                                 bs_num, strerror(-ret));
956
                    goto out;
957
                }
958

    
959
                buf2 += nlow * 512;
960
                bs_num += nlow;
961

    
962
                remainder -= nlow;
963
            }
964
            assert (remainder == 0);
965

    
966
            if (n < cluster_sectors) {
967
                memset(buf + n * 512, 0, cluster_size - n * 512);
968
            }
969
            if (!buffer_is_zero(buf, cluster_size)) {
970
                ret = bdrv_write_compressed(out_bs, sector_num, buf,
971
                                            cluster_sectors);
972
                if (ret != 0) {
973
                    error_report("error while compressing sector %" PRId64
974
                                 ": %s", sector_num, strerror(-ret));
975
                    goto out;
976
                }
977
            }
978
            sector_num += n;
979
            qemu_progress_print(local_progress, 100);
980
        }
981
        /* signal EOF to align */
982
        bdrv_write_compressed(out_bs, 0, NULL, 0);
983
    } else {
984
        int has_zero_init = bdrv_has_zero_init(out_bs);
985

    
986
        sector_num = 0; // total number of sectors converted so far
987
        nb_sectors = total_sectors - sector_num;
988
        local_progress = (float)100 /
989
            (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
990

    
991
        for(;;) {
992
            nb_sectors = total_sectors - sector_num;
993
            if (nb_sectors <= 0) {
994
                break;
995
            }
996
            if (nb_sectors >= (IO_BUF_SIZE / 512)) {
997
                n = (IO_BUF_SIZE / 512);
998
            } else {
999
                n = nb_sectors;
1000
            }
1001

    
1002
            while (sector_num - bs_offset >= bs_sectors) {
1003
                bs_i ++;
1004
                assert (bs_i < bs_n);
1005
                bs_offset += bs_sectors;
1006
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
1007
                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1008
                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
1009
                   sector_num, bs_i, bs_offset, bs_sectors); */
1010
            }
1011

    
1012
            if (n > bs_offset + bs_sectors - sector_num) {
1013
                n = bs_offset + bs_sectors - sector_num;
1014
            }
1015

    
1016
            if (has_zero_init) {
1017
                /* If the output image is being created as a copy on write image,
1018
                   assume that sectors which are unallocated in the input image
1019
                   are present in both the output's and input's base images (no
1020
                   need to copy them). */
1021
                if (out_baseimg) {
1022
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1023
                                           n, &n1)) {
1024
                        sector_num += n1;
1025
                        continue;
1026
                    }
1027
                    /* The next 'n1' sectors are allocated in the input image. Copy
1028
                       only those as they may be followed by unallocated sectors. */
1029
                    n = n1;
1030
                }
1031
            } else {
1032
                n1 = n;
1033
            }
1034

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

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

    
1091

    
1092
static void dump_snapshots(BlockDriverState *bs)
1093
{
1094
    QEMUSnapshotInfo *sn_tab, *sn;
1095
    int nb_sns, i;
1096
    char buf[256];
1097

    
1098
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1099
    if (nb_sns <= 0)
1100
        return;
1101
    printf("Snapshot list:\n");
1102
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1103
    for(i = 0; i < nb_sns; i++) {
1104
        sn = &sn_tab[i];
1105
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1106
    }
1107
    g_free(sn_tab);
1108
}
1109

    
1110
static void collect_snapshots(BlockDriverState *bs , ImageInfo *info)
1111
{
1112
    int i, sn_count;
1113
    QEMUSnapshotInfo *sn_tab = NULL;
1114
    SnapshotInfoList *info_list, *cur_item = NULL;
1115
    sn_count = bdrv_snapshot_list(bs, &sn_tab);
1116

    
1117
    for (i = 0; i < sn_count; i++) {
1118
        info->has_snapshots = true;
1119
        info_list = g_new0(SnapshotInfoList, 1);
1120

    
1121
        info_list->value                = g_new0(SnapshotInfo, 1);
1122
        info_list->value->id            = g_strdup(sn_tab[i].id_str);
1123
        info_list->value->name          = g_strdup(sn_tab[i].name);
1124
        info_list->value->vm_state_size = sn_tab[i].vm_state_size;
1125
        info_list->value->date_sec      = sn_tab[i].date_sec;
1126
        info_list->value->date_nsec     = sn_tab[i].date_nsec;
1127
        info_list->value->vm_clock_sec  = sn_tab[i].vm_clock_nsec / 1000000000;
1128
        info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
1129

    
1130
        /* XXX: waiting for the qapi to support qemu-queue.h types */
1131
        if (!cur_item) {
1132
            info->snapshots = cur_item = info_list;
1133
        } else {
1134
            cur_item->next = info_list;
1135
            cur_item = info_list;
1136
        }
1137

    
1138
    }
1139

    
1140
    g_free(sn_tab);
1141
}
1142

    
1143
static void dump_json_image_info(ImageInfo *info)
1144
{
1145
    Error *errp = NULL;
1146
    QString *str;
1147
    QmpOutputVisitor *ov = qmp_output_visitor_new();
1148
    QObject *obj;
1149
    visit_type_ImageInfo(qmp_output_get_visitor(ov),
1150
                         &info, NULL, &errp);
1151
    obj = qmp_output_get_qobject(ov);
1152
    str = qobject_to_json_pretty(obj);
1153
    assert(str != NULL);
1154
    printf("%s\n", qstring_get_str(str));
1155
    qobject_decref(obj);
1156
    qmp_output_visitor_cleanup(ov);
1157
    QDECREF(str);
1158
}
1159

    
1160
static void collect_image_info(BlockDriverState *bs,
1161
                   ImageInfo *info,
1162
                   const char *filename,
1163
                   const char *fmt)
1164
{
1165
    uint64_t total_sectors;
1166
    char backing_filename[1024];
1167
    char backing_filename2[1024];
1168
    BlockDriverInfo bdi;
1169

    
1170
    bdrv_get_geometry(bs, &total_sectors);
1171

    
1172
    info->filename        = g_strdup(filename);
1173
    info->format          = g_strdup(bdrv_get_format_name(bs));
1174
    info->virtual_size    = total_sectors * 512;
1175
    info->actual_size     = bdrv_get_allocated_file_size(bs);
1176
    info->has_actual_size = info->actual_size >= 0;
1177
    if (bdrv_is_encrypted(bs)) {
1178
        info->encrypted = true;
1179
        info->has_encrypted = true;
1180
    }
1181
    if (bdrv_get_info(bs, &bdi) >= 0) {
1182
        if (bdi.cluster_size != 0) {
1183
            info->cluster_size = bdi.cluster_size;
1184
            info->has_cluster_size = true;
1185
        }
1186
        info->dirty_flag = bdi.is_dirty;
1187
        info->has_dirty_flag = true;
1188
    }
1189
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1190
    if (backing_filename[0] != '\0') {
1191
        info->backing_filename = g_strdup(backing_filename);
1192
        info->has_backing_filename = true;
1193
        bdrv_get_full_backing_filename(bs, backing_filename2,
1194
                                       sizeof(backing_filename2));
1195

    
1196
        if (strcmp(backing_filename, backing_filename2) != 0) {
1197
            info->full_backing_filename =
1198
                        g_strdup(backing_filename2);
1199
            info->has_full_backing_filename = true;
1200
        }
1201

    
1202
        if (bs->backing_format[0]) {
1203
            info->backing_filename_format = g_strdup(bs->backing_format);
1204
            info->has_backing_filename_format = true;
1205
        }
1206
    }
1207
}
1208

    
1209
static void dump_human_image_info(ImageInfo *info)
1210
{
1211
    char size_buf[128], dsize_buf[128];
1212
    if (!info->has_actual_size) {
1213
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1214
    } else {
1215
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1216
                                info->actual_size);
1217
    }
1218
    get_human_readable_size(size_buf, sizeof(size_buf), info->virtual_size);
1219
    printf("image: %s\n"
1220
           "file format: %s\n"
1221
           "virtual size: %s (%" PRId64 " bytes)\n"
1222
           "disk size: %s\n",
1223
           info->filename, info->format, size_buf,
1224
           info->virtual_size,
1225
           dsize_buf);
1226

    
1227
    if (info->has_encrypted && info->encrypted) {
1228
        printf("encrypted: yes\n");
1229
    }
1230

    
1231
    if (info->has_cluster_size) {
1232
        printf("cluster_size: %" PRId64 "\n", info->cluster_size);
1233
    }
1234

    
1235
    if (info->has_dirty_flag && info->dirty_flag) {
1236
        printf("cleanly shut down: no\n");
1237
    }
1238

    
1239
    if (info->has_backing_filename) {
1240
        printf("backing file: %s", info->backing_filename);
1241
        if (info->has_full_backing_filename) {
1242
            printf(" (actual path: %s)", info->full_backing_filename);
1243
        }
1244
        putchar('\n');
1245
        if (info->has_backing_filename_format) {
1246
            printf("backing file format: %s\n", info->backing_filename_format);
1247
        }
1248
    }
1249
}
1250

    
1251
enum {OPTION_OUTPUT = 256};
1252

    
1253
typedef enum OutputFormat {
1254
    OFORMAT_JSON,
1255
    OFORMAT_HUMAN,
1256
} OutputFormat;
1257

    
1258
static int img_info(int argc, char **argv)
1259
{
1260
    int c;
1261
    OutputFormat output_format = OFORMAT_HUMAN;
1262
    const char *filename, *fmt, *output;
1263
    BlockDriverState *bs;
1264
    ImageInfo *info;
1265

    
1266
    fmt = NULL;
1267
    output = NULL;
1268
    for(;;) {
1269
        int option_index = 0;
1270
        static const struct option long_options[] = {
1271
            {"help", no_argument, 0, 'h'},
1272
            {"format", required_argument, 0, 'f'},
1273
            {"output", required_argument, 0, OPTION_OUTPUT},
1274
            {0, 0, 0, 0}
1275
        };
1276
        c = getopt_long(argc, argv, "f:h",
1277
                        long_options, &option_index);
1278
        if (c == -1) {
1279
            break;
1280
        }
1281
        switch(c) {
1282
        case '?':
1283
        case 'h':
1284
            help();
1285
            break;
1286
        case 'f':
1287
            fmt = optarg;
1288
            break;
1289
        case OPTION_OUTPUT:
1290
            output = optarg;
1291
            break;
1292
        }
1293
    }
1294
    if (optind >= argc) {
1295
        help();
1296
    }
1297
    filename = argv[optind++];
1298

    
1299
    if (output && !strcmp(output, "json")) {
1300
        output_format = OFORMAT_JSON;
1301
    } else if (output && !strcmp(output, "human")) {
1302
        output_format = OFORMAT_HUMAN;
1303
    } else if (output) {
1304
        error_report("--output must be used with human or json as argument.");
1305
        return 1;
1306
    }
1307

    
1308
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1309
    if (!bs) {
1310
        return 1;
1311
    }
1312

    
1313
    info = g_new0(ImageInfo, 1);
1314
    collect_image_info(bs, info, filename, fmt);
1315

    
1316
    switch (output_format) {
1317
    case OFORMAT_HUMAN:
1318
        dump_human_image_info(info);
1319
        dump_snapshots(bs);
1320
        break;
1321
    case OFORMAT_JSON:
1322
        collect_snapshots(bs, info);
1323
        dump_json_image_info(info);
1324
        break;
1325
    }
1326

    
1327
    qapi_free_ImageInfo(info);
1328
    bdrv_delete(bs);
1329
    return 0;
1330
}
1331

    
1332
#define SNAPSHOT_LIST   1
1333
#define SNAPSHOT_CREATE 2
1334
#define SNAPSHOT_APPLY  3
1335
#define SNAPSHOT_DELETE 4
1336

    
1337
static int img_snapshot(int argc, char **argv)
1338
{
1339
    BlockDriverState *bs;
1340
    QEMUSnapshotInfo sn;
1341
    char *filename, *snapshot_name = NULL;
1342
    int c, ret = 0, bdrv_oflags;
1343
    int action = 0;
1344
    qemu_timeval tv;
1345

    
1346
    bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1347
    /* Parse commandline parameters */
1348
    for(;;) {
1349
        c = getopt(argc, argv, "la:c:d:h");
1350
        if (c == -1) {
1351
            break;
1352
        }
1353
        switch(c) {
1354
        case '?':
1355
        case 'h':
1356
            help();
1357
            return 0;
1358
        case 'l':
1359
            if (action) {
1360
                help();
1361
                return 0;
1362
            }
1363
            action = SNAPSHOT_LIST;
1364
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1365
            break;
1366
        case 'a':
1367
            if (action) {
1368
                help();
1369
                return 0;
1370
            }
1371
            action = SNAPSHOT_APPLY;
1372
            snapshot_name = optarg;
1373
            break;
1374
        case 'c':
1375
            if (action) {
1376
                help();
1377
                return 0;
1378
            }
1379
            action = SNAPSHOT_CREATE;
1380
            snapshot_name = optarg;
1381
            break;
1382
        case 'd':
1383
            if (action) {
1384
                help();
1385
                return 0;
1386
            }
1387
            action = SNAPSHOT_DELETE;
1388
            snapshot_name = optarg;
1389
            break;
1390
        }
1391
    }
1392

    
1393
    if (optind >= argc) {
1394
        help();
1395
    }
1396
    filename = argv[optind++];
1397

    
1398
    /* Open the image */
1399
    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1400
    if (!bs) {
1401
        return 1;
1402
    }
1403

    
1404
    /* Perform the requested action */
1405
    switch(action) {
1406
    case SNAPSHOT_LIST:
1407
        dump_snapshots(bs);
1408
        break;
1409

    
1410
    case SNAPSHOT_CREATE:
1411
        memset(&sn, 0, sizeof(sn));
1412
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1413

    
1414
        qemu_gettimeofday(&tv);
1415
        sn.date_sec = tv.tv_sec;
1416
        sn.date_nsec = tv.tv_usec * 1000;
1417

    
1418
        ret = bdrv_snapshot_create(bs, &sn);
1419
        if (ret) {
1420
            error_report("Could not create snapshot '%s': %d (%s)",
1421
                snapshot_name, ret, strerror(-ret));
1422
        }
1423
        break;
1424

    
1425
    case SNAPSHOT_APPLY:
1426
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1427
        if (ret) {
1428
            error_report("Could not apply snapshot '%s': %d (%s)",
1429
                snapshot_name, ret, strerror(-ret));
1430
        }
1431
        break;
1432

    
1433
    case SNAPSHOT_DELETE:
1434
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1435
        if (ret) {
1436
            error_report("Could not delete snapshot '%s': %d (%s)",
1437
                snapshot_name, ret, strerror(-ret));
1438
        }
1439
        break;
1440
    }
1441

    
1442
    /* Cleanup */
1443
    bdrv_delete(bs);
1444
    if (ret) {
1445
        return 1;
1446
    }
1447
    return 0;
1448
}
1449

    
1450
static int img_rebase(int argc, char **argv)
1451
{
1452
    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1453
    BlockDriver *old_backing_drv, *new_backing_drv;
1454
    char *filename;
1455
    const char *fmt, *cache, *out_basefmt, *out_baseimg;
1456
    int c, flags, ret;
1457
    int unsafe = 0;
1458
    int progress = 0;
1459

    
1460
    /* Parse commandline parameters */
1461
    fmt = NULL;
1462
    cache = BDRV_DEFAULT_CACHE;
1463
    out_baseimg = NULL;
1464
    out_basefmt = NULL;
1465
    for(;;) {
1466
        c = getopt(argc, argv, "uhf:F:b:pt:");
1467
        if (c == -1) {
1468
            break;
1469
        }
1470
        switch(c) {
1471
        case '?':
1472
        case 'h':
1473
            help();
1474
            return 0;
1475
        case 'f':
1476
            fmt = optarg;
1477
            break;
1478
        case 'F':
1479
            out_basefmt = optarg;
1480
            break;
1481
        case 'b':
1482
            out_baseimg = optarg;
1483
            break;
1484
        case 'u':
1485
            unsafe = 1;
1486
            break;
1487
        case 'p':
1488
            progress = 1;
1489
            break;
1490
        case 't':
1491
            cache = optarg;
1492
            break;
1493
        }
1494
    }
1495

    
1496
    if ((optind >= argc) || (!unsafe && !out_baseimg)) {
1497
        help();
1498
    }
1499
    filename = argv[optind++];
1500

    
1501
    qemu_progress_init(progress, 2.0);
1502
    qemu_progress_print(0, 100);
1503

    
1504
    flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1505
    ret = bdrv_parse_cache_flags(cache, &flags);
1506
    if (ret < 0) {
1507
        error_report("Invalid cache option: %s", cache);
1508
        return -1;
1509
    }
1510

    
1511
    /*
1512
     * Open the images.
1513
     *
1514
     * Ignore the old backing file for unsafe rebase in case we want to correct
1515
     * the reference to a renamed or moved backing file.
1516
     */
1517
    bs = bdrv_new_open(filename, fmt, flags);
1518
    if (!bs) {
1519
        return 1;
1520
    }
1521

    
1522
    /* Find the right drivers for the backing files */
1523
    old_backing_drv = NULL;
1524
    new_backing_drv = NULL;
1525

    
1526
    if (!unsafe && bs->backing_format[0] != '\0') {
1527
        old_backing_drv = bdrv_find_format(bs->backing_format);
1528
        if (old_backing_drv == NULL) {
1529
            error_report("Invalid format name: '%s'", bs->backing_format);
1530
            ret = -1;
1531
            goto out;
1532
        }
1533
    }
1534

    
1535
    if (out_basefmt != NULL) {
1536
        new_backing_drv = bdrv_find_format(out_basefmt);
1537
        if (new_backing_drv == NULL) {
1538
            error_report("Invalid format name: '%s'", out_basefmt);
1539
            ret = -1;
1540
            goto out;
1541
        }
1542
    }
1543

    
1544
    /* For safe rebasing we need to compare old and new backing file */
1545
    if (unsafe) {
1546
        /* Make the compiler happy */
1547
        bs_old_backing = NULL;
1548
        bs_new_backing = NULL;
1549
    } else {
1550
        char backing_name[1024];
1551

    
1552
        bs_old_backing = bdrv_new("old_backing");
1553
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1554
        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1555
                        old_backing_drv);
1556
        if (ret) {
1557
            error_report("Could not open old backing file '%s'", backing_name);
1558
            goto out;
1559
        }
1560

    
1561
        bs_new_backing = bdrv_new("new_backing");
1562
        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1563
                        new_backing_drv);
1564
        if (ret) {
1565
            error_report("Could not open new backing file '%s'", out_baseimg);
1566
            goto out;
1567
        }
1568
    }
1569

    
1570
    /*
1571
     * Check each unallocated cluster in the COW file. If it is unallocated,
1572
     * accesses go to the backing file. We must therefore compare this cluster
1573
     * in the old and new backing file, and if they differ we need to copy it
1574
     * from the old backing file into the COW file.
1575
     *
1576
     * If qemu-img crashes during this step, no harm is done. The content of
1577
     * the image is the same as the original one at any time.
1578
     */
1579
    if (!unsafe) {
1580
        uint64_t num_sectors;
1581
        uint64_t old_backing_num_sectors;
1582
        uint64_t new_backing_num_sectors;
1583
        uint64_t sector;
1584
        int n;
1585
        uint8_t * buf_old;
1586
        uint8_t * buf_new;
1587
        float local_progress;
1588

    
1589
        buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1590
        buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
1591

    
1592
        bdrv_get_geometry(bs, &num_sectors);
1593
        bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1594
        bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1595

    
1596
        local_progress = (float)100 /
1597
            (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1598
        for (sector = 0; sector < num_sectors; sector += n) {
1599

    
1600
            /* How many sectors can we handle with the next read? */
1601
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1602
                n = (IO_BUF_SIZE / 512);
1603
            } else {
1604
                n = num_sectors - sector;
1605
            }
1606

    
1607
            /* If the cluster is allocated, we don't need to take action */
1608
            ret = bdrv_is_allocated(bs, sector, n, &n);
1609
            if (ret) {
1610
                continue;
1611
            }
1612

    
1613
            /*
1614
             * Read old and new backing file and take into consideration that
1615
             * backing files may be smaller than the COW image.
1616
             */
1617
            if (sector >= old_backing_num_sectors) {
1618
                memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1619
            } else {
1620
                if (sector + n > old_backing_num_sectors) {
1621
                    n = old_backing_num_sectors - sector;
1622
                }
1623

    
1624
                ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1625
                if (ret < 0) {
1626
                    error_report("error while reading from old backing file");
1627
                    goto out;
1628
                }
1629
            }
1630

    
1631
            if (sector >= new_backing_num_sectors) {
1632
                memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1633
            } else {
1634
                if (sector + n > new_backing_num_sectors) {
1635
                    n = new_backing_num_sectors - sector;
1636
                }
1637

    
1638
                ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1639
                if (ret < 0) {
1640
                    error_report("error while reading from new backing file");
1641
                    goto out;
1642
                }
1643
            }
1644

    
1645
            /* If they differ, we need to write to the COW file */
1646
            uint64_t written = 0;
1647

    
1648
            while (written < n) {
1649
                int pnum;
1650

    
1651
                if (compare_sectors(buf_old + written * 512,
1652
                    buf_new + written * 512, n - written, &pnum))
1653
                {
1654
                    ret = bdrv_write(bs, sector + written,
1655
                        buf_old + written * 512, pnum);
1656
                    if (ret < 0) {
1657
                        error_report("Error while writing to COW image: %s",
1658
                            strerror(-ret));
1659
                        goto out;
1660
                    }
1661
                }
1662

    
1663
                written += pnum;
1664
            }
1665
            qemu_progress_print(local_progress, 100);
1666
        }
1667

    
1668
        qemu_vfree(buf_old);
1669
        qemu_vfree(buf_new);
1670
    }
1671

    
1672
    /*
1673
     * Change the backing file. All clusters that are different from the old
1674
     * backing file are overwritten in the COW file now, so the visible content
1675
     * doesn't change when we switch the backing file.
1676
     */
1677
    ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1678
    if (ret == -ENOSPC) {
1679
        error_report("Could not change the backing file to '%s': No "
1680
                     "space left in the file header", out_baseimg);
1681
    } else if (ret < 0) {
1682
        error_report("Could not change the backing file to '%s': %s",
1683
            out_baseimg, strerror(-ret));
1684
    }
1685

    
1686
    qemu_progress_print(100, 0);
1687
    /*
1688
     * TODO At this point it is possible to check if any clusters that are
1689
     * allocated in the COW file are the same in the backing file. If so, they
1690
     * could be dropped from the COW file. Don't do this before switching the
1691
     * backing file, in case of a crash this would lead to corruption.
1692
     */
1693
out:
1694
    qemu_progress_end();
1695
    /* Cleanup */
1696
    if (!unsafe) {
1697
        if (bs_old_backing != NULL) {
1698
            bdrv_delete(bs_old_backing);
1699
        }
1700
        if (bs_new_backing != NULL) {
1701
            bdrv_delete(bs_new_backing);
1702
        }
1703
    }
1704

    
1705
    bdrv_delete(bs);
1706
    if (ret) {
1707
        return 1;
1708
    }
1709
    return 0;
1710
}
1711

    
1712
static int img_resize(int argc, char **argv)
1713
{
1714
    int c, ret, relative;
1715
    const char *filename, *fmt, *size;
1716
    int64_t n, total_size;
1717
    BlockDriverState *bs = NULL;
1718
    QemuOpts *param;
1719
    static QemuOptsList resize_options = {
1720
        .name = "resize_options",
1721
        .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1722
        .desc = {
1723
            {
1724
                .name = BLOCK_OPT_SIZE,
1725
                .type = QEMU_OPT_SIZE,
1726
                .help = "Virtual disk size"
1727
            }, {
1728
                /* end of list */
1729
            }
1730
        },
1731
    };
1732

    
1733
    /* Remove size from argv manually so that negative numbers are not treated
1734
     * as options by getopt. */
1735
    if (argc < 3) {
1736
        help();
1737
        return 1;
1738
    }
1739

    
1740
    size = argv[--argc];
1741

    
1742
    /* Parse getopt arguments */
1743
    fmt = NULL;
1744
    for(;;) {
1745
        c = getopt(argc, argv, "f:h");
1746
        if (c == -1) {
1747
            break;
1748
        }
1749
        switch(c) {
1750
        case '?':
1751
        case 'h':
1752
            help();
1753
            break;
1754
        case 'f':
1755
            fmt = optarg;
1756
            break;
1757
        }
1758
    }
1759
    if (optind >= argc) {
1760
        help();
1761
    }
1762
    filename = argv[optind++];
1763

    
1764
    /* Choose grow, shrink, or absolute resize mode */
1765
    switch (size[0]) {
1766
    case '+':
1767
        relative = 1;
1768
        size++;
1769
        break;
1770
    case '-':
1771
        relative = -1;
1772
        size++;
1773
        break;
1774
    default:
1775
        relative = 0;
1776
        break;
1777
    }
1778

    
1779
    /* Parse size */
1780
    param = qemu_opts_create(&resize_options, NULL, 0, NULL);
1781
    if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
1782
        /* Error message already printed when size parsing fails */
1783
        ret = -1;
1784
        qemu_opts_del(param);
1785
        goto out;
1786
    }
1787
    n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1788
    qemu_opts_del(param);
1789

    
1790
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1791
    if (!bs) {
1792
        ret = -1;
1793
        goto out;
1794
    }
1795

    
1796
    if (relative) {
1797
        total_size = bdrv_getlength(bs) + n * relative;
1798
    } else {
1799
        total_size = n;
1800
    }
1801
    if (total_size <= 0) {
1802
        error_report("New image size must be positive");
1803
        ret = -1;
1804
        goto out;
1805
    }
1806

    
1807
    ret = bdrv_truncate(bs, total_size);
1808
    switch (ret) {
1809
    case 0:
1810
        printf("Image resized.\n");
1811
        break;
1812
    case -ENOTSUP:
1813
        error_report("This image does not support resize");
1814
        break;
1815
    case -EACCES:
1816
        error_report("Image is read-only");
1817
        break;
1818
    default:
1819
        error_report("Error resizing image (%d)", -ret);
1820
        break;
1821
    }
1822
out:
1823
    if (bs) {
1824
        bdrv_delete(bs);
1825
    }
1826
    if (ret) {
1827
        return 1;
1828
    }
1829
    return 0;
1830
}
1831

    
1832
static const img_cmd_t img_cmds[] = {
1833
#define DEF(option, callback, arg_string)        \
1834
    { option, callback },
1835
#include "qemu-img-cmds.h"
1836
#undef DEF
1837
#undef GEN_DOCS
1838
    { NULL, NULL, },
1839
};
1840

    
1841
int main(int argc, char **argv)
1842
{
1843
    const img_cmd_t *cmd;
1844
    const char *cmdname;
1845

    
1846
    error_set_progname(argv[0]);
1847

    
1848
    bdrv_init();
1849
    if (argc < 2)
1850
        help();
1851
    cmdname = argv[1];
1852
    argc--; argv++;
1853

    
1854
    qemu_init_main_loop();
1855

    
1856
    /* find the command */
1857
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1858
        if (!strcmp(cmdname, cmd->name)) {
1859
            return cmd->handler(argc, argv);
1860
        }
1861
    }
1862

    
1863
    /* not found */
1864
    help();
1865
    return 0;
1866
}