xref: /openbmc/qemu/qemu-img.c (revision 9c4218e9)
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/osdep.h"
25 #include "qapi-visit.h"
26 #include "qapi/qmp-output-visitor.h"
27 #include "qapi/qmp/qerror.h"
28 #include "qapi/qmp/qjson.h"
29 #include "qemu-common.h"
30 #include "qemu/option.h"
31 #include "qemu/error-report.h"
32 #include "sysemu/sysemu.h"
33 #include "sysemu/block-backend.h"
34 #include "block/block_int.h"
35 #include "block/blockjob.h"
36 #include "block/qapi.h"
37 #include <getopt.h>
38 
39 #define QEMU_IMG_VERSION "qemu-img version " QEMU_VERSION QEMU_PKGVERSION \
40                           ", Copyright (c) 2004-2008 Fabrice Bellard\n"
41 
42 typedef struct img_cmd_t {
43     const char *name;
44     int (*handler)(int argc, char **argv);
45 } img_cmd_t;
46 
47 enum {
48     OPTION_OUTPUT = 256,
49     OPTION_BACKING_CHAIN = 257,
50 };
51 
52 typedef enum OutputFormat {
53     OFORMAT_JSON,
54     OFORMAT_HUMAN,
55 } OutputFormat;
56 
57 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
58 #define BDRV_O_FLAGS BDRV_O_CACHE_WB
59 #define BDRV_DEFAULT_CACHE "writeback"
60 
61 static void format_print(void *opaque, const char *name)
62 {
63     printf(" %s", name);
64 }
65 
66 static void QEMU_NORETURN GCC_FMT_ATTR(1, 2) error_exit(const char *fmt, ...)
67 {
68     va_list ap;
69 
70     error_printf("qemu-img: ");
71 
72     va_start(ap, fmt);
73     error_vprintf(fmt, ap);
74     va_end(ap);
75 
76     error_printf("\nTry 'qemu-img --help' for more information\n");
77     exit(EXIT_FAILURE);
78 }
79 
80 /* Please keep in synch with qemu-img.texi */
81 static void QEMU_NORETURN help(void)
82 {
83     const char *help_msg =
84            QEMU_IMG_VERSION
85            "usage: qemu-img command [command options]\n"
86            "QEMU disk image utility\n"
87            "\n"
88            "Command syntax:\n"
89 #define DEF(option, callback, arg_string)        \
90            "  " arg_string "\n"
91 #include "qemu-img-cmds.h"
92 #undef DEF
93 #undef GEN_DOCS
94            "\n"
95            "Command parameters:\n"
96            "  'filename' is a disk image filename\n"
97            "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
98            "  'cache' is the cache mode used to write the output disk image, the valid\n"
99            "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
100            "    'directsync' and 'unsafe' (default for convert)\n"
101            "  'src_cache' is the cache mode used to read input disk images, the valid\n"
102            "    options are the same as for the 'cache' option\n"
103            "  'size' is the disk image size in bytes. Optional suffixes\n"
104            "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
105            "    'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P)  are\n"
106            "    supported. 'b' is ignored.\n"
107            "  'output_filename' is the destination disk image filename\n"
108            "  'output_fmt' is the destination format\n"
109            "  'options' is a comma separated list of format specific options in a\n"
110            "    name=value format. Use -o ? for an overview of the options supported by the\n"
111            "    used format\n"
112            "  'snapshot_param' is param used for internal snapshot, format\n"
113            "    is 'snapshot.id=[ID],snapshot.name=[NAME]', or\n"
114            "    '[ID_OR_NAME]'\n"
115            "  'snapshot_id_or_name' is deprecated, use 'snapshot_param'\n"
116            "    instead\n"
117            "  '-c' indicates that target image must be compressed (qcow format only)\n"
118            "  '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
119            "       match exactly. The image doesn't need a working backing file before\n"
120            "       rebasing in this case (useful for renaming the backing file)\n"
121            "  '-h' with or without a command shows this help and lists the supported formats\n"
122            "  '-p' show progress of command (only certain commands)\n"
123            "  '-q' use Quiet mode - do not print any output (except errors)\n"
124            "  '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n"
125            "       contain only zeros for qemu-img to create a sparse image during\n"
126            "       conversion. If the number of bytes is 0, the source will not be scanned for\n"
127            "       unallocated or zero sectors, and the destination image will always be\n"
128            "       fully allocated\n"
129            "  '--output' takes the format in which the output must be done (human or json)\n"
130            "  '-n' skips the target volume creation (useful if the volume is created\n"
131            "       prior to running qemu-img)\n"
132            "\n"
133            "Parameters to check subcommand:\n"
134            "  '-r' tries to repair any inconsistencies that are found during the check.\n"
135            "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
136            "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
137            "       hiding corruption that has already occurred.\n"
138            "\n"
139            "Parameters to snapshot subcommand:\n"
140            "  'snapshot' is the name of the snapshot to create, apply or delete\n"
141            "  '-a' applies a snapshot (revert disk to saved state)\n"
142            "  '-c' creates a snapshot\n"
143            "  '-d' deletes a snapshot\n"
144            "  '-l' lists all snapshots in the given image\n"
145            "\n"
146            "Parameters to compare subcommand:\n"
147            "  '-f' first image format\n"
148            "  '-F' second image format\n"
149            "  '-s' run in Strict mode - fail on different image size or sector allocation\n";
150 
151     printf("%s\nSupported formats:", help_msg);
152     bdrv_iterate_format(format_print, NULL);
153     printf("\n");
154     exit(EXIT_SUCCESS);
155 }
156 
157 static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...)
158 {
159     int ret = 0;
160     if (!quiet) {
161         va_list args;
162         va_start(args, fmt);
163         ret = vprintf(fmt, args);
164         va_end(args);
165     }
166     return ret;
167 }
168 
169 
170 static int print_block_option_help(const char *filename, const char *fmt)
171 {
172     BlockDriver *drv, *proto_drv;
173     QemuOptsList *create_opts = NULL;
174     Error *local_err = NULL;
175 
176     /* Find driver and parse its options */
177     drv = bdrv_find_format(fmt);
178     if (!drv) {
179         error_report("Unknown file format '%s'", fmt);
180         return 1;
181     }
182 
183     create_opts = qemu_opts_append(create_opts, drv->create_opts);
184     if (filename) {
185         proto_drv = bdrv_find_protocol(filename, true, &local_err);
186         if (!proto_drv) {
187             error_report_err(local_err);
188             qemu_opts_free(create_opts);
189             return 1;
190         }
191         create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
192     }
193 
194     qemu_opts_print_help(create_opts);
195     qemu_opts_free(create_opts);
196     return 0;
197 }
198 
199 static BlockBackend *img_open(const char *id, const char *filename,
200                               const char *fmt, int flags,
201                               bool require_io, bool quiet)
202 {
203     BlockBackend *blk;
204     BlockDriverState *bs;
205     char password[256];
206     Error *local_err = NULL;
207     QDict *options = NULL;
208 
209     if (fmt) {
210         options = qdict_new();
211         qdict_put(options, "driver", qstring_from_str(fmt));
212     }
213 
214     blk = blk_new_open(id, filename, NULL, options, flags, &local_err);
215     if (!blk) {
216         error_reportf_err(local_err, "Could not open '%s': ", filename);
217         goto fail;
218     }
219 
220     bs = blk_bs(blk);
221     if (bdrv_is_encrypted(bs) && require_io) {
222         qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
223         if (qemu_read_password(password, sizeof(password)) < 0) {
224             error_report("No password given");
225             goto fail;
226         }
227         if (bdrv_set_key(bs, password) < 0) {
228             error_report("invalid password");
229             goto fail;
230         }
231     }
232     return blk;
233 fail:
234     blk_unref(blk);
235     return NULL;
236 }
237 
238 static int add_old_style_options(const char *fmt, QemuOpts *opts,
239                                  const char *base_filename,
240                                  const char *base_fmt)
241 {
242     Error *err = NULL;
243 
244     if (base_filename) {
245         qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &err);
246         if (err) {
247             error_report("Backing file not supported for file format '%s'",
248                          fmt);
249             error_free(err);
250             return -1;
251         }
252     }
253     if (base_fmt) {
254         qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err);
255         if (err) {
256             error_report("Backing file format not supported for file "
257                          "format '%s'", fmt);
258             error_free(err);
259             return -1;
260         }
261     }
262     return 0;
263 }
264 
265 static int img_create(int argc, char **argv)
266 {
267     int c;
268     uint64_t img_size = -1;
269     const char *fmt = "raw";
270     const char *base_fmt = NULL;
271     const char *filename;
272     const char *base_filename = NULL;
273     char *options = NULL;
274     Error *local_err = NULL;
275     bool quiet = false;
276 
277     for(;;) {
278         c = getopt(argc, argv, "F:b:f:he6o:q");
279         if (c == -1) {
280             break;
281         }
282         switch(c) {
283         case '?':
284         case 'h':
285             help();
286             break;
287         case 'F':
288             base_fmt = optarg;
289             break;
290         case 'b':
291             base_filename = optarg;
292             break;
293         case 'f':
294             fmt = optarg;
295             break;
296         case 'e':
297             error_report("option -e is deprecated, please use \'-o "
298                   "encryption\' instead!");
299             goto fail;
300         case '6':
301             error_report("option -6 is deprecated, please use \'-o "
302                   "compat6\' instead!");
303             goto fail;
304         case 'o':
305             if (!is_valid_option_list(optarg)) {
306                 error_report("Invalid option list: %s", optarg);
307                 goto fail;
308             }
309             if (!options) {
310                 options = g_strdup(optarg);
311             } else {
312                 char *old_options = options;
313                 options = g_strdup_printf("%s,%s", options, optarg);
314                 g_free(old_options);
315             }
316             break;
317         case 'q':
318             quiet = true;
319             break;
320         }
321     }
322 
323     /* Get the filename */
324     filename = (optind < argc) ? argv[optind] : NULL;
325     if (options && has_help_option(options)) {
326         g_free(options);
327         return print_block_option_help(filename, fmt);
328     }
329 
330     if (optind >= argc) {
331         error_exit("Expecting image file name");
332     }
333     optind++;
334 
335     /* Get image size, if specified */
336     if (optind < argc) {
337         int64_t sval;
338         char *end;
339         sval = qemu_strtosz_suffix(argv[optind++], &end,
340                                    QEMU_STRTOSZ_DEFSUFFIX_B);
341         if (sval < 0 || *end) {
342             if (sval == -ERANGE) {
343                 error_report("Image size must be less than 8 EiB!");
344             } else {
345                 error_report("Invalid image size specified! You may use k, M, "
346                       "G, T, P or E suffixes for ");
347                 error_report("kilobytes, megabytes, gigabytes, terabytes, "
348                              "petabytes and exabytes.");
349             }
350             goto fail;
351         }
352         img_size = (uint64_t)sval;
353     }
354     if (optind != argc) {
355         error_exit("Unexpected argument: %s", argv[optind]);
356     }
357 
358     bdrv_img_create(filename, fmt, base_filename, base_fmt,
359                     options, img_size, BDRV_O_FLAGS, &local_err, quiet);
360     if (local_err) {
361         error_reportf_err(local_err, "%s: ", filename);
362         goto fail;
363     }
364 
365     g_free(options);
366     return 0;
367 
368 fail:
369     g_free(options);
370     return 1;
371 }
372 
373 static void dump_json_image_check(ImageCheck *check, bool quiet)
374 {
375     Error *local_err = NULL;
376     QString *str;
377     QmpOutputVisitor *ov = qmp_output_visitor_new();
378     QObject *obj;
379     visit_type_ImageCheck(qmp_output_get_visitor(ov),
380                           &check, NULL, &local_err);
381     obj = qmp_output_get_qobject(ov);
382     str = qobject_to_json_pretty(obj);
383     assert(str != NULL);
384     qprintf(quiet, "%s\n", qstring_get_str(str));
385     qobject_decref(obj);
386     qmp_output_visitor_cleanup(ov);
387     QDECREF(str);
388 }
389 
390 static void dump_human_image_check(ImageCheck *check, bool quiet)
391 {
392     if (!(check->corruptions || check->leaks || check->check_errors)) {
393         qprintf(quiet, "No errors were found on the image.\n");
394     } else {
395         if (check->corruptions) {
396             qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
397                     "Data may be corrupted, or further writes to the image "
398                     "may corrupt it.\n",
399                     check->corruptions);
400         }
401 
402         if (check->leaks) {
403             qprintf(quiet,
404                     "\n%" PRId64 " leaked clusters were found on the image.\n"
405                     "This means waste of disk space, but no harm to data.\n",
406                     check->leaks);
407         }
408 
409         if (check->check_errors) {
410             qprintf(quiet,
411                     "\n%" PRId64
412                     " internal errors have occurred during the check.\n",
413                     check->check_errors);
414         }
415     }
416 
417     if (check->total_clusters != 0 && check->allocated_clusters != 0) {
418         qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
419                 "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
420                 check->allocated_clusters, check->total_clusters,
421                 check->allocated_clusters * 100.0 / check->total_clusters,
422                 check->fragmented_clusters * 100.0 / check->allocated_clusters,
423                 check->compressed_clusters * 100.0 /
424                 check->allocated_clusters);
425     }
426 
427     if (check->image_end_offset) {
428         qprintf(quiet,
429                 "Image end offset: %" PRId64 "\n", check->image_end_offset);
430     }
431 }
432 
433 static int collect_image_check(BlockDriverState *bs,
434                    ImageCheck *check,
435                    const char *filename,
436                    const char *fmt,
437                    int fix)
438 {
439     int ret;
440     BdrvCheckResult result;
441 
442     ret = bdrv_check(bs, &result, fix);
443     if (ret < 0) {
444         return ret;
445     }
446 
447     check->filename                 = g_strdup(filename);
448     check->format                   = g_strdup(bdrv_get_format_name(bs));
449     check->check_errors             = result.check_errors;
450     check->corruptions              = result.corruptions;
451     check->has_corruptions          = result.corruptions != 0;
452     check->leaks                    = result.leaks;
453     check->has_leaks                = result.leaks != 0;
454     check->corruptions_fixed        = result.corruptions_fixed;
455     check->has_corruptions_fixed    = result.corruptions != 0;
456     check->leaks_fixed              = result.leaks_fixed;
457     check->has_leaks_fixed          = result.leaks != 0;
458     check->image_end_offset         = result.image_end_offset;
459     check->has_image_end_offset     = result.image_end_offset != 0;
460     check->total_clusters           = result.bfi.total_clusters;
461     check->has_total_clusters       = result.bfi.total_clusters != 0;
462     check->allocated_clusters       = result.bfi.allocated_clusters;
463     check->has_allocated_clusters   = result.bfi.allocated_clusters != 0;
464     check->fragmented_clusters      = result.bfi.fragmented_clusters;
465     check->has_fragmented_clusters  = result.bfi.fragmented_clusters != 0;
466     check->compressed_clusters      = result.bfi.compressed_clusters;
467     check->has_compressed_clusters  = result.bfi.compressed_clusters != 0;
468 
469     return 0;
470 }
471 
472 /*
473  * Checks an image for consistency. Exit codes:
474  *
475  *  0 - Check completed, image is good
476  *  1 - Check not completed because of internal errors
477  *  2 - Check completed, image is corrupted
478  *  3 - Check completed, image has leaked clusters, but is good otherwise
479  * 63 - Checks are not supported by the image format
480  */
481 static int img_check(int argc, char **argv)
482 {
483     int c, ret;
484     OutputFormat output_format = OFORMAT_HUMAN;
485     const char *filename, *fmt, *output, *cache;
486     BlockBackend *blk;
487     BlockDriverState *bs;
488     int fix = 0;
489     int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
490     ImageCheck *check;
491     bool quiet = false;
492 
493     fmt = NULL;
494     output = NULL;
495     cache = BDRV_DEFAULT_CACHE;
496     for(;;) {
497         int option_index = 0;
498         static const struct option long_options[] = {
499             {"help", no_argument, 0, 'h'},
500             {"format", required_argument, 0, 'f'},
501             {"repair", required_argument, 0, 'r'},
502             {"output", required_argument, 0, OPTION_OUTPUT},
503             {0, 0, 0, 0}
504         };
505         c = getopt_long(argc, argv, "hf:r:T:q",
506                         long_options, &option_index);
507         if (c == -1) {
508             break;
509         }
510         switch(c) {
511         case '?':
512         case 'h':
513             help();
514             break;
515         case 'f':
516             fmt = optarg;
517             break;
518         case 'r':
519             flags |= BDRV_O_RDWR;
520 
521             if (!strcmp(optarg, "leaks")) {
522                 fix = BDRV_FIX_LEAKS;
523             } else if (!strcmp(optarg, "all")) {
524                 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
525             } else {
526                 error_exit("Unknown option value for -r "
527                            "(expecting 'leaks' or 'all'): %s", optarg);
528             }
529             break;
530         case OPTION_OUTPUT:
531             output = optarg;
532             break;
533         case 'T':
534             cache = optarg;
535             break;
536         case 'q':
537             quiet = true;
538             break;
539         }
540     }
541     if (optind != argc - 1) {
542         error_exit("Expecting one image file name");
543     }
544     filename = argv[optind++];
545 
546     if (output && !strcmp(output, "json")) {
547         output_format = OFORMAT_JSON;
548     } else if (output && !strcmp(output, "human")) {
549         output_format = OFORMAT_HUMAN;
550     } else if (output) {
551         error_report("--output must be used with human or json as argument.");
552         return 1;
553     }
554 
555     ret = bdrv_parse_cache_flags(cache, &flags);
556     if (ret < 0) {
557         error_report("Invalid source cache option: %s", cache);
558         return 1;
559     }
560 
561     blk = img_open("image", filename, fmt, flags, true, quiet);
562     if (!blk) {
563         return 1;
564     }
565     bs = blk_bs(blk);
566 
567     check = g_new0(ImageCheck, 1);
568     ret = collect_image_check(bs, check, filename, fmt, fix);
569 
570     if (ret == -ENOTSUP) {
571         error_report("This image format does not support checks");
572         ret = 63;
573         goto fail;
574     }
575 
576     if (check->corruptions_fixed || check->leaks_fixed) {
577         int corruptions_fixed, leaks_fixed;
578 
579         leaks_fixed         = check->leaks_fixed;
580         corruptions_fixed   = check->corruptions_fixed;
581 
582         if (output_format == OFORMAT_HUMAN) {
583             qprintf(quiet,
584                     "The following inconsistencies were found and repaired:\n\n"
585                     "    %" PRId64 " leaked clusters\n"
586                     "    %" PRId64 " corruptions\n\n"
587                     "Double checking the fixed image now...\n",
588                     check->leaks_fixed,
589                     check->corruptions_fixed);
590         }
591 
592         ret = collect_image_check(bs, check, filename, fmt, 0);
593 
594         check->leaks_fixed          = leaks_fixed;
595         check->corruptions_fixed    = corruptions_fixed;
596     }
597 
598     if (!ret) {
599         switch (output_format) {
600         case OFORMAT_HUMAN:
601             dump_human_image_check(check, quiet);
602             break;
603         case OFORMAT_JSON:
604             dump_json_image_check(check, quiet);
605             break;
606         }
607     }
608 
609     if (ret || check->check_errors) {
610         if (ret) {
611             error_report("Check failed: %s", strerror(-ret));
612         } else {
613             error_report("Check failed");
614         }
615         ret = 1;
616         goto fail;
617     }
618 
619     if (check->corruptions) {
620         ret = 2;
621     } else if (check->leaks) {
622         ret = 3;
623     } else {
624         ret = 0;
625     }
626 
627 fail:
628     qapi_free_ImageCheck(check);
629     blk_unref(blk);
630     return ret;
631 }
632 
633 typedef struct CommonBlockJobCBInfo {
634     BlockDriverState *bs;
635     Error **errp;
636 } CommonBlockJobCBInfo;
637 
638 static void common_block_job_cb(void *opaque, int ret)
639 {
640     CommonBlockJobCBInfo *cbi = opaque;
641 
642     if (ret < 0) {
643         error_setg_errno(cbi->errp, -ret, "Block job failed");
644     }
645 }
646 
647 static void run_block_job(BlockJob *job, Error **errp)
648 {
649     AioContext *aio_context = bdrv_get_aio_context(job->bs);
650 
651     do {
652         aio_poll(aio_context, true);
653         qemu_progress_print(job->len ?
654                             ((float)job->offset / job->len * 100.f) : 0.0f, 0);
655     } while (!job->ready);
656 
657     block_job_complete_sync(job, errp);
658 
659     /* A block job may finish instantaneously without publishing any progress,
660      * so just signal completion here */
661     qemu_progress_print(100.f, 0);
662 }
663 
664 static int img_commit(int argc, char **argv)
665 {
666     int c, ret, flags;
667     const char *filename, *fmt, *cache, *base;
668     BlockBackend *blk;
669     BlockDriverState *bs, *base_bs;
670     bool progress = false, quiet = false, drop = false;
671     Error *local_err = NULL;
672     CommonBlockJobCBInfo cbi;
673 
674     fmt = NULL;
675     cache = BDRV_DEFAULT_CACHE;
676     base = NULL;
677     for(;;) {
678         c = getopt(argc, argv, "f:ht:b:dpq");
679         if (c == -1) {
680             break;
681         }
682         switch(c) {
683         case '?':
684         case 'h':
685             help();
686             break;
687         case 'f':
688             fmt = optarg;
689             break;
690         case 't':
691             cache = optarg;
692             break;
693         case 'b':
694             base = optarg;
695             /* -b implies -d */
696             drop = true;
697             break;
698         case 'd':
699             drop = true;
700             break;
701         case 'p':
702             progress = true;
703             break;
704         case 'q':
705             quiet = true;
706             break;
707         }
708     }
709 
710     /* Progress is not shown in Quiet mode */
711     if (quiet) {
712         progress = false;
713     }
714 
715     if (optind != argc - 1) {
716         error_exit("Expecting one image file name");
717     }
718     filename = argv[optind++];
719 
720     flags = BDRV_O_RDWR | BDRV_O_UNMAP;
721     ret = bdrv_parse_cache_flags(cache, &flags);
722     if (ret < 0) {
723         error_report("Invalid cache option: %s", cache);
724         return 1;
725     }
726 
727     blk = img_open("image", filename, fmt, flags, true, quiet);
728     if (!blk) {
729         return 1;
730     }
731     bs = blk_bs(blk);
732 
733     qemu_progress_init(progress, 1.f);
734     qemu_progress_print(0.f, 100);
735 
736     if (base) {
737         base_bs = bdrv_find_backing_image(bs, base);
738         if (!base_bs) {
739             error_setg(&local_err, QERR_BASE_NOT_FOUND, base);
740             goto done;
741         }
742     } else {
743         /* This is different from QMP, which by default uses the deepest file in
744          * the backing chain (i.e., the very base); however, the traditional
745          * behavior of qemu-img commit is using the immediate backing file. */
746         base_bs = backing_bs(bs);
747         if (!base_bs) {
748             error_setg(&local_err, "Image does not have a backing file");
749             goto done;
750         }
751     }
752 
753     cbi = (CommonBlockJobCBInfo){
754         .errp = &local_err,
755         .bs   = bs,
756     };
757 
758     commit_active_start(bs, base_bs, 0, BLOCKDEV_ON_ERROR_REPORT,
759                         common_block_job_cb, &cbi, &local_err);
760     if (local_err) {
761         goto done;
762     }
763 
764     /* When the block job completes, the BlockBackend reference will point to
765      * the old backing file. In order to avoid that the top image is already
766      * deleted, so we can still empty it afterwards, increment the reference
767      * counter here preemptively. */
768     if (!drop) {
769         bdrv_ref(bs);
770     }
771 
772     run_block_job(bs->job, &local_err);
773     if (local_err) {
774         goto unref_backing;
775     }
776 
777     if (!drop && bs->drv->bdrv_make_empty) {
778         ret = bs->drv->bdrv_make_empty(bs);
779         if (ret) {
780             error_setg_errno(&local_err, -ret, "Could not empty %s",
781                              filename);
782             goto unref_backing;
783         }
784     }
785 
786 unref_backing:
787     if (!drop) {
788         bdrv_unref(bs);
789     }
790 
791 done:
792     qemu_progress_end();
793 
794     blk_unref(blk);
795 
796     if (local_err) {
797         error_report_err(local_err);
798         return 1;
799     }
800 
801     qprintf(quiet, "Image committed.\n");
802     return 0;
803 }
804 
805 /*
806  * Returns true iff the first sector pointed to by 'buf' contains at least
807  * a non-NUL byte.
808  *
809  * 'pnum' is set to the number of sectors (including and immediately following
810  * the first one) that are known to be in the same allocated/unallocated state.
811  */
812 static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
813 {
814     bool is_zero;
815     int i;
816 
817     if (n <= 0) {
818         *pnum = 0;
819         return 0;
820     }
821     is_zero = buffer_is_zero(buf, 512);
822     for(i = 1; i < n; i++) {
823         buf += 512;
824         if (is_zero != buffer_is_zero(buf, 512)) {
825             break;
826         }
827     }
828     *pnum = i;
829     return !is_zero;
830 }
831 
832 /*
833  * Like is_allocated_sectors, but if the buffer starts with a used sector,
834  * up to 'min' consecutive sectors containing zeros are ignored. This avoids
835  * breaking up write requests for only small sparse areas.
836  */
837 static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
838     int min)
839 {
840     int ret;
841     int num_checked, num_used;
842 
843     if (n < min) {
844         min = n;
845     }
846 
847     ret = is_allocated_sectors(buf, n, pnum);
848     if (!ret) {
849         return ret;
850     }
851 
852     num_used = *pnum;
853     buf += BDRV_SECTOR_SIZE * *pnum;
854     n -= *pnum;
855     num_checked = num_used;
856 
857     while (n > 0) {
858         ret = is_allocated_sectors(buf, n, pnum);
859 
860         buf += BDRV_SECTOR_SIZE * *pnum;
861         n -= *pnum;
862         num_checked += *pnum;
863         if (ret) {
864             num_used = num_checked;
865         } else if (*pnum >= min) {
866             break;
867         }
868     }
869 
870     *pnum = num_used;
871     return 1;
872 }
873 
874 /*
875  * Compares two buffers sector by sector. Returns 0 if the first sector of both
876  * buffers matches, non-zero otherwise.
877  *
878  * pnum is set to the number of sectors (including and immediately following
879  * the first one) that are known to have the same comparison result
880  */
881 static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
882     int *pnum)
883 {
884     bool res;
885     int i;
886 
887     if (n <= 0) {
888         *pnum = 0;
889         return 0;
890     }
891 
892     res = !!memcmp(buf1, buf2, 512);
893     for(i = 1; i < n; i++) {
894         buf1 += 512;
895         buf2 += 512;
896 
897         if (!!memcmp(buf1, buf2, 512) != res) {
898             break;
899         }
900     }
901 
902     *pnum = i;
903     return res;
904 }
905 
906 #define IO_BUF_SIZE (2 * 1024 * 1024)
907 
908 static int64_t sectors_to_bytes(int64_t sectors)
909 {
910     return sectors << BDRV_SECTOR_BITS;
911 }
912 
913 static int64_t sectors_to_process(int64_t total, int64_t from)
914 {
915     return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
916 }
917 
918 /*
919  * Check if passed sectors are empty (not allocated or contain only 0 bytes)
920  *
921  * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
922  * data and negative value on error.
923  *
924  * @param blk:  BlockBackend for the image
925  * @param sect_num: Number of first sector to check
926  * @param sect_count: Number of sectors to check
927  * @param filename: Name of disk file we are checking (logging purpose)
928  * @param buffer: Allocated buffer for storing read data
929  * @param quiet: Flag for quiet mode
930  */
931 static int check_empty_sectors(BlockBackend *blk, int64_t sect_num,
932                                int sect_count, const char *filename,
933                                uint8_t *buffer, bool quiet)
934 {
935     int pnum, ret = 0;
936     ret = blk_read(blk, sect_num, buffer, sect_count);
937     if (ret < 0) {
938         error_report("Error while reading offset %" PRId64 " of %s: %s",
939                      sectors_to_bytes(sect_num), filename, strerror(-ret));
940         return ret;
941     }
942     ret = is_allocated_sectors(buffer, sect_count, &pnum);
943     if (ret || pnum != sect_count) {
944         qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
945                 sectors_to_bytes(ret ? sect_num : sect_num + pnum));
946         return 1;
947     }
948 
949     return 0;
950 }
951 
952 /*
953  * Compares two images. Exit codes:
954  *
955  * 0 - Images are identical
956  * 1 - Images differ
957  * >1 - Error occurred
958  */
959 static int img_compare(int argc, char **argv)
960 {
961     const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
962     BlockBackend *blk1, *blk2;
963     BlockDriverState *bs1, *bs2;
964     int64_t total_sectors1, total_sectors2;
965     uint8_t *buf1 = NULL, *buf2 = NULL;
966     int pnum1, pnum2;
967     int allocated1, allocated2;
968     int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
969     bool progress = false, quiet = false, strict = false;
970     int flags;
971     int64_t total_sectors;
972     int64_t sector_num = 0;
973     int64_t nb_sectors;
974     int c, pnum;
975     uint64_t progress_base;
976 
977     cache = BDRV_DEFAULT_CACHE;
978     for (;;) {
979         c = getopt(argc, argv, "hf:F:T:pqs");
980         if (c == -1) {
981             break;
982         }
983         switch (c) {
984         case '?':
985         case 'h':
986             help();
987             break;
988         case 'f':
989             fmt1 = optarg;
990             break;
991         case 'F':
992             fmt2 = optarg;
993             break;
994         case 'T':
995             cache = optarg;
996             break;
997         case 'p':
998             progress = true;
999             break;
1000         case 'q':
1001             quiet = true;
1002             break;
1003         case 's':
1004             strict = true;
1005             break;
1006         }
1007     }
1008 
1009     /* Progress is not shown in Quiet mode */
1010     if (quiet) {
1011         progress = false;
1012     }
1013 
1014 
1015     if (optind != argc - 2) {
1016         error_exit("Expecting two image file names");
1017     }
1018     filename1 = argv[optind++];
1019     filename2 = argv[optind++];
1020 
1021     /* Initialize before goto out */
1022     qemu_progress_init(progress, 2.0);
1023 
1024     flags = BDRV_O_FLAGS;
1025     ret = bdrv_parse_cache_flags(cache, &flags);
1026     if (ret < 0) {
1027         error_report("Invalid source cache option: %s", cache);
1028         ret = 2;
1029         goto out3;
1030     }
1031 
1032     blk1 = img_open("image_1", filename1, fmt1, flags, true, quiet);
1033     if (!blk1) {
1034         ret = 2;
1035         goto out3;
1036     }
1037     bs1 = blk_bs(blk1);
1038 
1039     blk2 = img_open("image_2", filename2, fmt2, flags, true, quiet);
1040     if (!blk2) {
1041         ret = 2;
1042         goto out2;
1043     }
1044     bs2 = blk_bs(blk2);
1045 
1046     buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
1047     buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
1048     total_sectors1 = blk_nb_sectors(blk1);
1049     if (total_sectors1 < 0) {
1050         error_report("Can't get size of %s: %s",
1051                      filename1, strerror(-total_sectors1));
1052         ret = 4;
1053         goto out;
1054     }
1055     total_sectors2 = blk_nb_sectors(blk2);
1056     if (total_sectors2 < 0) {
1057         error_report("Can't get size of %s: %s",
1058                      filename2, strerror(-total_sectors2));
1059         ret = 4;
1060         goto out;
1061     }
1062     total_sectors = MIN(total_sectors1, total_sectors2);
1063     progress_base = MAX(total_sectors1, total_sectors2);
1064 
1065     qemu_progress_print(0, 100);
1066 
1067     if (strict && total_sectors1 != total_sectors2) {
1068         ret = 1;
1069         qprintf(quiet, "Strict mode: Image size mismatch!\n");
1070         goto out;
1071     }
1072 
1073     for (;;) {
1074         int64_t status1, status2;
1075         nb_sectors = sectors_to_process(total_sectors, sector_num);
1076         if (nb_sectors <= 0) {
1077             break;
1078         }
1079         status1 = bdrv_get_block_status_above(bs1, NULL, sector_num,
1080                                               total_sectors1 - sector_num,
1081                                               &pnum1);
1082         if (status1 < 0) {
1083             ret = 3;
1084             error_report("Sector allocation test failed for %s", filename1);
1085             goto out;
1086         }
1087         allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
1088 
1089         status2 = bdrv_get_block_status_above(bs2, NULL, sector_num,
1090                                               total_sectors2 - sector_num,
1091                                               &pnum2);
1092         if (status2 < 0) {
1093             ret = 3;
1094             error_report("Sector allocation test failed for %s", filename2);
1095             goto out;
1096         }
1097         allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
1098         if (pnum1) {
1099             nb_sectors = MIN(nb_sectors, pnum1);
1100         }
1101         if (pnum2) {
1102             nb_sectors = MIN(nb_sectors, pnum2);
1103         }
1104 
1105         if (strict) {
1106             if ((status1 & ~BDRV_BLOCK_OFFSET_MASK) !=
1107                 (status2 & ~BDRV_BLOCK_OFFSET_MASK)) {
1108                 ret = 1;
1109                 qprintf(quiet, "Strict mode: Offset %" PRId64
1110                         " block status mismatch!\n",
1111                         sectors_to_bytes(sector_num));
1112                 goto out;
1113             }
1114         }
1115         if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
1116             nb_sectors = MIN(pnum1, pnum2);
1117         } else if (allocated1 == allocated2) {
1118             if (allocated1) {
1119                 ret = blk_read(blk1, sector_num, buf1, nb_sectors);
1120                 if (ret < 0) {
1121                     error_report("Error while reading offset %" PRId64 " of %s:"
1122                                  " %s", sectors_to_bytes(sector_num), filename1,
1123                                  strerror(-ret));
1124                     ret = 4;
1125                     goto out;
1126                 }
1127                 ret = blk_read(blk2, sector_num, buf2, nb_sectors);
1128                 if (ret < 0) {
1129                     error_report("Error while reading offset %" PRId64
1130                                  " of %s: %s", sectors_to_bytes(sector_num),
1131                                  filename2, strerror(-ret));
1132                     ret = 4;
1133                     goto out;
1134                 }
1135                 ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
1136                 if (ret || pnum != nb_sectors) {
1137                     qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1138                             sectors_to_bytes(
1139                                 ret ? sector_num : sector_num + pnum));
1140                     ret = 1;
1141                     goto out;
1142                 }
1143             }
1144         } else {
1145 
1146             if (allocated1) {
1147                 ret = check_empty_sectors(blk1, sector_num, nb_sectors,
1148                                           filename1, buf1, quiet);
1149             } else {
1150                 ret = check_empty_sectors(blk2, sector_num, nb_sectors,
1151                                           filename2, buf1, quiet);
1152             }
1153             if (ret) {
1154                 if (ret < 0) {
1155                     error_report("Error while reading offset %" PRId64 ": %s",
1156                                  sectors_to_bytes(sector_num), strerror(-ret));
1157                     ret = 4;
1158                 }
1159                 goto out;
1160             }
1161         }
1162         sector_num += nb_sectors;
1163         qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1164     }
1165 
1166     if (total_sectors1 != total_sectors2) {
1167         BlockBackend *blk_over;
1168         int64_t total_sectors_over;
1169         const char *filename_over;
1170 
1171         qprintf(quiet, "Warning: Image size mismatch!\n");
1172         if (total_sectors1 > total_sectors2) {
1173             total_sectors_over = total_sectors1;
1174             blk_over = blk1;
1175             filename_over = filename1;
1176         } else {
1177             total_sectors_over = total_sectors2;
1178             blk_over = blk2;
1179             filename_over = filename2;
1180         }
1181 
1182         for (;;) {
1183             nb_sectors = sectors_to_process(total_sectors_over, sector_num);
1184             if (nb_sectors <= 0) {
1185                 break;
1186             }
1187             ret = bdrv_is_allocated_above(blk_bs(blk_over), NULL, sector_num,
1188                                           nb_sectors, &pnum);
1189             if (ret < 0) {
1190                 ret = 3;
1191                 error_report("Sector allocation test failed for %s",
1192                              filename_over);
1193                 goto out;
1194 
1195             }
1196             nb_sectors = pnum;
1197             if (ret) {
1198                 ret = check_empty_sectors(blk_over, sector_num, nb_sectors,
1199                                           filename_over, buf1, quiet);
1200                 if (ret) {
1201                     if (ret < 0) {
1202                         error_report("Error while reading offset %" PRId64
1203                                      " of %s: %s", sectors_to_bytes(sector_num),
1204                                      filename_over, strerror(-ret));
1205                         ret = 4;
1206                     }
1207                     goto out;
1208                 }
1209             }
1210             sector_num += nb_sectors;
1211             qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1212         }
1213     }
1214 
1215     qprintf(quiet, "Images are identical.\n");
1216     ret = 0;
1217 
1218 out:
1219     qemu_vfree(buf1);
1220     qemu_vfree(buf2);
1221     blk_unref(blk2);
1222 out2:
1223     blk_unref(blk1);
1224 out3:
1225     qemu_progress_end();
1226     return ret;
1227 }
1228 
1229 enum ImgConvertBlockStatus {
1230     BLK_DATA,
1231     BLK_ZERO,
1232     BLK_BACKING_FILE,
1233 };
1234 
1235 typedef struct ImgConvertState {
1236     BlockBackend **src;
1237     int64_t *src_sectors;
1238     int src_cur, src_num;
1239     int64_t src_cur_offset;
1240     int64_t total_sectors;
1241     int64_t allocated_sectors;
1242     enum ImgConvertBlockStatus status;
1243     int64_t sector_next_status;
1244     BlockBackend *target;
1245     bool has_zero_init;
1246     bool compressed;
1247     bool target_has_backing;
1248     int min_sparse;
1249     size_t cluster_sectors;
1250     size_t buf_sectors;
1251 } ImgConvertState;
1252 
1253 static void convert_select_part(ImgConvertState *s, int64_t sector_num)
1254 {
1255     assert(sector_num >= s->src_cur_offset);
1256     while (sector_num - s->src_cur_offset >= s->src_sectors[s->src_cur]) {
1257         s->src_cur_offset += s->src_sectors[s->src_cur];
1258         s->src_cur++;
1259         assert(s->src_cur < s->src_num);
1260     }
1261 }
1262 
1263 static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
1264 {
1265     int64_t ret;
1266     int n;
1267 
1268     convert_select_part(s, sector_num);
1269 
1270     assert(s->total_sectors > sector_num);
1271     n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
1272 
1273     if (s->sector_next_status <= sector_num) {
1274         ret = bdrv_get_block_status(blk_bs(s->src[s->src_cur]),
1275                                     sector_num - s->src_cur_offset,
1276                                     n, &n);
1277         if (ret < 0) {
1278             return ret;
1279         }
1280 
1281         if (ret & BDRV_BLOCK_ZERO) {
1282             s->status = BLK_ZERO;
1283         } else if (ret & BDRV_BLOCK_DATA) {
1284             s->status = BLK_DATA;
1285         } else if (!s->target_has_backing) {
1286             /* Without a target backing file we must copy over the contents of
1287              * the backing file as well. */
1288             /* TODO Check block status of the backing file chain to avoid
1289              * needlessly reading zeroes and limiting the iteration to the
1290              * buffer size */
1291             s->status = BLK_DATA;
1292         } else {
1293             s->status = BLK_BACKING_FILE;
1294         }
1295 
1296         s->sector_next_status = sector_num + n;
1297     }
1298 
1299     n = MIN(n, s->sector_next_status - sector_num);
1300     if (s->status == BLK_DATA) {
1301         n = MIN(n, s->buf_sectors);
1302     }
1303 
1304     /* We need to write complete clusters for compressed images, so if an
1305      * unallocated area is shorter than that, we must consider the whole
1306      * cluster allocated. */
1307     if (s->compressed) {
1308         if (n < s->cluster_sectors) {
1309             n = MIN(s->cluster_sectors, s->total_sectors - sector_num);
1310             s->status = BLK_DATA;
1311         } else {
1312             n = QEMU_ALIGN_DOWN(n, s->cluster_sectors);
1313         }
1314     }
1315 
1316     return n;
1317 }
1318 
1319 static int convert_read(ImgConvertState *s, int64_t sector_num, int nb_sectors,
1320                         uint8_t *buf)
1321 {
1322     int n;
1323     int ret;
1324 
1325     if (s->status == BLK_ZERO || s->status == BLK_BACKING_FILE) {
1326         return 0;
1327     }
1328 
1329     assert(nb_sectors <= s->buf_sectors);
1330     while (nb_sectors > 0) {
1331         BlockBackend *blk;
1332         int64_t bs_sectors;
1333 
1334         /* In the case of compression with multiple source files, we can get a
1335          * nb_sectors that spreads into the next part. So we must be able to
1336          * read across multiple BDSes for one convert_read() call. */
1337         convert_select_part(s, sector_num);
1338         blk = s->src[s->src_cur];
1339         bs_sectors = s->src_sectors[s->src_cur];
1340 
1341         n = MIN(nb_sectors, bs_sectors - (sector_num - s->src_cur_offset));
1342         ret = blk_read(blk, sector_num - s->src_cur_offset, buf, n);
1343         if (ret < 0) {
1344             return ret;
1345         }
1346 
1347         sector_num += n;
1348         nb_sectors -= n;
1349         buf += n * BDRV_SECTOR_SIZE;
1350     }
1351 
1352     return 0;
1353 }
1354 
1355 static int convert_write(ImgConvertState *s, int64_t sector_num, int nb_sectors,
1356                          const uint8_t *buf)
1357 {
1358     int ret;
1359 
1360     while (nb_sectors > 0) {
1361         int n = nb_sectors;
1362 
1363         switch (s->status) {
1364         case BLK_BACKING_FILE:
1365             /* If we have a backing file, leave clusters unallocated that are
1366              * unallocated in the source image, so that the backing file is
1367              * visible at the respective offset. */
1368             assert(s->target_has_backing);
1369             break;
1370 
1371         case BLK_DATA:
1372             /* We must always write compressed clusters as a whole, so don't
1373              * try to find zeroed parts in the buffer. We can only save the
1374              * write if the buffer is completely zeroed and we're allowed to
1375              * keep the target sparse. */
1376             if (s->compressed) {
1377                 if (s->has_zero_init && s->min_sparse &&
1378                     buffer_is_zero(buf, n * BDRV_SECTOR_SIZE))
1379                 {
1380                     assert(!s->target_has_backing);
1381                     break;
1382                 }
1383 
1384                 ret = blk_write_compressed(s->target, sector_num, buf, n);
1385                 if (ret < 0) {
1386                     return ret;
1387                 }
1388                 break;
1389             }
1390 
1391             /* If there is real non-zero data or we're told to keep the target
1392              * fully allocated (-S 0), we must write it. Otherwise we can treat
1393              * it as zero sectors. */
1394             if (!s->min_sparse ||
1395                 is_allocated_sectors_min(buf, n, &n, s->min_sparse))
1396             {
1397                 ret = blk_write(s->target, sector_num, buf, n);
1398                 if (ret < 0) {
1399                     return ret;
1400                 }
1401                 break;
1402             }
1403             /* fall-through */
1404 
1405         case BLK_ZERO:
1406             if (s->has_zero_init) {
1407                 break;
1408             }
1409             ret = blk_write_zeroes(s->target, sector_num, n, 0);
1410             if (ret < 0) {
1411                 return ret;
1412             }
1413             break;
1414         }
1415 
1416         sector_num += n;
1417         nb_sectors -= n;
1418         buf += n * BDRV_SECTOR_SIZE;
1419     }
1420 
1421     return 0;
1422 }
1423 
1424 static int convert_do_copy(ImgConvertState *s)
1425 {
1426     uint8_t *buf = NULL;
1427     int64_t sector_num, allocated_done;
1428     int ret;
1429     int n;
1430 
1431     /* Check whether we have zero initialisation or can get it efficiently */
1432     s->has_zero_init = s->min_sparse && !s->target_has_backing
1433                      ? bdrv_has_zero_init(blk_bs(s->target))
1434                      : false;
1435 
1436     if (!s->has_zero_init && !s->target_has_backing &&
1437         bdrv_can_write_zeroes_with_unmap(blk_bs(s->target)))
1438     {
1439         ret = bdrv_make_zero(blk_bs(s->target), BDRV_REQ_MAY_UNMAP);
1440         if (ret == 0) {
1441             s->has_zero_init = true;
1442         }
1443     }
1444 
1445     /* Allocate buffer for copied data. For compressed images, only one cluster
1446      * can be copied at a time. */
1447     if (s->compressed) {
1448         if (s->cluster_sectors <= 0 || s->cluster_sectors > s->buf_sectors) {
1449             error_report("invalid cluster size");
1450             ret = -EINVAL;
1451             goto fail;
1452         }
1453         s->buf_sectors = s->cluster_sectors;
1454     }
1455     buf = blk_blockalign(s->target, s->buf_sectors * BDRV_SECTOR_SIZE);
1456 
1457     /* Calculate allocated sectors for progress */
1458     s->allocated_sectors = 0;
1459     sector_num = 0;
1460     while (sector_num < s->total_sectors) {
1461         n = convert_iteration_sectors(s, sector_num);
1462         if (n < 0) {
1463             ret = n;
1464             goto fail;
1465         }
1466         if (s->status == BLK_DATA) {
1467             s->allocated_sectors += n;
1468         }
1469         sector_num += n;
1470     }
1471 
1472     /* Do the copy */
1473     s->src_cur = 0;
1474     s->src_cur_offset = 0;
1475     s->sector_next_status = 0;
1476 
1477     sector_num = 0;
1478     allocated_done = 0;
1479 
1480     while (sector_num < s->total_sectors) {
1481         n = convert_iteration_sectors(s, sector_num);
1482         if (n < 0) {
1483             ret = n;
1484             goto fail;
1485         }
1486         if (s->status == BLK_DATA) {
1487             allocated_done += n;
1488             qemu_progress_print(100.0 * allocated_done / s->allocated_sectors,
1489                                 0);
1490         }
1491 
1492         ret = convert_read(s, sector_num, n, buf);
1493         if (ret < 0) {
1494             error_report("error while reading sector %" PRId64
1495                          ": %s", sector_num, strerror(-ret));
1496             goto fail;
1497         }
1498 
1499         ret = convert_write(s, sector_num, n, buf);
1500         if (ret < 0) {
1501             error_report("error while writing sector %" PRId64
1502                          ": %s", sector_num, strerror(-ret));
1503             goto fail;
1504         }
1505 
1506         sector_num += n;
1507     }
1508 
1509     if (s->compressed) {
1510         /* signal EOF to align */
1511         ret = blk_write_compressed(s->target, 0, NULL, 0);
1512         if (ret < 0) {
1513             goto fail;
1514         }
1515     }
1516 
1517     ret = 0;
1518 fail:
1519     qemu_vfree(buf);
1520     return ret;
1521 }
1522 
1523 static int img_convert(int argc, char **argv)
1524 {
1525     int c, bs_n, bs_i, compress, cluster_sectors, skip_create;
1526     int64_t ret = 0;
1527     int progress = 0, flags, src_flags;
1528     const char *fmt, *out_fmt, *cache, *src_cache, *out_baseimg, *out_filename;
1529     BlockDriver *drv, *proto_drv;
1530     BlockBackend **blk = NULL, *out_blk = NULL;
1531     BlockDriverState **bs = NULL, *out_bs = NULL;
1532     int64_t total_sectors;
1533     int64_t *bs_sectors = NULL;
1534     size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
1535     BlockDriverInfo bdi;
1536     QemuOpts *opts = NULL;
1537     QemuOptsList *create_opts = NULL;
1538     const char *out_baseimg_param;
1539     char *options = NULL;
1540     const char *snapshot_name = NULL;
1541     int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
1542     bool quiet = false;
1543     Error *local_err = NULL;
1544     QemuOpts *sn_opts = NULL;
1545     ImgConvertState state;
1546 
1547     fmt = NULL;
1548     out_fmt = "raw";
1549     cache = "unsafe";
1550     src_cache = BDRV_DEFAULT_CACHE;
1551     out_baseimg = NULL;
1552     compress = 0;
1553     skip_create = 0;
1554     for(;;) {
1555         c = getopt(argc, argv, "hf:O:B:ce6o:s:l:S:pt:T:qn");
1556         if (c == -1) {
1557             break;
1558         }
1559         switch(c) {
1560         case '?':
1561         case 'h':
1562             help();
1563             break;
1564         case 'f':
1565             fmt = optarg;
1566             break;
1567         case 'O':
1568             out_fmt = optarg;
1569             break;
1570         case 'B':
1571             out_baseimg = optarg;
1572             break;
1573         case 'c':
1574             compress = 1;
1575             break;
1576         case 'e':
1577             error_report("option -e is deprecated, please use \'-o "
1578                   "encryption\' instead!");
1579             ret = -1;
1580             goto fail_getopt;
1581         case '6':
1582             error_report("option -6 is deprecated, please use \'-o "
1583                   "compat6\' instead!");
1584             ret = -1;
1585             goto fail_getopt;
1586         case 'o':
1587             if (!is_valid_option_list(optarg)) {
1588                 error_report("Invalid option list: %s", optarg);
1589                 ret = -1;
1590                 goto fail_getopt;
1591             }
1592             if (!options) {
1593                 options = g_strdup(optarg);
1594             } else {
1595                 char *old_options = options;
1596                 options = g_strdup_printf("%s,%s", options, optarg);
1597                 g_free(old_options);
1598             }
1599             break;
1600         case 's':
1601             snapshot_name = optarg;
1602             break;
1603         case 'l':
1604             if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
1605                 sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
1606                                                   optarg, false);
1607                 if (!sn_opts) {
1608                     error_report("Failed in parsing snapshot param '%s'",
1609                                  optarg);
1610                     ret = -1;
1611                     goto fail_getopt;
1612                 }
1613             } else {
1614                 snapshot_name = optarg;
1615             }
1616             break;
1617         case 'S':
1618         {
1619             int64_t sval;
1620             char *end;
1621             sval = qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUFFIX_B);
1622             if (sval < 0 || *end) {
1623                 error_report("Invalid minimum zero buffer size for sparse output specified");
1624                 ret = -1;
1625                 goto fail_getopt;
1626             }
1627 
1628             min_sparse = sval / BDRV_SECTOR_SIZE;
1629             break;
1630         }
1631         case 'p':
1632             progress = 1;
1633             break;
1634         case 't':
1635             cache = optarg;
1636             break;
1637         case 'T':
1638             src_cache = optarg;
1639             break;
1640         case 'q':
1641             quiet = true;
1642             break;
1643         case 'n':
1644             skip_create = 1;
1645             break;
1646         }
1647     }
1648 
1649     /* Initialize before goto out */
1650     if (quiet) {
1651         progress = 0;
1652     }
1653     qemu_progress_init(progress, 1.0);
1654 
1655 
1656     bs_n = argc - optind - 1;
1657     out_filename = bs_n >= 1 ? argv[argc - 1] : NULL;
1658 
1659     if (options && has_help_option(options)) {
1660         ret = print_block_option_help(out_filename, out_fmt);
1661         goto out;
1662     }
1663 
1664     if (bs_n < 1) {
1665         error_exit("Must specify image file name");
1666     }
1667 
1668 
1669     if (bs_n > 1 && out_baseimg) {
1670         error_report("-B makes no sense when concatenating multiple input "
1671                      "images");
1672         ret = -1;
1673         goto out;
1674     }
1675 
1676     src_flags = BDRV_O_FLAGS;
1677     ret = bdrv_parse_cache_flags(src_cache, &src_flags);
1678     if (ret < 0) {
1679         error_report("Invalid source cache option: %s", src_cache);
1680         goto out;
1681     }
1682 
1683     qemu_progress_print(0, 100);
1684 
1685     blk = g_new0(BlockBackend *, bs_n);
1686     bs = g_new0(BlockDriverState *, bs_n);
1687     bs_sectors = g_new(int64_t, bs_n);
1688 
1689     total_sectors = 0;
1690     for (bs_i = 0; bs_i < bs_n; bs_i++) {
1691         char *id = bs_n > 1 ? g_strdup_printf("source_%d", bs_i)
1692                             : g_strdup("source");
1693         blk[bs_i] = img_open(id, argv[optind + bs_i], fmt, src_flags,
1694                              true, quiet);
1695         g_free(id);
1696         if (!blk[bs_i]) {
1697             ret = -1;
1698             goto out;
1699         }
1700         bs[bs_i] = blk_bs(blk[bs_i]);
1701         bs_sectors[bs_i] = blk_nb_sectors(blk[bs_i]);
1702         if (bs_sectors[bs_i] < 0) {
1703             error_report("Could not get size of %s: %s",
1704                          argv[optind + bs_i], strerror(-bs_sectors[bs_i]));
1705             ret = -1;
1706             goto out;
1707         }
1708         total_sectors += bs_sectors[bs_i];
1709     }
1710 
1711     if (sn_opts) {
1712         ret = bdrv_snapshot_load_tmp(bs[0],
1713                                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
1714                                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
1715                                      &local_err);
1716     } else if (snapshot_name != NULL) {
1717         if (bs_n > 1) {
1718             error_report("No support for concatenating multiple snapshot");
1719             ret = -1;
1720             goto out;
1721         }
1722 
1723         bdrv_snapshot_load_tmp_by_id_or_name(bs[0], snapshot_name, &local_err);
1724     }
1725     if (local_err) {
1726         error_reportf_err(local_err, "Failed to load snapshot: ");
1727         ret = -1;
1728         goto out;
1729     }
1730 
1731     /* Find driver and parse its options */
1732     drv = bdrv_find_format(out_fmt);
1733     if (!drv) {
1734         error_report("Unknown file format '%s'", out_fmt);
1735         ret = -1;
1736         goto out;
1737     }
1738 
1739     proto_drv = bdrv_find_protocol(out_filename, true, &local_err);
1740     if (!proto_drv) {
1741         error_report_err(local_err);
1742         ret = -1;
1743         goto out;
1744     }
1745 
1746     if (!skip_create) {
1747         if (!drv->create_opts) {
1748             error_report("Format driver '%s' does not support image creation",
1749                          drv->format_name);
1750             ret = -1;
1751             goto out;
1752         }
1753 
1754         if (!proto_drv->create_opts) {
1755             error_report("Protocol driver '%s' does not support image creation",
1756                          proto_drv->format_name);
1757             ret = -1;
1758             goto out;
1759         }
1760 
1761         create_opts = qemu_opts_append(create_opts, drv->create_opts);
1762         create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
1763 
1764         opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
1765         if (options) {
1766             qemu_opts_do_parse(opts, options, NULL, &local_err);
1767             if (local_err) {
1768                 error_report_err(local_err);
1769                 ret = -1;
1770                 goto out;
1771             }
1772         }
1773 
1774         qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_sectors * 512,
1775                             &error_abort);
1776         ret = add_old_style_options(out_fmt, opts, out_baseimg, NULL);
1777         if (ret < 0) {
1778             goto out;
1779         }
1780     }
1781 
1782     /* Get backing file name if -o backing_file was used */
1783     out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
1784     if (out_baseimg_param) {
1785         out_baseimg = out_baseimg_param;
1786     }
1787 
1788     /* Check if compression is supported */
1789     if (compress) {
1790         bool encryption =
1791             qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false);
1792         const char *preallocation =
1793             qemu_opt_get(opts, BLOCK_OPT_PREALLOC);
1794 
1795         if (!drv->bdrv_write_compressed) {
1796             error_report("Compression not supported for this file format");
1797             ret = -1;
1798             goto out;
1799         }
1800 
1801         if (encryption) {
1802             error_report("Compression and encryption not supported at "
1803                          "the same time");
1804             ret = -1;
1805             goto out;
1806         }
1807 
1808         if (preallocation
1809             && strcmp(preallocation, "off"))
1810         {
1811             error_report("Compression and preallocation not supported at "
1812                          "the same time");
1813             ret = -1;
1814             goto out;
1815         }
1816     }
1817 
1818     if (!skip_create) {
1819         /* Create the new image */
1820         ret = bdrv_create(drv, out_filename, opts, &local_err);
1821         if (ret < 0) {
1822             error_reportf_err(local_err, "%s: error while converting %s: ",
1823                               out_filename, out_fmt);
1824             goto out;
1825         }
1826     }
1827 
1828     flags = min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
1829     ret = bdrv_parse_cache_flags(cache, &flags);
1830     if (ret < 0) {
1831         error_report("Invalid cache option: %s", cache);
1832         goto out;
1833     }
1834 
1835     out_blk = img_open("target", out_filename, out_fmt, flags, true, quiet);
1836     if (!out_blk) {
1837         ret = -1;
1838         goto out;
1839     }
1840     out_bs = blk_bs(out_blk);
1841 
1842     /* increase bufsectors from the default 4096 (2M) if opt_transfer_length
1843      * or discard_alignment of the out_bs is greater. Limit to 32768 (16MB)
1844      * as maximum. */
1845     bufsectors = MIN(32768,
1846                      MAX(bufsectors, MAX(out_bs->bl.opt_transfer_length,
1847                                          out_bs->bl.discard_alignment))
1848                     );
1849 
1850     if (skip_create) {
1851         int64_t output_sectors = blk_nb_sectors(out_blk);
1852         if (output_sectors < 0) {
1853             error_report("unable to get output image length: %s",
1854                          strerror(-output_sectors));
1855             ret = -1;
1856             goto out;
1857         } else if (output_sectors < total_sectors) {
1858             error_report("output file is smaller than input file");
1859             ret = -1;
1860             goto out;
1861         }
1862     }
1863 
1864     cluster_sectors = 0;
1865     ret = bdrv_get_info(out_bs, &bdi);
1866     if (ret < 0) {
1867         if (compress) {
1868             error_report("could not get block driver info");
1869             goto out;
1870         }
1871     } else {
1872         compress = compress || bdi.needs_compressed_writes;
1873         cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE;
1874     }
1875 
1876     state = (ImgConvertState) {
1877         .src                = blk,
1878         .src_sectors        = bs_sectors,
1879         .src_num            = bs_n,
1880         .total_sectors      = total_sectors,
1881         .target             = out_blk,
1882         .compressed         = compress,
1883         .target_has_backing = (bool) out_baseimg,
1884         .min_sparse         = min_sparse,
1885         .cluster_sectors    = cluster_sectors,
1886         .buf_sectors        = bufsectors,
1887     };
1888     ret = convert_do_copy(&state);
1889 
1890 out:
1891     if (!ret) {
1892         qemu_progress_print(100, 0);
1893     }
1894     qemu_progress_end();
1895     qemu_opts_del(opts);
1896     qemu_opts_free(create_opts);
1897     qemu_opts_del(sn_opts);
1898     blk_unref(out_blk);
1899     g_free(bs);
1900     if (blk) {
1901         for (bs_i = 0; bs_i < bs_n; bs_i++) {
1902             blk_unref(blk[bs_i]);
1903         }
1904         g_free(blk);
1905     }
1906     g_free(bs_sectors);
1907 fail_getopt:
1908     g_free(options);
1909 
1910     if (ret) {
1911         return 1;
1912     }
1913     return 0;
1914 }
1915 
1916 
1917 static void dump_snapshots(BlockDriverState *bs)
1918 {
1919     QEMUSnapshotInfo *sn_tab, *sn;
1920     int nb_sns, i;
1921 
1922     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1923     if (nb_sns <= 0)
1924         return;
1925     printf("Snapshot list:\n");
1926     bdrv_snapshot_dump(fprintf, stdout, NULL);
1927     printf("\n");
1928     for(i = 0; i < nb_sns; i++) {
1929         sn = &sn_tab[i];
1930         bdrv_snapshot_dump(fprintf, stdout, sn);
1931         printf("\n");
1932     }
1933     g_free(sn_tab);
1934 }
1935 
1936 static void dump_json_image_info_list(ImageInfoList *list)
1937 {
1938     Error *local_err = NULL;
1939     QString *str;
1940     QmpOutputVisitor *ov = qmp_output_visitor_new();
1941     QObject *obj;
1942     visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1943                              &list, NULL, &local_err);
1944     obj = qmp_output_get_qobject(ov);
1945     str = qobject_to_json_pretty(obj);
1946     assert(str != NULL);
1947     printf("%s\n", qstring_get_str(str));
1948     qobject_decref(obj);
1949     qmp_output_visitor_cleanup(ov);
1950     QDECREF(str);
1951 }
1952 
1953 static void dump_json_image_info(ImageInfo *info)
1954 {
1955     Error *local_err = NULL;
1956     QString *str;
1957     QmpOutputVisitor *ov = qmp_output_visitor_new();
1958     QObject *obj;
1959     visit_type_ImageInfo(qmp_output_get_visitor(ov),
1960                          &info, NULL, &local_err);
1961     obj = qmp_output_get_qobject(ov);
1962     str = qobject_to_json_pretty(obj);
1963     assert(str != NULL);
1964     printf("%s\n", qstring_get_str(str));
1965     qobject_decref(obj);
1966     qmp_output_visitor_cleanup(ov);
1967     QDECREF(str);
1968 }
1969 
1970 static void dump_human_image_info_list(ImageInfoList *list)
1971 {
1972     ImageInfoList *elem;
1973     bool delim = false;
1974 
1975     for (elem = list; elem; elem = elem->next) {
1976         if (delim) {
1977             printf("\n");
1978         }
1979         delim = true;
1980 
1981         bdrv_image_info_dump(fprintf, stdout, elem->value);
1982     }
1983 }
1984 
1985 static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1986 {
1987     return strcmp(a, b) == 0;
1988 }
1989 
1990 /**
1991  * Open an image file chain and return an ImageInfoList
1992  *
1993  * @filename: topmost image filename
1994  * @fmt: topmost image format (may be NULL to autodetect)
1995  * @chain: true  - enumerate entire backing file chain
1996  *         false - only topmost image file
1997  *
1998  * Returns a list of ImageInfo objects or NULL if there was an error opening an
1999  * image file.  If there was an error a message will have been printed to
2000  * stderr.
2001  */
2002 static ImageInfoList *collect_image_info_list(const char *filename,
2003                                               const char *fmt,
2004                                               bool chain)
2005 {
2006     ImageInfoList *head = NULL;
2007     ImageInfoList **last = &head;
2008     GHashTable *filenames;
2009     Error *err = NULL;
2010 
2011     filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
2012 
2013     while (filename) {
2014         BlockBackend *blk;
2015         BlockDriverState *bs;
2016         ImageInfo *info;
2017         ImageInfoList *elem;
2018 
2019         if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
2020             error_report("Backing file '%s' creates an infinite loop.",
2021                          filename);
2022             goto err;
2023         }
2024         g_hash_table_insert(filenames, (gpointer)filename, NULL);
2025 
2026         blk = img_open("image", filename, fmt,
2027                        BDRV_O_FLAGS | BDRV_O_NO_BACKING, false, false);
2028         if (!blk) {
2029             goto err;
2030         }
2031         bs = blk_bs(blk);
2032 
2033         bdrv_query_image_info(bs, &info, &err);
2034         if (err) {
2035             error_report_err(err);
2036             blk_unref(blk);
2037             goto err;
2038         }
2039 
2040         elem = g_new0(ImageInfoList, 1);
2041         elem->value = info;
2042         *last = elem;
2043         last = &elem->next;
2044 
2045         blk_unref(blk);
2046 
2047         filename = fmt = NULL;
2048         if (chain) {
2049             if (info->has_full_backing_filename) {
2050                 filename = info->full_backing_filename;
2051             } else if (info->has_backing_filename) {
2052                 error_report("Could not determine absolute backing filename,"
2053                              " but backing filename '%s' present",
2054                              info->backing_filename);
2055                 goto err;
2056             }
2057             if (info->has_backing_filename_format) {
2058                 fmt = info->backing_filename_format;
2059             }
2060         }
2061     }
2062     g_hash_table_destroy(filenames);
2063     return head;
2064 
2065 err:
2066     qapi_free_ImageInfoList(head);
2067     g_hash_table_destroy(filenames);
2068     return NULL;
2069 }
2070 
2071 static int img_info(int argc, char **argv)
2072 {
2073     int c;
2074     OutputFormat output_format = OFORMAT_HUMAN;
2075     bool chain = false;
2076     const char *filename, *fmt, *output;
2077     ImageInfoList *list;
2078 
2079     fmt = NULL;
2080     output = NULL;
2081     for(;;) {
2082         int option_index = 0;
2083         static const struct option long_options[] = {
2084             {"help", no_argument, 0, 'h'},
2085             {"format", required_argument, 0, 'f'},
2086             {"output", required_argument, 0, OPTION_OUTPUT},
2087             {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
2088             {0, 0, 0, 0}
2089         };
2090         c = getopt_long(argc, argv, "f:h",
2091                         long_options, &option_index);
2092         if (c == -1) {
2093             break;
2094         }
2095         switch(c) {
2096         case '?':
2097         case 'h':
2098             help();
2099             break;
2100         case 'f':
2101             fmt = optarg;
2102             break;
2103         case OPTION_OUTPUT:
2104             output = optarg;
2105             break;
2106         case OPTION_BACKING_CHAIN:
2107             chain = true;
2108             break;
2109         }
2110     }
2111     if (optind != argc - 1) {
2112         error_exit("Expecting one image file name");
2113     }
2114     filename = argv[optind++];
2115 
2116     if (output && !strcmp(output, "json")) {
2117         output_format = OFORMAT_JSON;
2118     } else if (output && !strcmp(output, "human")) {
2119         output_format = OFORMAT_HUMAN;
2120     } else if (output) {
2121         error_report("--output must be used with human or json as argument.");
2122         return 1;
2123     }
2124 
2125     list = collect_image_info_list(filename, fmt, chain);
2126     if (!list) {
2127         return 1;
2128     }
2129 
2130     switch (output_format) {
2131     case OFORMAT_HUMAN:
2132         dump_human_image_info_list(list);
2133         break;
2134     case OFORMAT_JSON:
2135         if (chain) {
2136             dump_json_image_info_list(list);
2137         } else {
2138             dump_json_image_info(list->value);
2139         }
2140         break;
2141     }
2142 
2143     qapi_free_ImageInfoList(list);
2144     return 0;
2145 }
2146 
2147 
2148 typedef struct MapEntry {
2149     int flags;
2150     int depth;
2151     int64_t start;
2152     int64_t length;
2153     int64_t offset;
2154     BlockDriverState *bs;
2155 } MapEntry;
2156 
2157 static void dump_map_entry(OutputFormat output_format, MapEntry *e,
2158                            MapEntry *next)
2159 {
2160     switch (output_format) {
2161     case OFORMAT_HUMAN:
2162         if ((e->flags & BDRV_BLOCK_DATA) &&
2163             !(e->flags & BDRV_BLOCK_OFFSET_VALID)) {
2164             error_report("File contains external, encrypted or compressed clusters.");
2165             exit(1);
2166         }
2167         if ((e->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) == BDRV_BLOCK_DATA) {
2168             printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
2169                    e->start, e->length, e->offset, e->bs->filename);
2170         }
2171         /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
2172          * Modify the flags here to allow more coalescing.
2173          */
2174         if (next &&
2175             (next->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) != BDRV_BLOCK_DATA) {
2176             next->flags &= ~BDRV_BLOCK_DATA;
2177             next->flags |= BDRV_BLOCK_ZERO;
2178         }
2179         break;
2180     case OFORMAT_JSON:
2181         printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": %d,"
2182                " \"zero\": %s, \"data\": %s",
2183                (e->start == 0 ? "[" : ",\n"),
2184                e->start, e->length, e->depth,
2185                (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false",
2186                (e->flags & BDRV_BLOCK_DATA) ? "true" : "false");
2187         if (e->flags & BDRV_BLOCK_OFFSET_VALID) {
2188             printf(", \"offset\": %"PRId64"", e->offset);
2189         }
2190         putchar('}');
2191 
2192         if (!next) {
2193             printf("]\n");
2194         }
2195         break;
2196     }
2197 }
2198 
2199 static int get_block_status(BlockDriverState *bs, int64_t sector_num,
2200                             int nb_sectors, MapEntry *e)
2201 {
2202     int64_t ret;
2203     int depth;
2204 
2205     /* As an optimization, we could cache the current range of unallocated
2206      * clusters in each file of the chain, and avoid querying the same
2207      * range repeatedly.
2208      */
2209 
2210     depth = 0;
2211     for (;;) {
2212         ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors);
2213         if (ret < 0) {
2214             return ret;
2215         }
2216         assert(nb_sectors);
2217         if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
2218             break;
2219         }
2220         bs = backing_bs(bs);
2221         if (bs == NULL) {
2222             ret = 0;
2223             break;
2224         }
2225 
2226         depth++;
2227     }
2228 
2229     e->start = sector_num * BDRV_SECTOR_SIZE;
2230     e->length = nb_sectors * BDRV_SECTOR_SIZE;
2231     e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK;
2232     e->offset = ret & BDRV_BLOCK_OFFSET_MASK;
2233     e->depth = depth;
2234     e->bs = bs;
2235     return 0;
2236 }
2237 
2238 static int img_map(int argc, char **argv)
2239 {
2240     int c;
2241     OutputFormat output_format = OFORMAT_HUMAN;
2242     BlockBackend *blk;
2243     BlockDriverState *bs;
2244     const char *filename, *fmt, *output;
2245     int64_t length;
2246     MapEntry curr = { .length = 0 }, next;
2247     int ret = 0;
2248 
2249     fmt = NULL;
2250     output = NULL;
2251     for (;;) {
2252         int option_index = 0;
2253         static const struct option long_options[] = {
2254             {"help", no_argument, 0, 'h'},
2255             {"format", required_argument, 0, 'f'},
2256             {"output", required_argument, 0, OPTION_OUTPUT},
2257             {0, 0, 0, 0}
2258         };
2259         c = getopt_long(argc, argv, "f:h",
2260                         long_options, &option_index);
2261         if (c == -1) {
2262             break;
2263         }
2264         switch (c) {
2265         case '?':
2266         case 'h':
2267             help();
2268             break;
2269         case 'f':
2270             fmt = optarg;
2271             break;
2272         case OPTION_OUTPUT:
2273             output = optarg;
2274             break;
2275         }
2276     }
2277     if (optind != argc - 1) {
2278         error_exit("Expecting one image file name");
2279     }
2280     filename = argv[optind];
2281 
2282     if (output && !strcmp(output, "json")) {
2283         output_format = OFORMAT_JSON;
2284     } else if (output && !strcmp(output, "human")) {
2285         output_format = OFORMAT_HUMAN;
2286     } else if (output) {
2287         error_report("--output must be used with human or json as argument.");
2288         return 1;
2289     }
2290 
2291     blk = img_open("image", filename, fmt, BDRV_O_FLAGS, true, false);
2292     if (!blk) {
2293         return 1;
2294     }
2295     bs = blk_bs(blk);
2296 
2297     if (output_format == OFORMAT_HUMAN) {
2298         printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
2299     }
2300 
2301     length = blk_getlength(blk);
2302     while (curr.start + curr.length < length) {
2303         int64_t nsectors_left;
2304         int64_t sector_num;
2305         int n;
2306 
2307         sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
2308 
2309         /* Probe up to 1 GiB at a time.  */
2310         nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
2311         n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
2312         ret = get_block_status(bs, sector_num, n, &next);
2313 
2314         if (ret < 0) {
2315             error_report("Could not read file metadata: %s", strerror(-ret));
2316             goto out;
2317         }
2318 
2319         if (curr.length != 0 && curr.flags == next.flags &&
2320             curr.depth == next.depth &&
2321             ((curr.flags & BDRV_BLOCK_OFFSET_VALID) == 0 ||
2322              curr.offset + curr.length == next.offset)) {
2323             curr.length += next.length;
2324             continue;
2325         }
2326 
2327         if (curr.length > 0) {
2328             dump_map_entry(output_format, &curr, &next);
2329         }
2330         curr = next;
2331     }
2332 
2333     dump_map_entry(output_format, &curr, NULL);
2334 
2335 out:
2336     blk_unref(blk);
2337     return ret < 0;
2338 }
2339 
2340 #define SNAPSHOT_LIST   1
2341 #define SNAPSHOT_CREATE 2
2342 #define SNAPSHOT_APPLY  3
2343 #define SNAPSHOT_DELETE 4
2344 
2345 static int img_snapshot(int argc, char **argv)
2346 {
2347     BlockBackend *blk;
2348     BlockDriverState *bs;
2349     QEMUSnapshotInfo sn;
2350     char *filename, *snapshot_name = NULL;
2351     int c, ret = 0, bdrv_oflags;
2352     int action = 0;
2353     qemu_timeval tv;
2354     bool quiet = false;
2355     Error *err = NULL;
2356 
2357     bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
2358     /* Parse commandline parameters */
2359     for(;;) {
2360         c = getopt(argc, argv, "la:c:d:hq");
2361         if (c == -1) {
2362             break;
2363         }
2364         switch(c) {
2365         case '?':
2366         case 'h':
2367             help();
2368             return 0;
2369         case 'l':
2370             if (action) {
2371                 error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2372                 return 0;
2373             }
2374             action = SNAPSHOT_LIST;
2375             bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
2376             break;
2377         case 'a':
2378             if (action) {
2379                 error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2380                 return 0;
2381             }
2382             action = SNAPSHOT_APPLY;
2383             snapshot_name = optarg;
2384             break;
2385         case 'c':
2386             if (action) {
2387                 error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2388                 return 0;
2389             }
2390             action = SNAPSHOT_CREATE;
2391             snapshot_name = optarg;
2392             break;
2393         case 'd':
2394             if (action) {
2395                 error_exit("Cannot mix '-l', '-a', '-c', '-d'");
2396                 return 0;
2397             }
2398             action = SNAPSHOT_DELETE;
2399             snapshot_name = optarg;
2400             break;
2401         case 'q':
2402             quiet = true;
2403             break;
2404         }
2405     }
2406 
2407     if (optind != argc - 1) {
2408         error_exit("Expecting one image file name");
2409     }
2410     filename = argv[optind++];
2411 
2412     /* Open the image */
2413     blk = img_open("image", filename, NULL, bdrv_oflags, true, quiet);
2414     if (!blk) {
2415         return 1;
2416     }
2417     bs = blk_bs(blk);
2418 
2419     /* Perform the requested action */
2420     switch(action) {
2421     case SNAPSHOT_LIST:
2422         dump_snapshots(bs);
2423         break;
2424 
2425     case SNAPSHOT_CREATE:
2426         memset(&sn, 0, sizeof(sn));
2427         pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
2428 
2429         qemu_gettimeofday(&tv);
2430         sn.date_sec = tv.tv_sec;
2431         sn.date_nsec = tv.tv_usec * 1000;
2432 
2433         ret = bdrv_snapshot_create(bs, &sn);
2434         if (ret) {
2435             error_report("Could not create snapshot '%s': %d (%s)",
2436                 snapshot_name, ret, strerror(-ret));
2437         }
2438         break;
2439 
2440     case SNAPSHOT_APPLY:
2441         ret = bdrv_snapshot_goto(bs, snapshot_name);
2442         if (ret) {
2443             error_report("Could not apply snapshot '%s': %d (%s)",
2444                 snapshot_name, ret, strerror(-ret));
2445         }
2446         break;
2447 
2448     case SNAPSHOT_DELETE:
2449         bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
2450         if (err) {
2451             error_reportf_err(err, "Could not delete snapshot '%s': ",
2452                               snapshot_name);
2453             ret = 1;
2454         }
2455         break;
2456     }
2457 
2458     /* Cleanup */
2459     blk_unref(blk);
2460     if (ret) {
2461         return 1;
2462     }
2463     return 0;
2464 }
2465 
2466 static int img_rebase(int argc, char **argv)
2467 {
2468     BlockBackend *blk = NULL, *blk_old_backing = NULL, *blk_new_backing = NULL;
2469     BlockDriverState *bs = NULL;
2470     char *filename;
2471     const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg;
2472     int c, flags, src_flags, ret;
2473     int unsafe = 0;
2474     int progress = 0;
2475     bool quiet = false;
2476     Error *local_err = NULL;
2477 
2478     /* Parse commandline parameters */
2479     fmt = NULL;
2480     cache = BDRV_DEFAULT_CACHE;
2481     src_cache = BDRV_DEFAULT_CACHE;
2482     out_baseimg = NULL;
2483     out_basefmt = NULL;
2484     for(;;) {
2485         c = getopt(argc, argv, "hf:F:b:upt:T:q");
2486         if (c == -1) {
2487             break;
2488         }
2489         switch(c) {
2490         case '?':
2491         case 'h':
2492             help();
2493             return 0;
2494         case 'f':
2495             fmt = optarg;
2496             break;
2497         case 'F':
2498             out_basefmt = optarg;
2499             break;
2500         case 'b':
2501             out_baseimg = optarg;
2502             break;
2503         case 'u':
2504             unsafe = 1;
2505             break;
2506         case 'p':
2507             progress = 1;
2508             break;
2509         case 't':
2510             cache = optarg;
2511             break;
2512         case 'T':
2513             src_cache = optarg;
2514             break;
2515         case 'q':
2516             quiet = true;
2517             break;
2518         }
2519     }
2520 
2521     if (quiet) {
2522         progress = 0;
2523     }
2524 
2525     if (optind != argc - 1) {
2526         error_exit("Expecting one image file name");
2527     }
2528     if (!unsafe && !out_baseimg) {
2529         error_exit("Must specify backing file (-b) or use unsafe mode (-u)");
2530     }
2531     filename = argv[optind++];
2532 
2533     qemu_progress_init(progress, 2.0);
2534     qemu_progress_print(0, 100);
2535 
2536     flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
2537     ret = bdrv_parse_cache_flags(cache, &flags);
2538     if (ret < 0) {
2539         error_report("Invalid cache option: %s", cache);
2540         goto out;
2541     }
2542 
2543     src_flags = BDRV_O_FLAGS;
2544     ret = bdrv_parse_cache_flags(src_cache, &src_flags);
2545     if (ret < 0) {
2546         error_report("Invalid source cache option: %s", src_cache);
2547         goto out;
2548     }
2549 
2550     /*
2551      * Open the images.
2552      *
2553      * Ignore the old backing file for unsafe rebase in case we want to correct
2554      * the reference to a renamed or moved backing file.
2555      */
2556     blk = img_open("image", filename, fmt, flags, true, quiet);
2557     if (!blk) {
2558         ret = -1;
2559         goto out;
2560     }
2561     bs = blk_bs(blk);
2562 
2563     if (out_basefmt != NULL) {
2564         if (bdrv_find_format(out_basefmt) == NULL) {
2565             error_report("Invalid format name: '%s'", out_basefmt);
2566             ret = -1;
2567             goto out;
2568         }
2569     }
2570 
2571     /* For safe rebasing we need to compare old and new backing file */
2572     if (!unsafe) {
2573         char backing_name[PATH_MAX];
2574         QDict *options = NULL;
2575 
2576         if (bs->backing_format[0] != '\0') {
2577             options = qdict_new();
2578             qdict_put(options, "driver", qstring_from_str(bs->backing_format));
2579         }
2580 
2581         bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2582         blk_old_backing = blk_new_open("old_backing", backing_name, NULL,
2583                                        options, src_flags, &local_err);
2584         if (!blk_old_backing) {
2585             error_reportf_err(local_err,
2586                               "Could not open old backing file '%s': ",
2587                               backing_name);
2588             goto out;
2589         }
2590 
2591         if (out_baseimg[0]) {
2592             if (out_basefmt) {
2593                 options = qdict_new();
2594                 qdict_put(options, "driver", qstring_from_str(out_basefmt));
2595             } else {
2596                 options = NULL;
2597             }
2598 
2599             blk_new_backing = blk_new_open("new_backing", out_baseimg, NULL,
2600                                            options, src_flags, &local_err);
2601             if (!blk_new_backing) {
2602                 error_reportf_err(local_err,
2603                                   "Could not open new backing file '%s': ",
2604                                   out_baseimg);
2605                 goto out;
2606             }
2607         }
2608     }
2609 
2610     /*
2611      * Check each unallocated cluster in the COW file. If it is unallocated,
2612      * accesses go to the backing file. We must therefore compare this cluster
2613      * in the old and new backing file, and if they differ we need to copy it
2614      * from the old backing file into the COW file.
2615      *
2616      * If qemu-img crashes during this step, no harm is done. The content of
2617      * the image is the same as the original one at any time.
2618      */
2619     if (!unsafe) {
2620         int64_t num_sectors;
2621         int64_t old_backing_num_sectors;
2622         int64_t new_backing_num_sectors = 0;
2623         uint64_t sector;
2624         int n;
2625         uint8_t * buf_old;
2626         uint8_t * buf_new;
2627         float local_progress = 0;
2628 
2629         buf_old = blk_blockalign(blk, IO_BUF_SIZE);
2630         buf_new = blk_blockalign(blk, IO_BUF_SIZE);
2631 
2632         num_sectors = blk_nb_sectors(blk);
2633         if (num_sectors < 0) {
2634             error_report("Could not get size of '%s': %s",
2635                          filename, strerror(-num_sectors));
2636             ret = -1;
2637             goto out;
2638         }
2639         old_backing_num_sectors = blk_nb_sectors(blk_old_backing);
2640         if (old_backing_num_sectors < 0) {
2641             char backing_name[PATH_MAX];
2642 
2643             bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2644             error_report("Could not get size of '%s': %s",
2645                          backing_name, strerror(-old_backing_num_sectors));
2646             ret = -1;
2647             goto out;
2648         }
2649         if (blk_new_backing) {
2650             new_backing_num_sectors = blk_nb_sectors(blk_new_backing);
2651             if (new_backing_num_sectors < 0) {
2652                 error_report("Could not get size of '%s': %s",
2653                              out_baseimg, strerror(-new_backing_num_sectors));
2654                 ret = -1;
2655                 goto out;
2656             }
2657         }
2658 
2659         if (num_sectors != 0) {
2660             local_progress = (float)100 /
2661                 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2662         }
2663 
2664         for (sector = 0; sector < num_sectors; sector += n) {
2665 
2666             /* How many sectors can we handle with the next read? */
2667             if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2668                 n = (IO_BUF_SIZE / 512);
2669             } else {
2670                 n = num_sectors - sector;
2671             }
2672 
2673             /* If the cluster is allocated, we don't need to take action */
2674             ret = bdrv_is_allocated(bs, sector, n, &n);
2675             if (ret < 0) {
2676                 error_report("error while reading image metadata: %s",
2677                              strerror(-ret));
2678                 goto out;
2679             }
2680             if (ret) {
2681                 continue;
2682             }
2683 
2684             /*
2685              * Read old and new backing file and take into consideration that
2686              * backing files may be smaller than the COW image.
2687              */
2688             if (sector >= old_backing_num_sectors) {
2689                 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2690             } else {
2691                 if (sector + n > old_backing_num_sectors) {
2692                     n = old_backing_num_sectors - sector;
2693                 }
2694 
2695                 ret = blk_read(blk_old_backing, sector, buf_old, n);
2696                 if (ret < 0) {
2697                     error_report("error while reading from old backing file");
2698                     goto out;
2699                 }
2700             }
2701 
2702             if (sector >= new_backing_num_sectors || !blk_new_backing) {
2703                 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2704             } else {
2705                 if (sector + n > new_backing_num_sectors) {
2706                     n = new_backing_num_sectors - sector;
2707                 }
2708 
2709                 ret = blk_read(blk_new_backing, sector, buf_new, n);
2710                 if (ret < 0) {
2711                     error_report("error while reading from new backing file");
2712                     goto out;
2713                 }
2714             }
2715 
2716             /* If they differ, we need to write to the COW file */
2717             uint64_t written = 0;
2718 
2719             while (written < n) {
2720                 int pnum;
2721 
2722                 if (compare_sectors(buf_old + written * 512,
2723                     buf_new + written * 512, n - written, &pnum))
2724                 {
2725                     ret = blk_write(blk, sector + written,
2726                                     buf_old + written * 512, pnum);
2727                     if (ret < 0) {
2728                         error_report("Error while writing to COW image: %s",
2729                             strerror(-ret));
2730                         goto out;
2731                     }
2732                 }
2733 
2734                 written += pnum;
2735             }
2736             qemu_progress_print(local_progress, 100);
2737         }
2738 
2739         qemu_vfree(buf_old);
2740         qemu_vfree(buf_new);
2741     }
2742 
2743     /*
2744      * Change the backing file. All clusters that are different from the old
2745      * backing file are overwritten in the COW file now, so the visible content
2746      * doesn't change when we switch the backing file.
2747      */
2748     if (out_baseimg && *out_baseimg) {
2749         ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2750     } else {
2751         ret = bdrv_change_backing_file(bs, NULL, NULL);
2752     }
2753 
2754     if (ret == -ENOSPC) {
2755         error_report("Could not change the backing file to '%s': No "
2756                      "space left in the file header", out_baseimg);
2757     } else if (ret < 0) {
2758         error_report("Could not change the backing file to '%s': %s",
2759             out_baseimg, strerror(-ret));
2760     }
2761 
2762     qemu_progress_print(100, 0);
2763     /*
2764      * TODO At this point it is possible to check if any clusters that are
2765      * allocated in the COW file are the same in the backing file. If so, they
2766      * could be dropped from the COW file. Don't do this before switching the
2767      * backing file, in case of a crash this would lead to corruption.
2768      */
2769 out:
2770     qemu_progress_end();
2771     /* Cleanup */
2772     if (!unsafe) {
2773         blk_unref(blk_old_backing);
2774         blk_unref(blk_new_backing);
2775     }
2776 
2777     blk_unref(blk);
2778     if (ret) {
2779         return 1;
2780     }
2781     return 0;
2782 }
2783 
2784 static int img_resize(int argc, char **argv)
2785 {
2786     Error *err = NULL;
2787     int c, ret, relative;
2788     const char *filename, *fmt, *size;
2789     int64_t n, total_size;
2790     bool quiet = false;
2791     BlockBackend *blk = NULL;
2792     QemuOpts *param;
2793     static QemuOptsList resize_options = {
2794         .name = "resize_options",
2795         .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2796         .desc = {
2797             {
2798                 .name = BLOCK_OPT_SIZE,
2799                 .type = QEMU_OPT_SIZE,
2800                 .help = "Virtual disk size"
2801             }, {
2802                 /* end of list */
2803             }
2804         },
2805     };
2806 
2807     /* Remove size from argv manually so that negative numbers are not treated
2808      * as options by getopt. */
2809     if (argc < 3) {
2810         error_exit("Not enough arguments");
2811         return 1;
2812     }
2813 
2814     size = argv[--argc];
2815 
2816     /* Parse getopt arguments */
2817     fmt = NULL;
2818     for(;;) {
2819         c = getopt(argc, argv, "f:hq");
2820         if (c == -1) {
2821             break;
2822         }
2823         switch(c) {
2824         case '?':
2825         case 'h':
2826             help();
2827             break;
2828         case 'f':
2829             fmt = optarg;
2830             break;
2831         case 'q':
2832             quiet = true;
2833             break;
2834         }
2835     }
2836     if (optind != argc - 1) {
2837         error_exit("Expecting one image file name");
2838     }
2839     filename = argv[optind++];
2840 
2841     /* Choose grow, shrink, or absolute resize mode */
2842     switch (size[0]) {
2843     case '+':
2844         relative = 1;
2845         size++;
2846         break;
2847     case '-':
2848         relative = -1;
2849         size++;
2850         break;
2851     default:
2852         relative = 0;
2853         break;
2854     }
2855 
2856     /* Parse size */
2857     param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
2858     qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err);
2859     if (err) {
2860         error_report_err(err);
2861         ret = -1;
2862         qemu_opts_del(param);
2863         goto out;
2864     }
2865     n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2866     qemu_opts_del(param);
2867 
2868     blk = img_open("image", filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR,
2869                    true, quiet);
2870     if (!blk) {
2871         ret = -1;
2872         goto out;
2873     }
2874 
2875     if (relative) {
2876         total_size = blk_getlength(blk) + n * relative;
2877     } else {
2878         total_size = n;
2879     }
2880     if (total_size <= 0) {
2881         error_report("New image size must be positive");
2882         ret = -1;
2883         goto out;
2884     }
2885 
2886     ret = blk_truncate(blk, total_size);
2887     switch (ret) {
2888     case 0:
2889         qprintf(quiet, "Image resized.\n");
2890         break;
2891     case -ENOTSUP:
2892         error_report("This image does not support resize");
2893         break;
2894     case -EACCES:
2895         error_report("Image is read-only");
2896         break;
2897     default:
2898         error_report("Error resizing image (%d)", -ret);
2899         break;
2900     }
2901 out:
2902     blk_unref(blk);
2903     if (ret) {
2904         return 1;
2905     }
2906     return 0;
2907 }
2908 
2909 static void amend_status_cb(BlockDriverState *bs,
2910                             int64_t offset, int64_t total_work_size,
2911                             void *opaque)
2912 {
2913     qemu_progress_print(100.f * offset / total_work_size, 0);
2914 }
2915 
2916 static int img_amend(int argc, char **argv)
2917 {
2918     Error *err = NULL;
2919     int c, ret = 0;
2920     char *options = NULL;
2921     QemuOptsList *create_opts = NULL;
2922     QemuOpts *opts = NULL;
2923     const char *fmt = NULL, *filename, *cache;
2924     int flags;
2925     bool quiet = false, progress = false;
2926     BlockBackend *blk = NULL;
2927     BlockDriverState *bs = NULL;
2928 
2929     cache = BDRV_DEFAULT_CACHE;
2930     for (;;) {
2931         c = getopt(argc, argv, "ho:f:t:pq");
2932         if (c == -1) {
2933             break;
2934         }
2935 
2936         switch (c) {
2937             case 'h':
2938             case '?':
2939                 help();
2940                 break;
2941             case 'o':
2942                 if (!is_valid_option_list(optarg)) {
2943                     error_report("Invalid option list: %s", optarg);
2944                     ret = -1;
2945                     goto out_no_progress;
2946                 }
2947                 if (!options) {
2948                     options = g_strdup(optarg);
2949                 } else {
2950                     char *old_options = options;
2951                     options = g_strdup_printf("%s,%s", options, optarg);
2952                     g_free(old_options);
2953                 }
2954                 break;
2955             case 'f':
2956                 fmt = optarg;
2957                 break;
2958             case 't':
2959                 cache = optarg;
2960                 break;
2961             case 'p':
2962                 progress = true;
2963                 break;
2964             case 'q':
2965                 quiet = true;
2966                 break;
2967         }
2968     }
2969 
2970     if (!options) {
2971         error_exit("Must specify options (-o)");
2972     }
2973 
2974     if (quiet) {
2975         progress = false;
2976     }
2977     qemu_progress_init(progress, 1.0);
2978 
2979     filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
2980     if (fmt && has_help_option(options)) {
2981         /* If a format is explicitly specified (and possibly no filename is
2982          * given), print option help here */
2983         ret = print_block_option_help(filename, fmt);
2984         goto out;
2985     }
2986 
2987     if (optind != argc - 1) {
2988         error_report("Expecting one image file name");
2989         ret = -1;
2990         goto out;
2991     }
2992 
2993     flags = BDRV_O_FLAGS | BDRV_O_RDWR;
2994     ret = bdrv_parse_cache_flags(cache, &flags);
2995     if (ret < 0) {
2996         error_report("Invalid cache option: %s", cache);
2997         goto out;
2998     }
2999 
3000     blk = img_open("image", filename, fmt, flags, true, quiet);
3001     if (!blk) {
3002         ret = -1;
3003         goto out;
3004     }
3005     bs = blk_bs(blk);
3006 
3007     fmt = bs->drv->format_name;
3008 
3009     if (has_help_option(options)) {
3010         /* If the format was auto-detected, print option help here */
3011         ret = print_block_option_help(filename, fmt);
3012         goto out;
3013     }
3014 
3015     if (!bs->drv->create_opts) {
3016         error_report("Format driver '%s' does not support any options to amend",
3017                      fmt);
3018         ret = -1;
3019         goto out;
3020     }
3021 
3022     create_opts = qemu_opts_append(create_opts, bs->drv->create_opts);
3023     opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
3024     if (options) {
3025         qemu_opts_do_parse(opts, options, NULL, &err);
3026         if (err) {
3027             error_report_err(err);
3028             ret = -1;
3029             goto out;
3030         }
3031     }
3032 
3033     /* In case the driver does not call amend_status_cb() */
3034     qemu_progress_print(0.f, 0);
3035     ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL);
3036     qemu_progress_print(100.f, 0);
3037     if (ret < 0) {
3038         error_report("Error while amending options: %s", strerror(-ret));
3039         goto out;
3040     }
3041 
3042 out:
3043     qemu_progress_end();
3044 
3045 out_no_progress:
3046     blk_unref(blk);
3047     qemu_opts_del(opts);
3048     qemu_opts_free(create_opts);
3049     g_free(options);
3050 
3051     if (ret) {
3052         return 1;
3053     }
3054     return 0;
3055 }
3056 
3057 static const img_cmd_t img_cmds[] = {
3058 #define DEF(option, callback, arg_string)        \
3059     { option, callback },
3060 #include "qemu-img-cmds.h"
3061 #undef DEF
3062 #undef GEN_DOCS
3063     { NULL, NULL, },
3064 };
3065 
3066 int main(int argc, char **argv)
3067 {
3068     const img_cmd_t *cmd;
3069     const char *cmdname;
3070     Error *local_error = NULL;
3071     int c;
3072     static const struct option long_options[] = {
3073         {"help", no_argument, 0, 'h'},
3074         {"version", no_argument, 0, 'v'},
3075         {0, 0, 0, 0}
3076     };
3077 
3078 #ifdef CONFIG_POSIX
3079     signal(SIGPIPE, SIG_IGN);
3080 #endif
3081 
3082     error_set_progname(argv[0]);
3083     qemu_init_exec_dir(argv[0]);
3084 
3085     if (qemu_init_main_loop(&local_error)) {
3086         error_report_err(local_error);
3087         exit(EXIT_FAILURE);
3088     }
3089 
3090     bdrv_init();
3091     if (argc < 2) {
3092         error_exit("Not enough arguments");
3093     }
3094     cmdname = argv[1];
3095 
3096     /* find the command */
3097     for (cmd = img_cmds; cmd->name != NULL; cmd++) {
3098         if (!strcmp(cmdname, cmd->name)) {
3099             return cmd->handler(argc - 1, argv + 1);
3100         }
3101     }
3102 
3103     c = getopt_long(argc, argv, "h", long_options, NULL);
3104 
3105     if (c == 'h') {
3106         help();
3107     }
3108     if (c == 'v') {
3109         printf(QEMU_IMG_VERSION);
3110         return 0;
3111     }
3112 
3113     /* not found */
3114     error_exit("Command not found: %s", cmdname);
3115 }
3116