xref: /openbmc/qemu/qemu-img.c (revision e0c7de8dc4a3c0b7a0d0fa21fa0561a4dc763716)
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  
25  #include "qemu/osdep.h"
26  #include <getopt.h>
27  
28  #include "qemu/help-texts.h"
29  #include "qemu/qemu-progress.h"
30  #include "qemu-version.h"
31  #include "qapi/error.h"
32  #include "qapi/qapi-commands-block-core.h"
33  #include "qapi/qapi-visit-block-core.h"
34  #include "qapi/qobject-output-visitor.h"
35  #include "qapi/qmp/qjson.h"
36  #include "qapi/qmp/qdict.h"
37  #include "qemu/cutils.h"
38  #include "qemu/config-file.h"
39  #include "qemu/option.h"
40  #include "qemu/error-report.h"
41  #include "qemu/log.h"
42  #include "qemu/main-loop.h"
43  #include "qemu/module.h"
44  #include "qemu/sockets.h"
45  #include "qemu/units.h"
46  #include "qemu/memalign.h"
47  #include "qom/object_interfaces.h"
48  #include "sysemu/block-backend.h"
49  #include "block/block_int.h"
50  #include "block/blockjob.h"
51  #include "block/dirty-bitmap.h"
52  #include "block/qapi.h"
53  #include "crypto/init.h"
54  #include "trace/control.h"
55  #include "qemu/throttle.h"
56  #include "block/throttle-groups.h"
57  
58  #define QEMU_IMG_VERSION "qemu-img version " QEMU_FULL_VERSION \
59                            "\n" QEMU_COPYRIGHT "\n"
60  
61  typedef struct img_cmd_t {
62      const char *name;
63      int (*handler)(int argc, char **argv);
64  } img_cmd_t;
65  
66  enum {
67      OPTION_OUTPUT = 256,
68      OPTION_BACKING_CHAIN = 257,
69      OPTION_OBJECT = 258,
70      OPTION_IMAGE_OPTS = 259,
71      OPTION_PATTERN = 260,
72      OPTION_FLUSH_INTERVAL = 261,
73      OPTION_NO_DRAIN = 262,
74      OPTION_TARGET_IMAGE_OPTS = 263,
75      OPTION_SIZE = 264,
76      OPTION_PREALLOCATION = 265,
77      OPTION_SHRINK = 266,
78      OPTION_SALVAGE = 267,
79      OPTION_TARGET_IS_ZERO = 268,
80      OPTION_ADD = 269,
81      OPTION_REMOVE = 270,
82      OPTION_CLEAR = 271,
83      OPTION_ENABLE = 272,
84      OPTION_DISABLE = 273,
85      OPTION_MERGE = 274,
86      OPTION_BITMAPS = 275,
87      OPTION_FORCE = 276,
88      OPTION_SKIP_BROKEN = 277,
89  };
90  
91  typedef enum OutputFormat {
92      OFORMAT_JSON,
93      OFORMAT_HUMAN,
94  } OutputFormat;
95  
96  /* Default to cache=writeback as data integrity is not important for qemu-img */
97  #define BDRV_DEFAULT_CACHE "writeback"
98  
99  static void format_print(void *opaque, const char *name)
100  {
101      printf(" %s", name);
102  }
103  
104  static G_NORETURN G_GNUC_PRINTF(1, 2)
105  void error_exit(const char *fmt, ...)
106  {
107      va_list ap;
108  
109      va_start(ap, fmt);
110      error_vreport(fmt, ap);
111      va_end(ap);
112  
113      error_printf("Try 'qemu-img --help' for more information\n");
114      exit(EXIT_FAILURE);
115  }
116  
117  static G_NORETURN
118  void missing_argument(const char *option)
119  {
120      error_exit("missing argument for option '%s'", option);
121  }
122  
123  static G_NORETURN
124  void unrecognized_option(const char *option)
125  {
126      error_exit("unrecognized option '%s'", option);
127  }
128  
129  /* Please keep in synch with docs/tools/qemu-img.rst */
130  static G_NORETURN
131  void help(void)
132  {
133      const char *help_msg =
134             QEMU_IMG_VERSION
135             "usage: qemu-img [standard options] command [command options]\n"
136             "QEMU disk image utility\n"
137             "\n"
138             "    '-h', '--help'       display this help and exit\n"
139             "    '-V', '--version'    output version information and exit\n"
140             "    '-T', '--trace'      [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
141             "                         specify tracing options\n"
142             "\n"
143             "Command syntax:\n"
144  #define DEF(option, callback, arg_string)        \
145             "  " arg_string "\n"
146  #include "qemu-img-cmds.h"
147  #undef DEF
148             "\n"
149             "Command parameters:\n"
150             "  'filename' is a disk image filename\n"
151             "  'objectdef' is a QEMU user creatable object definition. See the qemu(1)\n"
152             "    manual page for a description of the object properties. The most common\n"
153             "    object type is a 'secret', which is used to supply passwords and/or\n"
154             "    encryption keys.\n"
155             "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
156             "  'cache' is the cache mode used to write the output disk image, the valid\n"
157             "    options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
158             "    'directsync' and 'unsafe' (default for convert)\n"
159             "  'src_cache' is the cache mode used to read input disk images, the valid\n"
160             "    options are the same as for the 'cache' option\n"
161             "  'size' is the disk image size in bytes. Optional suffixes\n"
162             "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
163             "    'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P)  are\n"
164             "    supported. 'b' is ignored.\n"
165             "  'output_filename' is the destination disk image filename\n"
166             "  'output_fmt' is the destination format\n"
167             "  'options' is a comma separated list of format specific options in a\n"
168             "    name=value format. Use -o help for an overview of the options supported by\n"
169             "    the used format\n"
170             "  'snapshot_param' is param used for internal snapshot, format\n"
171             "    is 'snapshot.id=[ID],snapshot.name=[NAME]', or\n"
172             "    '[ID_OR_NAME]'\n"
173             "  '-c' indicates that target image must be compressed (qcow format only)\n"
174             "  '-u' allows unsafe backing chains. For rebasing, it is assumed that old and\n"
175             "       new backing file match exactly. The image doesn't need a working\n"
176             "       backing file before rebasing in this case (useful for renaming the\n"
177             "       backing file). For image creation, allow creating without attempting\n"
178             "       to open the backing file.\n"
179             "  '-h' with or without a command shows this help and lists the supported formats\n"
180             "  '-p' show progress of command (only certain commands)\n"
181             "  '-q' use Quiet mode - do not print any output (except errors)\n"
182             "  '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n"
183             "       contain only zeros for qemu-img to create a sparse image during\n"
184             "       conversion. If the number of bytes is 0, the source will not be scanned for\n"
185             "       unallocated or zero sectors, and the destination image will always be\n"
186             "       fully allocated\n"
187             "  '--output' takes the format in which the output must be done (human or json)\n"
188             "  '-n' skips the target volume creation (useful if the volume is created\n"
189             "       prior to running qemu-img)\n"
190             "\n"
191             "Parameters to bitmap subcommand:\n"
192             "  'bitmap' is the name of the bitmap to manipulate, through one or more\n"
193             "       actions from '--add', '--remove', '--clear', '--enable', '--disable',\n"
194             "       or '--merge source'\n"
195             "  '-g granularity' sets the granularity for '--add' actions\n"
196             "  '-b source' and '-F src_fmt' tell '--merge' actions to find the source\n"
197             "       bitmaps from an alternative file\n"
198             "\n"
199             "Parameters to check subcommand:\n"
200             "  '-r' tries to repair any inconsistencies that are found during the check.\n"
201             "       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
202             "       kinds of errors, with a higher risk of choosing the wrong fix or\n"
203             "       hiding corruption that has already occurred.\n"
204             "\n"
205             "Parameters to convert subcommand:\n"
206             "  '--bitmaps' copies all top-level persistent bitmaps to destination\n"
207             "  '-m' specifies how many coroutines work in parallel during the convert\n"
208             "       process (defaults to 8)\n"
209             "  '-W' allow to write to the target out of order rather than sequential\n"
210             "\n"
211             "Parameters to snapshot subcommand:\n"
212             "  'snapshot' is the name of the snapshot to create, apply or delete\n"
213             "  '-a' applies a snapshot (revert disk to saved state)\n"
214             "  '-c' creates a snapshot\n"
215             "  '-d' deletes a snapshot\n"
216             "  '-l' lists all snapshots in the given image\n"
217             "\n"
218             "Parameters to compare subcommand:\n"
219             "  '-f' first image format\n"
220             "  '-F' second image format\n"
221             "  '-s' run in Strict mode - fail on different image size or sector allocation\n"
222             "\n"
223             "Parameters to dd subcommand:\n"
224             "  'bs=BYTES' read and write up to BYTES bytes at a time "
225             "(default: 512)\n"
226             "  'count=N' copy only N input blocks\n"
227             "  'if=FILE' read from FILE\n"
228             "  'of=FILE' write to FILE\n"
229             "  'skip=N' skip N bs-sized blocks at the start of input\n";
230  
231      printf("%s\nSupported formats:", help_msg);
232      bdrv_iterate_format(format_print, NULL, false);
233      printf("\n\n" QEMU_HELP_BOTTOM "\n");
234      exit(EXIT_SUCCESS);
235  }
236  
237  /*
238   * Is @list safe for accumulate_options()?
239   * It is when multiple of them can be joined together separated by ','.
240   * To make that work, @list must not start with ',' (or else a
241   * separating ',' preceding it gets escaped), and it must not end with
242   * an odd number of ',' (or else a separating ',' following it gets
243   * escaped), or be empty (or else a separating ',' preceding it can
244   * escape a separating ',' following it).
245   *
246   */
247  static bool is_valid_option_list(const char *list)
248  {
249      size_t len = strlen(list);
250      size_t i;
251  
252      if (!list[0] || list[0] == ',') {
253          return false;
254      }
255  
256      for (i = len; i > 0 && list[i - 1] == ','; i--) {
257      }
258      if ((len - i) % 2) {
259          return false;
260      }
261  
262      return true;
263  }
264  
265  static int accumulate_options(char **options, char *list)
266  {
267      char *new_options;
268  
269      if (!is_valid_option_list(list)) {
270          error_report("Invalid option list: %s", list);
271          return -1;
272      }
273  
274      if (!*options) {
275          *options = g_strdup(list);
276      } else {
277          new_options = g_strdup_printf("%s,%s", *options, list);
278          g_free(*options);
279          *options = new_options;
280      }
281      return 0;
282  }
283  
284  static QemuOptsList qemu_source_opts = {
285      .name = "source",
286      .implied_opt_name = "file",
287      .head = QTAILQ_HEAD_INITIALIZER(qemu_source_opts.head),
288      .desc = {
289          { }
290      },
291  };
292  
293  static int G_GNUC_PRINTF(2, 3) qprintf(bool quiet, const char *fmt, ...)
294  {
295      int ret = 0;
296      if (!quiet) {
297          va_list args;
298          va_start(args, fmt);
299          ret = vprintf(fmt, args);
300          va_end(args);
301      }
302      return ret;
303  }
304  
305  
306  static int print_block_option_help(const char *filename, const char *fmt)
307  {
308      BlockDriver *drv, *proto_drv;
309      QemuOptsList *create_opts = NULL;
310      Error *local_err = NULL;
311  
312      /* Find driver and parse its options */
313      drv = bdrv_find_format(fmt);
314      if (!drv) {
315          error_report("Unknown file format '%s'", fmt);
316          return 1;
317      }
318  
319      if (!drv->create_opts) {
320          error_report("Format driver '%s' does not support image creation", fmt);
321          return 1;
322      }
323  
324      create_opts = qemu_opts_append(create_opts, drv->create_opts);
325      if (filename) {
326          proto_drv = bdrv_find_protocol(filename, true, &local_err);
327          if (!proto_drv) {
328              error_report_err(local_err);
329              qemu_opts_free(create_opts);
330              return 1;
331          }
332          if (!proto_drv->create_opts) {
333              error_report("Protocol driver '%s' does not support image creation",
334                           proto_drv->format_name);
335              qemu_opts_free(create_opts);
336              return 1;
337          }
338          create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
339      }
340  
341      if (filename) {
342          printf("Supported options:\n");
343      } else {
344          printf("Supported %s options:\n", fmt);
345      }
346      qemu_opts_print_help(create_opts, false);
347      qemu_opts_free(create_opts);
348  
349      if (!filename) {
350          printf("\n"
351                 "The protocol level may support further options.\n"
352                 "Specify the target filename to include those options.\n");
353      }
354  
355      return 0;
356  }
357  
358  
359  static BlockBackend *img_open_opts(const char *optstr,
360                                     QemuOpts *opts, int flags, bool writethrough,
361                                     bool quiet, bool force_share)
362  {
363      QDict *options;
364      Error *local_err = NULL;
365      BlockBackend *blk;
366      options = qemu_opts_to_qdict(opts, NULL);
367      if (force_share) {
368          if (qdict_haskey(options, BDRV_OPT_FORCE_SHARE)
369              && strcmp(qdict_get_str(options, BDRV_OPT_FORCE_SHARE), "on")) {
370              error_report("--force-share/-U conflicts with image options");
371              qobject_unref(options);
372              return NULL;
373          }
374          qdict_put_str(options, BDRV_OPT_FORCE_SHARE, "on");
375      }
376      blk = blk_new_open(NULL, NULL, options, flags, &local_err);
377      if (!blk) {
378          error_reportf_err(local_err, "Could not open '%s': ", optstr);
379          return NULL;
380      }
381      blk_set_enable_write_cache(blk, !writethrough);
382  
383      return blk;
384  }
385  
386  static BlockBackend *img_open_file(const char *filename,
387                                     QDict *options,
388                                     const char *fmt, int flags,
389                                     bool writethrough, bool quiet,
390                                     bool force_share)
391  {
392      BlockBackend *blk;
393      Error *local_err = NULL;
394  
395      if (!options) {
396          options = qdict_new();
397      }
398      if (fmt) {
399          qdict_put_str(options, "driver", fmt);
400      }
401  
402      if (force_share) {
403          qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true);
404      }
405      blk = blk_new_open(filename, NULL, options, flags, &local_err);
406      if (!blk) {
407          error_reportf_err(local_err, "Could not open '%s': ", filename);
408          return NULL;
409      }
410      blk_set_enable_write_cache(blk, !writethrough);
411  
412      return blk;
413  }
414  
415  
416  static int img_add_key_secrets(void *opaque,
417                                 const char *name, const char *value,
418                                 Error **errp)
419  {
420      QDict *options = opaque;
421  
422      if (g_str_has_suffix(name, "key-secret")) {
423          qdict_put_str(options, name, value);
424      }
425  
426      return 0;
427  }
428  
429  
430  static BlockBackend *img_open(bool image_opts,
431                                const char *filename,
432                                const char *fmt, int flags, bool writethrough,
433                                bool quiet, bool force_share)
434  {
435      BlockBackend *blk;
436      if (image_opts) {
437          QemuOpts *opts;
438          if (fmt) {
439              error_report("--image-opts and --format are mutually exclusive");
440              return NULL;
441          }
442          opts = qemu_opts_parse_noisily(qemu_find_opts("source"),
443                                         filename, true);
444          if (!opts) {
445              return NULL;
446          }
447          blk = img_open_opts(filename, opts, flags, writethrough, quiet,
448                              force_share);
449      } else {
450          blk = img_open_file(filename, NULL, fmt, flags, writethrough, quiet,
451                              force_share);
452      }
453  
454      if (blk) {
455          blk_set_force_allow_inactivate(blk);
456      }
457  
458      return blk;
459  }
460  
461  
462  static int add_old_style_options(const char *fmt, QemuOpts *opts,
463                                   const char *base_filename,
464                                   const char *base_fmt)
465  {
466      if (base_filename) {
467          if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
468                            NULL)) {
469              error_report("Backing file not supported for file format '%s'",
470                           fmt);
471              return -1;
472          }
473      }
474      if (base_fmt) {
475          if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) {
476              error_report("Backing file format not supported for file "
477                           "format '%s'", fmt);
478              return -1;
479          }
480      }
481      return 0;
482  }
483  
484  static int64_t cvtnum_full(const char *name, const char *value, int64_t min,
485                             int64_t max)
486  {
487      int err;
488      uint64_t res;
489  
490      err = qemu_strtosz(value, NULL, &res);
491      if (err < 0 && err != -ERANGE) {
492          error_report("Invalid %s specified. You may use "
493                       "k, M, G, T, P or E suffixes for", name);
494          error_report("kilobytes, megabytes, gigabytes, terabytes, "
495                       "petabytes and exabytes.");
496          return err;
497      }
498      if (err == -ERANGE || res > max || res < min) {
499          error_report("Invalid %s specified. Must be between %" PRId64
500                       " and %" PRId64 ".", name, min, max);
501          return -ERANGE;
502      }
503      return res;
504  }
505  
506  static int64_t cvtnum(const char *name, const char *value)
507  {
508      return cvtnum_full(name, value, 0, INT64_MAX);
509  }
510  
511  static int img_create(int argc, char **argv)
512  {
513      int c;
514      uint64_t img_size = -1;
515      const char *fmt = "raw";
516      const char *base_fmt = NULL;
517      const char *filename;
518      const char *base_filename = NULL;
519      char *options = NULL;
520      Error *local_err = NULL;
521      bool quiet = false;
522      int flags = 0;
523  
524      for(;;) {
525          static const struct option long_options[] = {
526              {"help", no_argument, 0, 'h'},
527              {"object", required_argument, 0, OPTION_OBJECT},
528              {0, 0, 0, 0}
529          };
530          c = getopt_long(argc, argv, ":F:b:f:ho:qu",
531                          long_options, NULL);
532          if (c == -1) {
533              break;
534          }
535          switch(c) {
536          case ':':
537              missing_argument(argv[optind - 1]);
538              break;
539          case '?':
540              unrecognized_option(argv[optind - 1]);
541              break;
542          case 'h':
543              help();
544              break;
545          case 'F':
546              base_fmt = optarg;
547              break;
548          case 'b':
549              base_filename = optarg;
550              break;
551          case 'f':
552              fmt = optarg;
553              break;
554          case 'o':
555              if (accumulate_options(&options, optarg) < 0) {
556                  goto fail;
557              }
558              break;
559          case 'q':
560              quiet = true;
561              break;
562          case 'u':
563              flags |= BDRV_O_NO_BACKING;
564              break;
565          case OPTION_OBJECT:
566              user_creatable_process_cmdline(optarg);
567              break;
568          }
569      }
570  
571      /* Get the filename */
572      filename = (optind < argc) ? argv[optind] : NULL;
573      if (options && has_help_option(options)) {
574          g_free(options);
575          return print_block_option_help(filename, fmt);
576      }
577  
578      if (optind >= argc) {
579          error_exit("Expecting image file name");
580      }
581      optind++;
582  
583      /* Get image size, if specified */
584      if (optind < argc) {
585          int64_t sval;
586  
587          sval = cvtnum("image size", argv[optind++]);
588          if (sval < 0) {
589              goto fail;
590          }
591          img_size = (uint64_t)sval;
592      }
593      if (optind != argc) {
594          error_exit("Unexpected argument: %s", argv[optind]);
595      }
596  
597      bdrv_img_create(filename, fmt, base_filename, base_fmt,
598                      options, img_size, flags, quiet, &local_err);
599      if (local_err) {
600          error_reportf_err(local_err, "%s: ", filename);
601          goto fail;
602      }
603  
604      g_free(options);
605      return 0;
606  
607  fail:
608      g_free(options);
609      return 1;
610  }
611  
612  static void dump_json_image_check(ImageCheck *check, bool quiet)
613  {
614      GString *str;
615      QObject *obj;
616      Visitor *v = qobject_output_visitor_new(&obj);
617  
618      visit_type_ImageCheck(v, NULL, &check, &error_abort);
619      visit_complete(v, &obj);
620      str = qobject_to_json_pretty(obj, true);
621      assert(str != NULL);
622      qprintf(quiet, "%s\n", str->str);
623      qobject_unref(obj);
624      visit_free(v);
625      g_string_free(str, true);
626  }
627  
628  static void dump_human_image_check(ImageCheck *check, bool quiet)
629  {
630      if (!(check->corruptions || check->leaks || check->check_errors)) {
631          qprintf(quiet, "No errors were found on the image.\n");
632      } else {
633          if (check->corruptions) {
634              qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
635                      "Data may be corrupted, or further writes to the image "
636                      "may corrupt it.\n",
637                      check->corruptions);
638          }
639  
640          if (check->leaks) {
641              qprintf(quiet,
642                      "\n%" PRId64 " leaked clusters were found on the image.\n"
643                      "This means waste of disk space, but no harm to data.\n",
644                      check->leaks);
645          }
646  
647          if (check->check_errors) {
648              qprintf(quiet,
649                      "\n%" PRId64
650                      " internal errors have occurred during the check.\n",
651                      check->check_errors);
652          }
653      }
654  
655      if (check->total_clusters != 0 && check->allocated_clusters != 0) {
656          qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
657                  "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
658                  check->allocated_clusters, check->total_clusters,
659                  check->allocated_clusters * 100.0 / check->total_clusters,
660                  check->fragmented_clusters * 100.0 / check->allocated_clusters,
661                  check->compressed_clusters * 100.0 /
662                  check->allocated_clusters);
663      }
664  
665      if (check->image_end_offset) {
666          qprintf(quiet,
667                  "Image end offset: %" PRId64 "\n", check->image_end_offset);
668      }
669  }
670  
671  static int collect_image_check(BlockDriverState *bs,
672                     ImageCheck *check,
673                     const char *filename,
674                     const char *fmt,
675                     int fix)
676  {
677      int ret;
678      BdrvCheckResult result;
679  
680      ret = bdrv_check(bs, &result, fix);
681      if (ret < 0) {
682          return ret;
683      }
684  
685      check->filename                 = g_strdup(filename);
686      check->format                   = g_strdup(bdrv_get_format_name(bs));
687      check->check_errors             = result.check_errors;
688      check->corruptions              = result.corruptions;
689      check->has_corruptions          = result.corruptions != 0;
690      check->leaks                    = result.leaks;
691      check->has_leaks                = result.leaks != 0;
692      check->corruptions_fixed        = result.corruptions_fixed;
693      check->has_corruptions_fixed    = result.corruptions_fixed != 0;
694      check->leaks_fixed              = result.leaks_fixed;
695      check->has_leaks_fixed          = result.leaks_fixed != 0;
696      check->image_end_offset         = result.image_end_offset;
697      check->has_image_end_offset     = result.image_end_offset != 0;
698      check->total_clusters           = result.bfi.total_clusters;
699      check->has_total_clusters       = result.bfi.total_clusters != 0;
700      check->allocated_clusters       = result.bfi.allocated_clusters;
701      check->has_allocated_clusters   = result.bfi.allocated_clusters != 0;
702      check->fragmented_clusters      = result.bfi.fragmented_clusters;
703      check->has_fragmented_clusters  = result.bfi.fragmented_clusters != 0;
704      check->compressed_clusters      = result.bfi.compressed_clusters;
705      check->has_compressed_clusters  = result.bfi.compressed_clusters != 0;
706  
707      return 0;
708  }
709  
710  /*
711   * Checks an image for consistency. Exit codes:
712   *
713   *  0 - Check completed, image is good
714   *  1 - Check not completed because of internal errors
715   *  2 - Check completed, image is corrupted
716   *  3 - Check completed, image has leaked clusters, but is good otherwise
717   * 63 - Checks are not supported by the image format
718   */
719  static int img_check(int argc, char **argv)
720  {
721      int c, ret;
722      OutputFormat output_format = OFORMAT_HUMAN;
723      const char *filename, *fmt, *output, *cache;
724      BlockBackend *blk;
725      BlockDriverState *bs;
726      int fix = 0;
727      int flags = BDRV_O_CHECK;
728      bool writethrough;
729      ImageCheck *check;
730      bool quiet = false;
731      bool image_opts = false;
732      bool force_share = false;
733  
734      fmt = NULL;
735      output = NULL;
736      cache = BDRV_DEFAULT_CACHE;
737  
738      for(;;) {
739          int option_index = 0;
740          static const struct option long_options[] = {
741              {"help", no_argument, 0, 'h'},
742              {"format", required_argument, 0, 'f'},
743              {"repair", required_argument, 0, 'r'},
744              {"output", required_argument, 0, OPTION_OUTPUT},
745              {"object", required_argument, 0, OPTION_OBJECT},
746              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
747              {"force-share", no_argument, 0, 'U'},
748              {0, 0, 0, 0}
749          };
750          c = getopt_long(argc, argv, ":hf:r:T:qU",
751                          long_options, &option_index);
752          if (c == -1) {
753              break;
754          }
755          switch(c) {
756          case ':':
757              missing_argument(argv[optind - 1]);
758              break;
759          case '?':
760              unrecognized_option(argv[optind - 1]);
761              break;
762          case 'h':
763              help();
764              break;
765          case 'f':
766              fmt = optarg;
767              break;
768          case 'r':
769              flags |= BDRV_O_RDWR;
770  
771              if (!strcmp(optarg, "leaks")) {
772                  fix = BDRV_FIX_LEAKS;
773              } else if (!strcmp(optarg, "all")) {
774                  fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
775              } else {
776                  error_exit("Unknown option value for -r "
777                             "(expecting 'leaks' or 'all'): %s", optarg);
778              }
779              break;
780          case OPTION_OUTPUT:
781              output = optarg;
782              break;
783          case 'T':
784              cache = optarg;
785              break;
786          case 'q':
787              quiet = true;
788              break;
789          case 'U':
790              force_share = true;
791              break;
792          case OPTION_OBJECT:
793              user_creatable_process_cmdline(optarg);
794              break;
795          case OPTION_IMAGE_OPTS:
796              image_opts = true;
797              break;
798          }
799      }
800      if (optind != argc - 1) {
801          error_exit("Expecting one image file name");
802      }
803      filename = argv[optind++];
804  
805      if (output && !strcmp(output, "json")) {
806          output_format = OFORMAT_JSON;
807      } else if (output && !strcmp(output, "human")) {
808          output_format = OFORMAT_HUMAN;
809      } else if (output) {
810          error_report("--output must be used with human or json as argument.");
811          return 1;
812      }
813  
814      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
815      if (ret < 0) {
816          error_report("Invalid source cache option: %s", cache);
817          return 1;
818      }
819  
820      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
821                     force_share);
822      if (!blk) {
823          return 1;
824      }
825      bs = blk_bs(blk);
826  
827      check = g_new0(ImageCheck, 1);
828      ret = collect_image_check(bs, check, filename, fmt, fix);
829  
830      if (ret == -ENOTSUP) {
831          error_report("This image format does not support checks");
832          ret = 63;
833          goto fail;
834      }
835  
836      if (check->corruptions_fixed || check->leaks_fixed) {
837          int corruptions_fixed, leaks_fixed;
838          bool has_leaks_fixed, has_corruptions_fixed;
839  
840          leaks_fixed         = check->leaks_fixed;
841          has_leaks_fixed     = check->has_leaks_fixed;
842          corruptions_fixed   = check->corruptions_fixed;
843          has_corruptions_fixed = check->has_corruptions_fixed;
844  
845          if (output_format == OFORMAT_HUMAN) {
846              qprintf(quiet,
847                      "The following inconsistencies were found and repaired:\n\n"
848                      "    %" PRId64 " leaked clusters\n"
849                      "    %" PRId64 " corruptions\n\n"
850                      "Double checking the fixed image now...\n",
851                      check->leaks_fixed,
852                      check->corruptions_fixed);
853          }
854  
855          qapi_free_ImageCheck(check);
856          check = g_new0(ImageCheck, 1);
857          ret = collect_image_check(bs, check, filename, fmt, 0);
858  
859          check->leaks_fixed          = leaks_fixed;
860          check->has_leaks_fixed      = has_leaks_fixed;
861          check->corruptions_fixed    = corruptions_fixed;
862          check->has_corruptions_fixed = has_corruptions_fixed;
863      }
864  
865      if (!ret) {
866          switch (output_format) {
867          case OFORMAT_HUMAN:
868              dump_human_image_check(check, quiet);
869              break;
870          case OFORMAT_JSON:
871              dump_json_image_check(check, quiet);
872              break;
873          }
874      }
875  
876      if (ret || check->check_errors) {
877          if (ret) {
878              error_report("Check failed: %s", strerror(-ret));
879          } else {
880              error_report("Check failed");
881          }
882          ret = 1;
883          goto fail;
884      }
885  
886      if (check->corruptions) {
887          ret = 2;
888      } else if (check->leaks) {
889          ret = 3;
890      } else {
891          ret = 0;
892      }
893  
894  fail:
895      qapi_free_ImageCheck(check);
896      blk_unref(blk);
897      return ret;
898  }
899  
900  typedef struct CommonBlockJobCBInfo {
901      BlockDriverState *bs;
902      Error **errp;
903  } CommonBlockJobCBInfo;
904  
905  static void common_block_job_cb(void *opaque, int ret)
906  {
907      CommonBlockJobCBInfo *cbi = opaque;
908  
909      if (ret < 0) {
910          error_setg_errno(cbi->errp, -ret, "Block job failed");
911      }
912  }
913  
914  static void run_block_job(BlockJob *job, Error **errp)
915  {
916      uint64_t progress_current, progress_total;
917      AioContext *aio_context = block_job_get_aio_context(job);
918      int ret = 0;
919  
920      job_lock();
921      job_ref_locked(&job->job);
922      do {
923          float progress = 0.0f;
924          job_unlock();
925          aio_poll(aio_context, true);
926  
927          progress_get_snapshot(&job->job.progress, &progress_current,
928                                &progress_total);
929          if (progress_total) {
930              progress = (float)progress_current / progress_total * 100.f;
931          }
932          qemu_progress_print(progress, 0);
933          job_lock();
934      } while (!job_is_ready_locked(&job->job) &&
935               !job_is_completed_locked(&job->job));
936  
937      if (!job_is_completed_locked(&job->job)) {
938          ret = job_complete_sync_locked(&job->job, errp);
939      } else {
940          ret = job->job.ret;
941      }
942      job_unref_locked(&job->job);
943      job_unlock();
944  
945      /* publish completion progress only when success */
946      if (!ret) {
947          qemu_progress_print(100.f, 0);
948      }
949  }
950  
951  static int img_commit(int argc, char **argv)
952  {
953      int c, ret, flags;
954      const char *filename, *fmt, *cache, *base;
955      BlockBackend *blk;
956      BlockDriverState *bs, *base_bs;
957      BlockJob *job;
958      bool progress = false, quiet = false, drop = false;
959      bool writethrough;
960      Error *local_err = NULL;
961      CommonBlockJobCBInfo cbi;
962      bool image_opts = false;
963      AioContext *aio_context;
964      int64_t rate_limit = 0;
965  
966      fmt = NULL;
967      cache = BDRV_DEFAULT_CACHE;
968      base = NULL;
969      for(;;) {
970          static const struct option long_options[] = {
971              {"help", no_argument, 0, 'h'},
972              {"object", required_argument, 0, OPTION_OBJECT},
973              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
974              {0, 0, 0, 0}
975          };
976          c = getopt_long(argc, argv, ":f:ht:b:dpqr:",
977                          long_options, NULL);
978          if (c == -1) {
979              break;
980          }
981          switch(c) {
982          case ':':
983              missing_argument(argv[optind - 1]);
984              break;
985          case '?':
986              unrecognized_option(argv[optind - 1]);
987              break;
988          case 'h':
989              help();
990              break;
991          case 'f':
992              fmt = optarg;
993              break;
994          case 't':
995              cache = optarg;
996              break;
997          case 'b':
998              base = optarg;
999              /* -b implies -d */
1000              drop = true;
1001              break;
1002          case 'd':
1003              drop = true;
1004              break;
1005          case 'p':
1006              progress = true;
1007              break;
1008          case 'q':
1009              quiet = true;
1010              break;
1011          case 'r':
1012              rate_limit = cvtnum("rate limit", optarg);
1013              if (rate_limit < 0) {
1014                  return 1;
1015              }
1016              break;
1017          case OPTION_OBJECT:
1018              user_creatable_process_cmdline(optarg);
1019              break;
1020          case OPTION_IMAGE_OPTS:
1021              image_opts = true;
1022              break;
1023          }
1024      }
1025  
1026      /* Progress is not shown in Quiet mode */
1027      if (quiet) {
1028          progress = false;
1029      }
1030  
1031      if (optind != argc - 1) {
1032          error_exit("Expecting one image file name");
1033      }
1034      filename = argv[optind++];
1035  
1036      flags = BDRV_O_RDWR | BDRV_O_UNMAP;
1037      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
1038      if (ret < 0) {
1039          error_report("Invalid cache option: %s", cache);
1040          return 1;
1041      }
1042  
1043      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
1044                     false);
1045      if (!blk) {
1046          return 1;
1047      }
1048      bs = blk_bs(blk);
1049  
1050      qemu_progress_init(progress, 1.f);
1051      qemu_progress_print(0.f, 100);
1052  
1053      if (base) {
1054          base_bs = bdrv_find_backing_image(bs, base);
1055          if (!base_bs) {
1056              error_setg(&local_err,
1057                         "Did not find '%s' in the backing chain of '%s'",
1058                         base, filename);
1059              goto done;
1060          }
1061      } else {
1062          /* This is different from QMP, which by default uses the deepest file in
1063           * the backing chain (i.e., the very base); however, the traditional
1064           * behavior of qemu-img commit is using the immediate backing file. */
1065          base_bs = bdrv_backing_chain_next(bs);
1066          if (!base_bs) {
1067              error_setg(&local_err, "Image does not have a backing file");
1068              goto done;
1069          }
1070      }
1071  
1072      cbi = (CommonBlockJobCBInfo){
1073          .errp = &local_err,
1074          .bs   = bs,
1075      };
1076  
1077      aio_context = bdrv_get_aio_context(bs);
1078      aio_context_acquire(aio_context);
1079      commit_active_start("commit", bs, base_bs, JOB_DEFAULT, rate_limit,
1080                          BLOCKDEV_ON_ERROR_REPORT, NULL, common_block_job_cb,
1081                          &cbi, false, &local_err);
1082      aio_context_release(aio_context);
1083      if (local_err) {
1084          goto done;
1085      }
1086  
1087      /* When the block job completes, the BlockBackend reference will point to
1088       * the old backing file. In order to avoid that the top image is already
1089       * deleted, so we can still empty it afterwards, increment the reference
1090       * counter here preemptively. */
1091      if (!drop) {
1092          bdrv_ref(bs);
1093      }
1094  
1095      job = block_job_get("commit");
1096      assert(job);
1097      run_block_job(job, &local_err);
1098      if (local_err) {
1099          goto unref_backing;
1100      }
1101  
1102      if (!drop) {
1103          BlockBackend *old_backing_blk;
1104  
1105          old_backing_blk = blk_new_with_bs(bs, BLK_PERM_WRITE, BLK_PERM_ALL,
1106                                            &local_err);
1107          if (!old_backing_blk) {
1108              goto unref_backing;
1109          }
1110          ret = blk_make_empty(old_backing_blk, &local_err);
1111          blk_unref(old_backing_blk);
1112          if (ret == -ENOTSUP) {
1113              error_free(local_err);
1114              local_err = NULL;
1115          } else if (ret < 0) {
1116              goto unref_backing;
1117          }
1118      }
1119  
1120  unref_backing:
1121      if (!drop) {
1122          bdrv_unref(bs);
1123      }
1124  
1125  done:
1126      qemu_progress_end();
1127  
1128      /*
1129       * Manually inactivate the image first because this way we can know whether
1130       * an error occurred. blk_unref() doesn't tell us about failures.
1131       */
1132      ret = bdrv_inactivate_all();
1133      if (ret < 0 && !local_err) {
1134          error_setg_errno(&local_err, -ret, "Error while closing the image");
1135      }
1136      blk_unref(blk);
1137  
1138      if (local_err) {
1139          error_report_err(local_err);
1140          return 1;
1141      }
1142  
1143      qprintf(quiet, "Image committed.\n");
1144      return 0;
1145  }
1146  
1147  /*
1148   * Returns -1 if 'buf' contains only zeroes, otherwise the byte index
1149   * of the first sector boundary within buf where the sector contains a
1150   * non-zero byte.  This function is robust to a buffer that is not
1151   * sector-aligned.
1152   */
1153  static int64_t find_nonzero(const uint8_t *buf, int64_t n)
1154  {
1155      int64_t i;
1156      int64_t end = QEMU_ALIGN_DOWN(n, BDRV_SECTOR_SIZE);
1157  
1158      for (i = 0; i < end; i += BDRV_SECTOR_SIZE) {
1159          if (!buffer_is_zero(buf + i, BDRV_SECTOR_SIZE)) {
1160              return i;
1161          }
1162      }
1163      if (i < n && !buffer_is_zero(buf + i, n - end)) {
1164          return i;
1165      }
1166      return -1;
1167  }
1168  
1169  /*
1170   * Returns true iff the first sector pointed to by 'buf' contains at least
1171   * a non-NUL byte.
1172   *
1173   * 'pnum' is set to the number of sectors (including and immediately following
1174   * the first one) that are known to be in the same allocated/unallocated state.
1175   * The function will try to align the end offset to alignment boundaries so
1176   * that the request will at least end aligned and consecutive requests will
1177   * also start at an aligned offset.
1178   */
1179  static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum,
1180                                  int64_t sector_num, int alignment)
1181  {
1182      bool is_zero;
1183      int i, tail;
1184  
1185      if (n <= 0) {
1186          *pnum = 0;
1187          return 0;
1188      }
1189      is_zero = buffer_is_zero(buf, BDRV_SECTOR_SIZE);
1190      for(i = 1; i < n; i++) {
1191          buf += BDRV_SECTOR_SIZE;
1192          if (is_zero != buffer_is_zero(buf, BDRV_SECTOR_SIZE)) {
1193              break;
1194          }
1195      }
1196  
1197      if (i == n) {
1198          /*
1199           * The whole buf is the same.
1200           * No reason to split it into chunks, so return now.
1201           */
1202          *pnum = i;
1203          return !is_zero;
1204      }
1205  
1206      tail = (sector_num + i) & (alignment - 1);
1207      if (tail) {
1208          if (is_zero && i <= tail) {
1209              /*
1210               * For sure next sector after i is data, and it will rewrite this
1211               * tail anyway due to RMW. So, let's just write data now.
1212               */
1213              is_zero = false;
1214          }
1215          if (!is_zero) {
1216              /* If possible, align up end offset of allocated areas. */
1217              i += alignment - tail;
1218              i = MIN(i, n);
1219          } else {
1220              /*
1221               * For sure next sector after i is data, and it will rewrite this
1222               * tail anyway due to RMW. Better is avoid RMW and write zeroes up
1223               * to aligned bound.
1224               */
1225              i -= tail;
1226          }
1227      }
1228      *pnum = i;
1229      return !is_zero;
1230  }
1231  
1232  /*
1233   * Like is_allocated_sectors, but if the buffer starts with a used sector,
1234   * up to 'min' consecutive sectors containing zeros are ignored. This avoids
1235   * breaking up write requests for only small sparse areas.
1236   */
1237  static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
1238      int min, int64_t sector_num, int alignment)
1239  {
1240      int ret;
1241      int num_checked, num_used;
1242  
1243      if (n < min) {
1244          min = n;
1245      }
1246  
1247      ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment);
1248      if (!ret) {
1249          return ret;
1250      }
1251  
1252      num_used = *pnum;
1253      buf += BDRV_SECTOR_SIZE * *pnum;
1254      n -= *pnum;
1255      sector_num += *pnum;
1256      num_checked = num_used;
1257  
1258      while (n > 0) {
1259          ret = is_allocated_sectors(buf, n, pnum, sector_num, alignment);
1260  
1261          buf += BDRV_SECTOR_SIZE * *pnum;
1262          n -= *pnum;
1263          sector_num += *pnum;
1264          num_checked += *pnum;
1265          if (ret) {
1266              num_used = num_checked;
1267          } else if (*pnum >= min) {
1268              break;
1269          }
1270      }
1271  
1272      *pnum = num_used;
1273      return 1;
1274  }
1275  
1276  /*
1277   * Compares two buffers sector by sector. Returns 0 if the first
1278   * sector of each buffer matches, non-zero otherwise.
1279   *
1280   * pnum is set to the sector-aligned size of the buffer prefix that
1281   * has the same matching status as the first sector.
1282   */
1283  static int compare_buffers(const uint8_t *buf1, const uint8_t *buf2,
1284                             int64_t bytes, int64_t *pnum)
1285  {
1286      bool res;
1287      int64_t i = MIN(bytes, BDRV_SECTOR_SIZE);
1288  
1289      assert(bytes > 0);
1290  
1291      res = !!memcmp(buf1, buf2, i);
1292      while (i < bytes) {
1293          int64_t len = MIN(bytes - i, BDRV_SECTOR_SIZE);
1294  
1295          if (!!memcmp(buf1 + i, buf2 + i, len) != res) {
1296              break;
1297          }
1298          i += len;
1299      }
1300  
1301      *pnum = i;
1302      return res;
1303  }
1304  
1305  #define IO_BUF_SIZE (2 * MiB)
1306  
1307  /*
1308   * Check if passed sectors are empty (not allocated or contain only 0 bytes)
1309   *
1310   * Intended for use by 'qemu-img compare': Returns 0 in case sectors are
1311   * filled with 0, 1 if sectors contain non-zero data (this is a comparison
1312   * failure), and 4 on error (the exit status for read errors), after emitting
1313   * an error message.
1314   *
1315   * @param blk:  BlockBackend for the image
1316   * @param offset: Starting offset to check
1317   * @param bytes: Number of bytes to check
1318   * @param filename: Name of disk file we are checking (logging purpose)
1319   * @param buffer: Allocated buffer for storing read data
1320   * @param quiet: Flag for quiet mode
1321   */
1322  static int check_empty_sectors(BlockBackend *blk, int64_t offset,
1323                                 int64_t bytes, const char *filename,
1324                                 uint8_t *buffer, bool quiet)
1325  {
1326      int ret = 0;
1327      int64_t idx;
1328  
1329      ret = blk_pread(blk, offset, bytes, buffer, 0);
1330      if (ret < 0) {
1331          error_report("Error while reading offset %" PRId64 " of %s: %s",
1332                       offset, filename, strerror(-ret));
1333          return 4;
1334      }
1335      idx = find_nonzero(buffer, bytes);
1336      if (idx >= 0) {
1337          qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1338                  offset + idx);
1339          return 1;
1340      }
1341  
1342      return 0;
1343  }
1344  
1345  /*
1346   * Compares two images. Exit codes:
1347   *
1348   * 0 - Images are identical or the requested help was printed
1349   * 1 - Images differ
1350   * >1 - Error occurred
1351   */
1352  static int img_compare(int argc, char **argv)
1353  {
1354      const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
1355      BlockBackend *blk1, *blk2;
1356      BlockDriverState *bs1, *bs2;
1357      int64_t total_size1, total_size2;
1358      uint8_t *buf1 = NULL, *buf2 = NULL;
1359      int64_t pnum1, pnum2;
1360      int allocated1, allocated2;
1361      int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
1362      bool progress = false, quiet = false, strict = false;
1363      int flags;
1364      bool writethrough;
1365      int64_t total_size;
1366      int64_t offset = 0;
1367      int64_t chunk;
1368      int c;
1369      uint64_t progress_base;
1370      bool image_opts = false;
1371      bool force_share = false;
1372  
1373      cache = BDRV_DEFAULT_CACHE;
1374      for (;;) {
1375          static const struct option long_options[] = {
1376              {"help", no_argument, 0, 'h'},
1377              {"object", required_argument, 0, OPTION_OBJECT},
1378              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
1379              {"force-share", no_argument, 0, 'U'},
1380              {0, 0, 0, 0}
1381          };
1382          c = getopt_long(argc, argv, ":hf:F:T:pqsU",
1383                          long_options, NULL);
1384          if (c == -1) {
1385              break;
1386          }
1387          switch (c) {
1388          case ':':
1389              missing_argument(argv[optind - 1]);
1390              break;
1391          case '?':
1392              unrecognized_option(argv[optind - 1]);
1393              break;
1394          case 'h':
1395              help();
1396              break;
1397          case 'f':
1398              fmt1 = optarg;
1399              break;
1400          case 'F':
1401              fmt2 = optarg;
1402              break;
1403          case 'T':
1404              cache = optarg;
1405              break;
1406          case 'p':
1407              progress = true;
1408              break;
1409          case 'q':
1410              quiet = true;
1411              break;
1412          case 's':
1413              strict = true;
1414              break;
1415          case 'U':
1416              force_share = true;
1417              break;
1418          case OPTION_OBJECT:
1419              {
1420                  Error *local_err = NULL;
1421  
1422                  if (!user_creatable_add_from_str(optarg, &local_err)) {
1423                      if (local_err) {
1424                          error_report_err(local_err);
1425                          exit(2);
1426                      } else {
1427                          /* Help was printed */
1428                          exit(EXIT_SUCCESS);
1429                      }
1430                  }
1431                  break;
1432              }
1433          case OPTION_IMAGE_OPTS:
1434              image_opts = true;
1435              break;
1436          }
1437      }
1438  
1439      /* Progress is not shown in Quiet mode */
1440      if (quiet) {
1441          progress = false;
1442      }
1443  
1444  
1445      if (optind != argc - 2) {
1446          error_exit("Expecting two image file names");
1447      }
1448      filename1 = argv[optind++];
1449      filename2 = argv[optind++];
1450  
1451      /* Initialize before goto out */
1452      qemu_progress_init(progress, 2.0);
1453  
1454      flags = 0;
1455      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
1456      if (ret < 0) {
1457          error_report("Invalid source cache option: %s", cache);
1458          ret = 2;
1459          goto out3;
1460      }
1461  
1462      blk1 = img_open(image_opts, filename1, fmt1, flags, writethrough, quiet,
1463                      force_share);
1464      if (!blk1) {
1465          ret = 2;
1466          goto out3;
1467      }
1468  
1469      blk2 = img_open(image_opts, filename2, fmt2, flags, writethrough, quiet,
1470                      force_share);
1471      if (!blk2) {
1472          ret = 2;
1473          goto out2;
1474      }
1475      bs1 = blk_bs(blk1);
1476      bs2 = blk_bs(blk2);
1477  
1478      buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
1479      buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
1480      total_size1 = blk_getlength(blk1);
1481      if (total_size1 < 0) {
1482          error_report("Can't get size of %s: %s",
1483                       filename1, strerror(-total_size1));
1484          ret = 4;
1485          goto out;
1486      }
1487      total_size2 = blk_getlength(blk2);
1488      if (total_size2 < 0) {
1489          error_report("Can't get size of %s: %s",
1490                       filename2, strerror(-total_size2));
1491          ret = 4;
1492          goto out;
1493      }
1494      total_size = MIN(total_size1, total_size2);
1495      progress_base = MAX(total_size1, total_size2);
1496  
1497      qemu_progress_print(0, 100);
1498  
1499      if (strict && total_size1 != total_size2) {
1500          ret = 1;
1501          qprintf(quiet, "Strict mode: Image size mismatch!\n");
1502          goto out;
1503      }
1504  
1505      while (offset < total_size) {
1506          int status1, status2;
1507  
1508          status1 = bdrv_block_status_above(bs1, NULL, offset,
1509                                            total_size1 - offset, &pnum1, NULL,
1510                                            NULL);
1511          if (status1 < 0) {
1512              ret = 3;
1513              error_report("Sector allocation test failed for %s", filename1);
1514              goto out;
1515          }
1516          allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
1517  
1518          status2 = bdrv_block_status_above(bs2, NULL, offset,
1519                                            total_size2 - offset, &pnum2, NULL,
1520                                            NULL);
1521          if (status2 < 0) {
1522              ret = 3;
1523              error_report("Sector allocation test failed for %s", filename2);
1524              goto out;
1525          }
1526          allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
1527  
1528          assert(pnum1 && pnum2);
1529          chunk = MIN(pnum1, pnum2);
1530  
1531          if (strict) {
1532              if (status1 != status2) {
1533                  ret = 1;
1534                  qprintf(quiet, "Strict mode: Offset %" PRId64
1535                          " block status mismatch!\n", offset);
1536                  goto out;
1537              }
1538          }
1539          if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
1540              /* nothing to do */
1541          } else if (allocated1 == allocated2) {
1542              if (allocated1) {
1543                  int64_t pnum;
1544  
1545                  chunk = MIN(chunk, IO_BUF_SIZE);
1546                  ret = blk_pread(blk1, offset, chunk, buf1, 0);
1547                  if (ret < 0) {
1548                      error_report("Error while reading offset %" PRId64
1549                                   " of %s: %s",
1550                                   offset, filename1, strerror(-ret));
1551                      ret = 4;
1552                      goto out;
1553                  }
1554                  ret = blk_pread(blk2, offset, chunk, buf2, 0);
1555                  if (ret < 0) {
1556                      error_report("Error while reading offset %" PRId64
1557                                   " of %s: %s",
1558                                   offset, filename2, strerror(-ret));
1559                      ret = 4;
1560                      goto out;
1561                  }
1562                  ret = compare_buffers(buf1, buf2, chunk, &pnum);
1563                  if (ret || pnum != chunk) {
1564                      qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1565                              offset + (ret ? 0 : pnum));
1566                      ret = 1;
1567                      goto out;
1568                  }
1569              }
1570          } else {
1571              chunk = MIN(chunk, IO_BUF_SIZE);
1572              if (allocated1) {
1573                  ret = check_empty_sectors(blk1, offset, chunk,
1574                                            filename1, buf1, quiet);
1575              } else {
1576                  ret = check_empty_sectors(blk2, offset, chunk,
1577                                            filename2, buf1, quiet);
1578              }
1579              if (ret) {
1580                  goto out;
1581              }
1582          }
1583          offset += chunk;
1584          qemu_progress_print(((float) chunk / progress_base) * 100, 100);
1585      }
1586  
1587      if (total_size1 != total_size2) {
1588          BlockBackend *blk_over;
1589          const char *filename_over;
1590  
1591          qprintf(quiet, "Warning: Image size mismatch!\n");
1592          if (total_size1 > total_size2) {
1593              blk_over = blk1;
1594              filename_over = filename1;
1595          } else {
1596              blk_over = blk2;
1597              filename_over = filename2;
1598          }
1599  
1600          while (offset < progress_base) {
1601              ret = bdrv_block_status_above(blk_bs(blk_over), NULL, offset,
1602                                            progress_base - offset, &chunk,
1603                                            NULL, NULL);
1604              if (ret < 0) {
1605                  ret = 3;
1606                  error_report("Sector allocation test failed for %s",
1607                               filename_over);
1608                  goto out;
1609  
1610              }
1611              if (ret & BDRV_BLOCK_ALLOCATED && !(ret & BDRV_BLOCK_ZERO)) {
1612                  chunk = MIN(chunk, IO_BUF_SIZE);
1613                  ret = check_empty_sectors(blk_over, offset, chunk,
1614                                            filename_over, buf1, quiet);
1615                  if (ret) {
1616                      goto out;
1617                  }
1618              }
1619              offset += chunk;
1620              qemu_progress_print(((float) chunk / progress_base) * 100, 100);
1621          }
1622      }
1623  
1624      qprintf(quiet, "Images are identical.\n");
1625      ret = 0;
1626  
1627  out:
1628      qemu_vfree(buf1);
1629      qemu_vfree(buf2);
1630      blk_unref(blk2);
1631  out2:
1632      blk_unref(blk1);
1633  out3:
1634      qemu_progress_end();
1635      return ret;
1636  }
1637  
1638  /* Convenience wrapper around qmp_block_dirty_bitmap_merge */
1639  static void do_dirty_bitmap_merge(const char *dst_node, const char *dst_name,
1640                                    const char *src_node, const char *src_name,
1641                                    Error **errp)
1642  {
1643      BlockDirtyBitmapOrStr *merge_src;
1644      BlockDirtyBitmapOrStrList *list = NULL;
1645  
1646      merge_src = g_new0(BlockDirtyBitmapOrStr, 1);
1647      merge_src->type = QTYPE_QDICT;
1648      merge_src->u.external.node = g_strdup(src_node);
1649      merge_src->u.external.name = g_strdup(src_name);
1650      QAPI_LIST_PREPEND(list, merge_src);
1651      qmp_block_dirty_bitmap_merge(dst_node, dst_name, list, errp);
1652      qapi_free_BlockDirtyBitmapOrStrList(list);
1653  }
1654  
1655  enum ImgConvertBlockStatus {
1656      BLK_DATA,
1657      BLK_ZERO,
1658      BLK_BACKING_FILE,
1659  };
1660  
1661  #define MAX_COROUTINES 16
1662  #define CONVERT_THROTTLE_GROUP "img_convert"
1663  
1664  typedef struct ImgConvertState {
1665      BlockBackend **src;
1666      int64_t *src_sectors;
1667      int *src_alignment;
1668      int src_num;
1669      int64_t total_sectors;
1670      int64_t allocated_sectors;
1671      int64_t allocated_done;
1672      int64_t sector_num;
1673      int64_t wr_offs;
1674      enum ImgConvertBlockStatus status;
1675      int64_t sector_next_status;
1676      BlockBackend *target;
1677      bool has_zero_init;
1678      bool compressed;
1679      bool target_is_new;
1680      bool target_has_backing;
1681      int64_t target_backing_sectors; /* negative if unknown */
1682      bool wr_in_order;
1683      bool copy_range;
1684      bool salvage;
1685      bool quiet;
1686      int min_sparse;
1687      int alignment;
1688      size_t cluster_sectors;
1689      size_t buf_sectors;
1690      long num_coroutines;
1691      int running_coroutines;
1692      Coroutine *co[MAX_COROUTINES];
1693      int64_t wait_sector_num[MAX_COROUTINES];
1694      CoMutex lock;
1695      int ret;
1696  } ImgConvertState;
1697  
1698  static void convert_select_part(ImgConvertState *s, int64_t sector_num,
1699                                  int *src_cur, int64_t *src_cur_offset)
1700  {
1701      *src_cur = 0;
1702      *src_cur_offset = 0;
1703      while (sector_num - *src_cur_offset >= s->src_sectors[*src_cur]) {
1704          *src_cur_offset += s->src_sectors[*src_cur];
1705          (*src_cur)++;
1706          assert(*src_cur < s->src_num);
1707      }
1708  }
1709  
1710  static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
1711  {
1712      int64_t src_cur_offset;
1713      int ret, n, src_cur;
1714      bool post_backing_zero = false;
1715  
1716      convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1717  
1718      assert(s->total_sectors > sector_num);
1719      n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
1720  
1721      if (s->target_backing_sectors >= 0) {
1722          if (sector_num >= s->target_backing_sectors) {
1723              post_backing_zero = true;
1724          } else if (sector_num + n > s->target_backing_sectors) {
1725              /* Split requests around target_backing_sectors (because
1726               * starting from there, zeros are handled differently) */
1727              n = s->target_backing_sectors - sector_num;
1728          }
1729      }
1730  
1731      if (s->sector_next_status <= sector_num) {
1732          uint64_t offset = (sector_num - src_cur_offset) * BDRV_SECTOR_SIZE;
1733          int64_t count;
1734          int tail;
1735          BlockDriverState *src_bs = blk_bs(s->src[src_cur]);
1736          BlockDriverState *base;
1737  
1738          if (s->target_has_backing) {
1739              base = bdrv_cow_bs(bdrv_skip_filters(src_bs));
1740          } else {
1741              base = NULL;
1742          }
1743  
1744          do {
1745              count = n * BDRV_SECTOR_SIZE;
1746  
1747              ret = bdrv_block_status_above(src_bs, base, offset, count, &count,
1748                                            NULL, NULL);
1749  
1750              if (ret < 0) {
1751                  if (s->salvage) {
1752                      if (n == 1) {
1753                          if (!s->quiet) {
1754                              warn_report("error while reading block status at "
1755                                          "offset %" PRIu64 ": %s", offset,
1756                                          strerror(-ret));
1757                          }
1758                          /* Just try to read the data, then */
1759                          ret = BDRV_BLOCK_DATA;
1760                          count = BDRV_SECTOR_SIZE;
1761                      } else {
1762                          /* Retry on a shorter range */
1763                          n = DIV_ROUND_UP(n, 4);
1764                      }
1765                  } else {
1766                      error_report("error while reading block status at offset "
1767                                   "%" PRIu64 ": %s", offset, strerror(-ret));
1768                      return ret;
1769                  }
1770              }
1771          } while (ret < 0);
1772  
1773          n = DIV_ROUND_UP(count, BDRV_SECTOR_SIZE);
1774  
1775          /*
1776           * Avoid that s->sector_next_status becomes unaligned to the source
1777           * request alignment and/or cluster size to avoid unnecessary read
1778           * cycles.
1779           */
1780          tail = (sector_num - src_cur_offset + n) % s->src_alignment[src_cur];
1781          if (n > tail) {
1782              n -= tail;
1783          }
1784  
1785          if (ret & BDRV_BLOCK_ZERO) {
1786              s->status = post_backing_zero ? BLK_BACKING_FILE : BLK_ZERO;
1787          } else if (ret & BDRV_BLOCK_DATA) {
1788              s->status = BLK_DATA;
1789          } else {
1790              s->status = s->target_has_backing ? BLK_BACKING_FILE : BLK_DATA;
1791          }
1792  
1793          s->sector_next_status = sector_num + n;
1794      }
1795  
1796      n = MIN(n, s->sector_next_status - sector_num);
1797      if (s->status == BLK_DATA) {
1798          n = MIN(n, s->buf_sectors);
1799      }
1800  
1801      /* We need to write complete clusters for compressed images, so if an
1802       * unallocated area is shorter than that, we must consider the whole
1803       * cluster allocated. */
1804      if (s->compressed) {
1805          if (n < s->cluster_sectors) {
1806              n = MIN(s->cluster_sectors, s->total_sectors - sector_num);
1807              s->status = BLK_DATA;
1808          } else {
1809              n = QEMU_ALIGN_DOWN(n, s->cluster_sectors);
1810          }
1811      }
1812  
1813      return n;
1814  }
1815  
1816  static int coroutine_fn convert_co_read(ImgConvertState *s, int64_t sector_num,
1817                                          int nb_sectors, uint8_t *buf)
1818  {
1819      uint64_t single_read_until = 0;
1820      int n, ret;
1821  
1822      assert(nb_sectors <= s->buf_sectors);
1823      while (nb_sectors > 0) {
1824          BlockBackend *blk;
1825          int src_cur;
1826          int64_t bs_sectors, src_cur_offset;
1827          uint64_t offset;
1828  
1829          /* In the case of compression with multiple source files, we can get a
1830           * nb_sectors that spreads into the next part. So we must be able to
1831           * read across multiple BDSes for one convert_read() call. */
1832          convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1833          blk = s->src[src_cur];
1834          bs_sectors = s->src_sectors[src_cur];
1835  
1836          offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS;
1837  
1838          n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset));
1839          if (single_read_until > offset) {
1840              n = 1;
1841          }
1842  
1843          ret = blk_co_pread(blk, offset, n << BDRV_SECTOR_BITS, buf, 0);
1844          if (ret < 0) {
1845              if (s->salvage) {
1846                  if (n > 1) {
1847                      single_read_until = offset + (n << BDRV_SECTOR_BITS);
1848                      continue;
1849                  } else {
1850                      if (!s->quiet) {
1851                          warn_report("error while reading offset %" PRIu64
1852                                      ": %s", offset, strerror(-ret));
1853                      }
1854                      memset(buf, 0, BDRV_SECTOR_SIZE);
1855                  }
1856              } else {
1857                  return ret;
1858              }
1859          }
1860  
1861          sector_num += n;
1862          nb_sectors -= n;
1863          buf += n * BDRV_SECTOR_SIZE;
1864      }
1865  
1866      return 0;
1867  }
1868  
1869  
1870  static int coroutine_fn convert_co_write(ImgConvertState *s, int64_t sector_num,
1871                                           int nb_sectors, uint8_t *buf,
1872                                           enum ImgConvertBlockStatus status)
1873  {
1874      int ret;
1875  
1876      while (nb_sectors > 0) {
1877          int n = nb_sectors;
1878          BdrvRequestFlags flags = s->compressed ? BDRV_REQ_WRITE_COMPRESSED : 0;
1879  
1880          switch (status) {
1881          case BLK_BACKING_FILE:
1882              /* If we have a backing file, leave clusters unallocated that are
1883               * unallocated in the source image, so that the backing file is
1884               * visible at the respective offset. */
1885              assert(s->target_has_backing);
1886              break;
1887  
1888          case BLK_DATA:
1889              /* If we're told to keep the target fully allocated (-S 0) or there
1890               * is real non-zero data, we must write it. Otherwise we can treat
1891               * it as zero sectors.
1892               * Compressed clusters need to be written as a whole, so in that
1893               * case we can only save the write if the buffer is completely
1894               * zeroed. */
1895              if (!s->min_sparse ||
1896                  (!s->compressed &&
1897                   is_allocated_sectors_min(buf, n, &n, s->min_sparse,
1898                                            sector_num, s->alignment)) ||
1899                  (s->compressed &&
1900                   !buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)))
1901              {
1902                  ret = blk_co_pwrite(s->target, sector_num << BDRV_SECTOR_BITS,
1903                                      n << BDRV_SECTOR_BITS, buf, flags);
1904                  if (ret < 0) {
1905                      return ret;
1906                  }
1907                  break;
1908              }
1909              /* fall-through */
1910  
1911          case BLK_ZERO:
1912              if (s->has_zero_init) {
1913                  assert(!s->target_has_backing);
1914                  break;
1915              }
1916              ret = blk_co_pwrite_zeroes(s->target,
1917                                         sector_num << BDRV_SECTOR_BITS,
1918                                         n << BDRV_SECTOR_BITS,
1919                                         BDRV_REQ_MAY_UNMAP);
1920              if (ret < 0) {
1921                  return ret;
1922              }
1923              break;
1924          }
1925  
1926          sector_num += n;
1927          nb_sectors -= n;
1928          buf += n * BDRV_SECTOR_SIZE;
1929      }
1930  
1931      return 0;
1932  }
1933  
1934  static int coroutine_fn convert_co_copy_range(ImgConvertState *s, int64_t sector_num,
1935                                                int nb_sectors)
1936  {
1937      int n, ret;
1938  
1939      while (nb_sectors > 0) {
1940          BlockBackend *blk;
1941          int src_cur;
1942          int64_t bs_sectors, src_cur_offset;
1943          int64_t offset;
1944  
1945          convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
1946          offset = (sector_num - src_cur_offset) << BDRV_SECTOR_BITS;
1947          blk = s->src[src_cur];
1948          bs_sectors = s->src_sectors[src_cur];
1949  
1950          n = MIN(nb_sectors, bs_sectors - (sector_num - src_cur_offset));
1951  
1952          ret = blk_co_copy_range(blk, offset, s->target,
1953                                  sector_num << BDRV_SECTOR_BITS,
1954                                  n << BDRV_SECTOR_BITS, 0, 0);
1955          if (ret < 0) {
1956              return ret;
1957          }
1958  
1959          sector_num += n;
1960          nb_sectors -= n;
1961      }
1962      return 0;
1963  }
1964  
1965  static void coroutine_fn convert_co_do_copy(void *opaque)
1966  {
1967      ImgConvertState *s = opaque;
1968      uint8_t *buf = NULL;
1969      int ret, i;
1970      int index = -1;
1971  
1972      for (i = 0; i < s->num_coroutines; i++) {
1973          if (s->co[i] == qemu_coroutine_self()) {
1974              index = i;
1975              break;
1976          }
1977      }
1978      assert(index >= 0);
1979  
1980      s->running_coroutines++;
1981      buf = blk_blockalign(s->target, s->buf_sectors * BDRV_SECTOR_SIZE);
1982  
1983      while (1) {
1984          int n;
1985          int64_t sector_num;
1986          enum ImgConvertBlockStatus status;
1987          bool copy_range;
1988  
1989          qemu_co_mutex_lock(&s->lock);
1990          if (s->ret != -EINPROGRESS || s->sector_num >= s->total_sectors) {
1991              qemu_co_mutex_unlock(&s->lock);
1992              break;
1993          }
1994          WITH_GRAPH_RDLOCK_GUARD() {
1995              n = convert_iteration_sectors(s, s->sector_num);
1996          }
1997          if (n < 0) {
1998              qemu_co_mutex_unlock(&s->lock);
1999              s->ret = n;
2000              break;
2001          }
2002          /* save current sector and allocation status to local variables */
2003          sector_num = s->sector_num;
2004          status = s->status;
2005          if (!s->min_sparse && s->status == BLK_ZERO) {
2006              n = MIN(n, s->buf_sectors);
2007          }
2008          /* increment global sector counter so that other coroutines can
2009           * already continue reading beyond this request */
2010          s->sector_num += n;
2011          qemu_co_mutex_unlock(&s->lock);
2012  
2013          if (status == BLK_DATA || (!s->min_sparse && status == BLK_ZERO)) {
2014              s->allocated_done += n;
2015              qemu_progress_print(100.0 * s->allocated_done /
2016                                          s->allocated_sectors, 0);
2017          }
2018  
2019  retry:
2020          copy_range = s->copy_range && s->status == BLK_DATA;
2021          if (status == BLK_DATA && !copy_range) {
2022              ret = convert_co_read(s, sector_num, n, buf);
2023              if (ret < 0) {
2024                  error_report("error while reading at byte %lld: %s",
2025                               sector_num * BDRV_SECTOR_SIZE, strerror(-ret));
2026                  s->ret = ret;
2027              }
2028          } else if (!s->min_sparse && status == BLK_ZERO) {
2029              status = BLK_DATA;
2030              memset(buf, 0x00, n * BDRV_SECTOR_SIZE);
2031          }
2032  
2033          if (s->wr_in_order) {
2034              /* keep writes in order */
2035              while (s->wr_offs != sector_num && s->ret == -EINPROGRESS) {
2036                  s->wait_sector_num[index] = sector_num;
2037                  qemu_coroutine_yield();
2038              }
2039              s->wait_sector_num[index] = -1;
2040          }
2041  
2042          if (s->ret == -EINPROGRESS) {
2043              if (copy_range) {
2044                  WITH_GRAPH_RDLOCK_GUARD() {
2045                      ret = convert_co_copy_range(s, sector_num, n);
2046                  }
2047                  if (ret) {
2048                      s->copy_range = false;
2049                      goto retry;
2050                  }
2051              } else {
2052                  ret = convert_co_write(s, sector_num, n, buf, status);
2053              }
2054              if (ret < 0) {
2055                  error_report("error while writing at byte %lld: %s",
2056                               sector_num * BDRV_SECTOR_SIZE, strerror(-ret));
2057                  s->ret = ret;
2058              }
2059          }
2060  
2061          if (s->wr_in_order) {
2062              /* reenter the coroutine that might have waited
2063               * for this write to complete */
2064              s->wr_offs = sector_num + n;
2065              for (i = 0; i < s->num_coroutines; i++) {
2066                  if (s->co[i] && s->wait_sector_num[i] == s->wr_offs) {
2067                      /*
2068                       * A -> B -> A cannot occur because A has
2069                       * s->wait_sector_num[i] == -1 during A -> B.  Therefore
2070                       * B will never enter A during this time window.
2071                       */
2072                      qemu_coroutine_enter(s->co[i]);
2073                      break;
2074                  }
2075              }
2076          }
2077      }
2078  
2079      qemu_vfree(buf);
2080      s->co[index] = NULL;
2081      s->running_coroutines--;
2082      if (!s->running_coroutines && s->ret == -EINPROGRESS) {
2083          /* the convert job finished successfully */
2084          s->ret = 0;
2085      }
2086  }
2087  
2088  static int convert_do_copy(ImgConvertState *s)
2089  {
2090      int ret, i, n;
2091      int64_t sector_num = 0;
2092  
2093      /* Check whether we have zero initialisation or can get it efficiently */
2094      if (!s->has_zero_init && s->target_is_new && s->min_sparse &&
2095          !s->target_has_backing) {
2096          s->has_zero_init = bdrv_has_zero_init(blk_bs(s->target));
2097      }
2098  
2099      /* Allocate buffer for copied data. For compressed images, only one cluster
2100       * can be copied at a time. */
2101      if (s->compressed) {
2102          if (s->cluster_sectors <= 0 || s->cluster_sectors > s->buf_sectors) {
2103              error_report("invalid cluster size");
2104              return -EINVAL;
2105          }
2106          s->buf_sectors = s->cluster_sectors;
2107      }
2108  
2109      while (sector_num < s->total_sectors) {
2110          n = convert_iteration_sectors(s, sector_num);
2111          if (n < 0) {
2112              return n;
2113          }
2114          if (s->status == BLK_DATA || (!s->min_sparse && s->status == BLK_ZERO))
2115          {
2116              s->allocated_sectors += n;
2117          }
2118          sector_num += n;
2119      }
2120  
2121      /* Do the copy */
2122      s->sector_next_status = 0;
2123      s->ret = -EINPROGRESS;
2124  
2125      qemu_co_mutex_init(&s->lock);
2126      for (i = 0; i < s->num_coroutines; i++) {
2127          s->co[i] = qemu_coroutine_create(convert_co_do_copy, s);
2128          s->wait_sector_num[i] = -1;
2129          qemu_coroutine_enter(s->co[i]);
2130      }
2131  
2132      while (s->running_coroutines) {
2133          main_loop_wait(false);
2134      }
2135  
2136      if (s->compressed && !s->ret) {
2137          /* signal EOF to align */
2138          ret = blk_pwrite_compressed(s->target, 0, 0, NULL);
2139          if (ret < 0) {
2140              return ret;
2141          }
2142      }
2143  
2144      return s->ret;
2145  }
2146  
2147  /* Check that bitmaps can be copied, or output an error */
2148  static int convert_check_bitmaps(BlockDriverState *src, bool skip_broken)
2149  {
2150      BdrvDirtyBitmap *bm;
2151  
2152      if (!bdrv_supports_persistent_dirty_bitmap(src)) {
2153          error_report("Source lacks bitmap support");
2154          return -1;
2155      }
2156      FOR_EACH_DIRTY_BITMAP(src, bm) {
2157          if (!bdrv_dirty_bitmap_get_persistence(bm)) {
2158              continue;
2159          }
2160          if (!skip_broken && bdrv_dirty_bitmap_inconsistent(bm)) {
2161              error_report("Cannot copy inconsistent bitmap '%s'",
2162                           bdrv_dirty_bitmap_name(bm));
2163              error_printf("Try --skip-broken-bitmaps, or "
2164                           "use 'qemu-img bitmap --remove' to delete it\n");
2165              return -1;
2166          }
2167      }
2168      return 0;
2169  }
2170  
2171  static int convert_copy_bitmaps(BlockDriverState *src, BlockDriverState *dst,
2172                                  bool skip_broken)
2173  {
2174      BdrvDirtyBitmap *bm;
2175      Error *err = NULL;
2176  
2177      FOR_EACH_DIRTY_BITMAP(src, bm) {
2178          const char *name;
2179  
2180          if (!bdrv_dirty_bitmap_get_persistence(bm)) {
2181              continue;
2182          }
2183          name = bdrv_dirty_bitmap_name(bm);
2184          if (skip_broken && bdrv_dirty_bitmap_inconsistent(bm)) {
2185              warn_report("Skipping inconsistent bitmap '%s'", name);
2186              continue;
2187          }
2188          qmp_block_dirty_bitmap_add(dst->node_name, name,
2189                                     true, bdrv_dirty_bitmap_granularity(bm),
2190                                     true, true,
2191                                     true, !bdrv_dirty_bitmap_enabled(bm),
2192                                     &err);
2193          if (err) {
2194              error_reportf_err(err, "Failed to create bitmap %s: ", name);
2195              return -1;
2196          }
2197  
2198          do_dirty_bitmap_merge(dst->node_name, name, src->node_name, name,
2199                                &err);
2200          if (err) {
2201              error_reportf_err(err, "Failed to populate bitmap %s: ", name);
2202              qmp_block_dirty_bitmap_remove(dst->node_name, name, NULL);
2203              return -1;
2204          }
2205      }
2206  
2207      return 0;
2208  }
2209  
2210  #define MAX_BUF_SECTORS 32768
2211  
2212  static void set_rate_limit(BlockBackend *blk, int64_t rate_limit)
2213  {
2214      ThrottleConfig cfg;
2215  
2216      throttle_config_init(&cfg);
2217      cfg.buckets[THROTTLE_BPS_WRITE].avg = rate_limit;
2218  
2219      blk_io_limits_enable(blk, CONVERT_THROTTLE_GROUP);
2220      blk_set_io_limits(blk, &cfg);
2221  }
2222  
2223  static int img_convert(int argc, char **argv)
2224  {
2225      int c, bs_i, flags, src_flags = BDRV_O_NO_SHARE;
2226      const char *fmt = NULL, *out_fmt = NULL, *cache = "unsafe",
2227                 *src_cache = BDRV_DEFAULT_CACHE, *out_baseimg = NULL,
2228                 *out_filename, *out_baseimg_param, *snapshot_name = NULL,
2229                 *backing_fmt = NULL;
2230      BlockDriver *drv = NULL, *proto_drv = NULL;
2231      BlockDriverInfo bdi;
2232      BlockDriverState *out_bs;
2233      QemuOpts *opts = NULL, *sn_opts = NULL;
2234      QemuOptsList *create_opts = NULL;
2235      QDict *open_opts = NULL;
2236      char *options = NULL;
2237      Error *local_err = NULL;
2238      bool writethrough, src_writethrough, image_opts = false,
2239           skip_create = false, progress = false, tgt_image_opts = false;
2240      int64_t ret = -EINVAL;
2241      bool force_share = false;
2242      bool explict_min_sparse = false;
2243      bool bitmaps = false;
2244      bool skip_broken = false;
2245      int64_t rate_limit = 0;
2246  
2247      ImgConvertState s = (ImgConvertState) {
2248          /* Need at least 4k of zeros for sparse detection */
2249          .min_sparse         = 8,
2250          .copy_range         = false,
2251          .buf_sectors        = IO_BUF_SIZE / BDRV_SECTOR_SIZE,
2252          .wr_in_order        = true,
2253          .num_coroutines     = 8,
2254      };
2255  
2256      for(;;) {
2257          static const struct option long_options[] = {
2258              {"help", no_argument, 0, 'h'},
2259              {"object", required_argument, 0, OPTION_OBJECT},
2260              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
2261              {"force-share", no_argument, 0, 'U'},
2262              {"target-image-opts", no_argument, 0, OPTION_TARGET_IMAGE_OPTS},
2263              {"salvage", no_argument, 0, OPTION_SALVAGE},
2264              {"target-is-zero", no_argument, 0, OPTION_TARGET_IS_ZERO},
2265              {"bitmaps", no_argument, 0, OPTION_BITMAPS},
2266              {"skip-broken-bitmaps", no_argument, 0, OPTION_SKIP_BROKEN},
2267              {0, 0, 0, 0}
2268          };
2269          c = getopt_long(argc, argv, ":hf:O:B:CcF:o:l:S:pt:T:qnm:WUr:",
2270                          long_options, NULL);
2271          if (c == -1) {
2272              break;
2273          }
2274          switch(c) {
2275          case ':':
2276              missing_argument(argv[optind - 1]);
2277              break;
2278          case '?':
2279              unrecognized_option(argv[optind - 1]);
2280              break;
2281          case 'h':
2282              help();
2283              break;
2284          case 'f':
2285              fmt = optarg;
2286              break;
2287          case 'O':
2288              out_fmt = optarg;
2289              break;
2290          case 'B':
2291              out_baseimg = optarg;
2292              break;
2293          case 'C':
2294              s.copy_range = true;
2295              break;
2296          case 'c':
2297              s.compressed = true;
2298              break;
2299          case 'F':
2300              backing_fmt = optarg;
2301              break;
2302          case 'o':
2303              if (accumulate_options(&options, optarg) < 0) {
2304                  goto fail_getopt;
2305              }
2306              break;
2307          case 'l':
2308              if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
2309                  sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
2310                                                    optarg, false);
2311                  if (!sn_opts) {
2312                      error_report("Failed in parsing snapshot param '%s'",
2313                                   optarg);
2314                      goto fail_getopt;
2315                  }
2316              } else {
2317                  snapshot_name = optarg;
2318              }
2319              break;
2320          case 'S':
2321          {
2322              int64_t sval;
2323  
2324              sval = cvtnum("buffer size for sparse output", optarg);
2325              if (sval < 0) {
2326                  goto fail_getopt;
2327              } else if (!QEMU_IS_ALIGNED(sval, BDRV_SECTOR_SIZE) ||
2328                  sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) {
2329                  error_report("Invalid buffer size for sparse output specified. "
2330                      "Valid sizes are multiples of %llu up to %llu. Select "
2331                      "0 to disable sparse detection (fully allocates output).",
2332                      BDRV_SECTOR_SIZE, MAX_BUF_SECTORS * BDRV_SECTOR_SIZE);
2333                  goto fail_getopt;
2334              }
2335  
2336              s.min_sparse = sval / BDRV_SECTOR_SIZE;
2337              explict_min_sparse = true;
2338              break;
2339          }
2340          case 'p':
2341              progress = true;
2342              break;
2343          case 't':
2344              cache = optarg;
2345              break;
2346          case 'T':
2347              src_cache = optarg;
2348              break;
2349          case 'q':
2350              s.quiet = true;
2351              break;
2352          case 'n':
2353              skip_create = true;
2354              break;
2355          case 'm':
2356              if (qemu_strtol(optarg, NULL, 0, &s.num_coroutines) ||
2357                  s.num_coroutines < 1 || s.num_coroutines > MAX_COROUTINES) {
2358                  error_report("Invalid number of coroutines. Allowed number of"
2359                               " coroutines is between 1 and %d", MAX_COROUTINES);
2360                  goto fail_getopt;
2361              }
2362              break;
2363          case 'W':
2364              s.wr_in_order = false;
2365              break;
2366          case 'U':
2367              force_share = true;
2368              break;
2369          case 'r':
2370              rate_limit = cvtnum("rate limit", optarg);
2371              if (rate_limit < 0) {
2372                  goto fail_getopt;
2373              }
2374              break;
2375          case OPTION_OBJECT:
2376              user_creatable_process_cmdline(optarg);
2377              break;
2378          case OPTION_IMAGE_OPTS:
2379              image_opts = true;
2380              break;
2381          case OPTION_SALVAGE:
2382              s.salvage = true;
2383              break;
2384          case OPTION_TARGET_IMAGE_OPTS:
2385              tgt_image_opts = true;
2386              break;
2387          case OPTION_TARGET_IS_ZERO:
2388              /*
2389               * The user asserting that the target is blank has the
2390               * same effect as the target driver supporting zero
2391               * initialisation.
2392               */
2393              s.has_zero_init = true;
2394              break;
2395          case OPTION_BITMAPS:
2396              bitmaps = true;
2397              break;
2398          case OPTION_SKIP_BROKEN:
2399              skip_broken = true;
2400              break;
2401          }
2402      }
2403  
2404      if (!out_fmt && !tgt_image_opts) {
2405          out_fmt = "raw";
2406      }
2407  
2408      if (skip_broken && !bitmaps) {
2409          error_report("Use of --skip-broken-bitmaps requires --bitmaps");
2410          goto fail_getopt;
2411      }
2412  
2413      if (s.compressed && s.copy_range) {
2414          error_report("Cannot enable copy offloading when -c is used");
2415          goto fail_getopt;
2416      }
2417  
2418      if (explict_min_sparse && s.copy_range) {
2419          error_report("Cannot enable copy offloading when -S is used");
2420          goto fail_getopt;
2421      }
2422  
2423      if (s.copy_range && s.salvage) {
2424          error_report("Cannot use copy offloading in salvaging mode");
2425          goto fail_getopt;
2426      }
2427  
2428      if (tgt_image_opts && !skip_create) {
2429          error_report("--target-image-opts requires use of -n flag");
2430          goto fail_getopt;
2431      }
2432  
2433      if (skip_create && options) {
2434          error_report("-o has no effect when skipping image creation");
2435          goto fail_getopt;
2436      }
2437  
2438      if (s.has_zero_init && !skip_create) {
2439          error_report("--target-is-zero requires use of -n flag");
2440          goto fail_getopt;
2441      }
2442  
2443      s.src_num = argc - optind - 1;
2444      out_filename = s.src_num >= 1 ? argv[argc - 1] : NULL;
2445  
2446      if (options && has_help_option(options)) {
2447          if (out_fmt) {
2448              ret = print_block_option_help(out_filename, out_fmt);
2449              goto fail_getopt;
2450          } else {
2451              error_report("Option help requires a format be specified");
2452              goto fail_getopt;
2453          }
2454      }
2455  
2456      if (s.src_num < 1) {
2457          error_report("Must specify image file name");
2458          goto fail_getopt;
2459      }
2460  
2461      /* ret is still -EINVAL until here */
2462      ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
2463      if (ret < 0) {
2464          error_report("Invalid source cache option: %s", src_cache);
2465          goto fail_getopt;
2466      }
2467  
2468      /* Initialize before goto out */
2469      if (s.quiet) {
2470          progress = false;
2471      }
2472      qemu_progress_init(progress, 1.0);
2473      qemu_progress_print(0, 100);
2474  
2475      s.src = g_new0(BlockBackend *, s.src_num);
2476      s.src_sectors = g_new(int64_t, s.src_num);
2477      s.src_alignment = g_new(int, s.src_num);
2478  
2479      for (bs_i = 0; bs_i < s.src_num; bs_i++) {
2480          BlockDriverState *src_bs;
2481          s.src[bs_i] = img_open(image_opts, argv[optind + bs_i],
2482                                 fmt, src_flags, src_writethrough, s.quiet,
2483                                 force_share);
2484          if (!s.src[bs_i]) {
2485              ret = -1;
2486              goto out;
2487          }
2488          s.src_sectors[bs_i] = blk_nb_sectors(s.src[bs_i]);
2489          if (s.src_sectors[bs_i] < 0) {
2490              error_report("Could not get size of %s: %s",
2491                           argv[optind + bs_i], strerror(-s.src_sectors[bs_i]));
2492              ret = -1;
2493              goto out;
2494          }
2495          src_bs = blk_bs(s.src[bs_i]);
2496          s.src_alignment[bs_i] = DIV_ROUND_UP(src_bs->bl.request_alignment,
2497                                               BDRV_SECTOR_SIZE);
2498          if (!bdrv_get_info(src_bs, &bdi)) {
2499              s.src_alignment[bs_i] = MAX(s.src_alignment[bs_i],
2500                                          bdi.cluster_size / BDRV_SECTOR_SIZE);
2501          }
2502          s.total_sectors += s.src_sectors[bs_i];
2503      }
2504  
2505      if (sn_opts) {
2506          bdrv_snapshot_load_tmp(blk_bs(s.src[0]),
2507                                 qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
2508                                 qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
2509                                 &local_err);
2510      } else if (snapshot_name != NULL) {
2511          if (s.src_num > 1) {
2512              error_report("No support for concatenating multiple snapshot");
2513              ret = -1;
2514              goto out;
2515          }
2516  
2517          bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(s.src[0]), snapshot_name,
2518                                               &local_err);
2519      }
2520      if (local_err) {
2521          error_reportf_err(local_err, "Failed to load snapshot: ");
2522          ret = -1;
2523          goto out;
2524      }
2525  
2526      if (!skip_create) {
2527          /* Find driver and parse its options */
2528          drv = bdrv_find_format(out_fmt);
2529          if (!drv) {
2530              error_report("Unknown file format '%s'", out_fmt);
2531              ret = -1;
2532              goto out;
2533          }
2534  
2535          proto_drv = bdrv_find_protocol(out_filename, true, &local_err);
2536          if (!proto_drv) {
2537              error_report_err(local_err);
2538              ret = -1;
2539              goto out;
2540          }
2541  
2542          if (!drv->create_opts) {
2543              error_report("Format driver '%s' does not support image creation",
2544                           drv->format_name);
2545              ret = -1;
2546              goto out;
2547          }
2548  
2549          if (!proto_drv->create_opts) {
2550              error_report("Protocol driver '%s' does not support image creation",
2551                           proto_drv->format_name);
2552              ret = -1;
2553              goto out;
2554          }
2555  
2556          create_opts = qemu_opts_append(create_opts, drv->create_opts);
2557          create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
2558  
2559          opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
2560          if (options) {
2561              if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
2562                  error_report_err(local_err);
2563                  ret = -1;
2564                  goto out;
2565              }
2566          }
2567  
2568          qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
2569                              s.total_sectors * BDRV_SECTOR_SIZE, &error_abort);
2570          ret = add_old_style_options(out_fmt, opts, out_baseimg, backing_fmt);
2571          if (ret < 0) {
2572              goto out;
2573          }
2574      }
2575  
2576      /* Get backing file name if -o backing_file was used */
2577      out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
2578      if (out_baseimg_param) {
2579          out_baseimg = out_baseimg_param;
2580      }
2581      s.target_has_backing = (bool) out_baseimg;
2582  
2583      if (s.has_zero_init && s.target_has_backing) {
2584          error_report("Cannot use --target-is-zero when the destination "
2585                       "image has a backing file");
2586          goto out;
2587      }
2588  
2589      if (s.src_num > 1 && out_baseimg) {
2590          error_report("Having a backing file for the target makes no sense when "
2591                       "concatenating multiple input images");
2592          ret = -1;
2593          goto out;
2594      }
2595  
2596      if (out_baseimg_param) {
2597          if (!qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT)) {
2598              error_report("Use of backing file requires explicit "
2599                           "backing format");
2600              ret = -1;
2601              goto out;
2602          }
2603      }
2604  
2605      /* Check if compression is supported */
2606      if (s.compressed) {
2607          bool encryption =
2608              qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false);
2609          const char *encryptfmt =
2610              qemu_opt_get(opts, BLOCK_OPT_ENCRYPT_FORMAT);
2611          const char *preallocation =
2612              qemu_opt_get(opts, BLOCK_OPT_PREALLOC);
2613  
2614          if (drv && !block_driver_can_compress(drv)) {
2615              error_report("Compression not supported for this file format");
2616              ret = -1;
2617              goto out;
2618          }
2619  
2620          if (encryption || encryptfmt) {
2621              error_report("Compression and encryption not supported at "
2622                           "the same time");
2623              ret = -1;
2624              goto out;
2625          }
2626  
2627          if (preallocation
2628              && strcmp(preallocation, "off"))
2629          {
2630              error_report("Compression and preallocation not supported at "
2631                           "the same time");
2632              ret = -1;
2633              goto out;
2634          }
2635      }
2636  
2637      /* Determine if bitmaps need copying */
2638      if (bitmaps) {
2639          if (s.src_num > 1) {
2640              error_report("Copying bitmaps only possible with single source");
2641              ret = -1;
2642              goto out;
2643          }
2644          ret = convert_check_bitmaps(blk_bs(s.src[0]), skip_broken);
2645          if (ret < 0) {
2646              goto out;
2647          }
2648      }
2649  
2650      /*
2651       * The later open call will need any decryption secrets, and
2652       * bdrv_create() will purge "opts", so extract them now before
2653       * they are lost.
2654       */
2655      if (!skip_create) {
2656          open_opts = qdict_new();
2657          qemu_opt_foreach(opts, img_add_key_secrets, open_opts, &error_abort);
2658  
2659          /* Create the new image */
2660          ret = bdrv_create(drv, out_filename, opts, &local_err);
2661          if (ret < 0) {
2662              error_reportf_err(local_err, "%s: error while converting %s: ",
2663                                out_filename, out_fmt);
2664              goto out;
2665          }
2666      }
2667  
2668      s.target_is_new = !skip_create;
2669  
2670      flags = s.min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
2671      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
2672      if (ret < 0) {
2673          error_report("Invalid cache option: %s", cache);
2674          goto out;
2675      }
2676  
2677      if (flags & BDRV_O_NOCACHE) {
2678          /*
2679           * If we open the target with O_DIRECT, it may be necessary to
2680           * extend its size to align to the physical sector size.
2681           */
2682          flags |= BDRV_O_RESIZE;
2683      }
2684  
2685      if (skip_create) {
2686          s.target = img_open(tgt_image_opts, out_filename, out_fmt,
2687                              flags, writethrough, s.quiet, false);
2688      } else {
2689          /* TODO ultimately we should allow --target-image-opts
2690           * to be used even when -n is not given.
2691           * That has to wait for bdrv_create to be improved
2692           * to allow filenames in option syntax
2693           */
2694          s.target = img_open_file(out_filename, open_opts, out_fmt,
2695                                   flags, writethrough, s.quiet, false);
2696          open_opts = NULL; /* blk_new_open will have freed it */
2697      }
2698      if (!s.target) {
2699          ret = -1;
2700          goto out;
2701      }
2702      out_bs = blk_bs(s.target);
2703  
2704      if (bitmaps && !bdrv_supports_persistent_dirty_bitmap(out_bs)) {
2705          error_report("Format driver '%s' does not support bitmaps",
2706                       out_bs->drv->format_name);
2707          ret = -1;
2708          goto out;
2709      }
2710  
2711      if (s.compressed && !block_driver_can_compress(out_bs->drv)) {
2712          error_report("Compression not supported for this file format");
2713          ret = -1;
2714          goto out;
2715      }
2716  
2717      /* increase bufsectors from the default 4096 (2M) if opt_transfer
2718       * or discard_alignment of the out_bs is greater. Limit to
2719       * MAX_BUF_SECTORS as maximum which is currently 32768 (16MB). */
2720      s.buf_sectors = MIN(MAX_BUF_SECTORS,
2721                          MAX(s.buf_sectors,
2722                              MAX(out_bs->bl.opt_transfer >> BDRV_SECTOR_BITS,
2723                                  out_bs->bl.pdiscard_alignment >>
2724                                  BDRV_SECTOR_BITS)));
2725  
2726      /* try to align the write requests to the destination to avoid unnecessary
2727       * RMW cycles. */
2728      s.alignment = MAX(pow2floor(s.min_sparse),
2729                        DIV_ROUND_UP(out_bs->bl.request_alignment,
2730                                     BDRV_SECTOR_SIZE));
2731      assert(is_power_of_2(s.alignment));
2732  
2733      if (skip_create) {
2734          int64_t output_sectors = blk_nb_sectors(s.target);
2735          if (output_sectors < 0) {
2736              error_report("unable to get output image length: %s",
2737                           strerror(-output_sectors));
2738              ret = -1;
2739              goto out;
2740          } else if (output_sectors < s.total_sectors) {
2741              error_report("output file is smaller than input file");
2742              ret = -1;
2743              goto out;
2744          }
2745      }
2746  
2747      if (s.target_has_backing && s.target_is_new) {
2748          /* Errors are treated as "backing length unknown" (which means
2749           * s.target_backing_sectors has to be negative, which it will
2750           * be automatically).  The backing file length is used only
2751           * for optimizations, so such a case is not fatal. */
2752          s.target_backing_sectors =
2753              bdrv_nb_sectors(bdrv_backing_chain_next(out_bs));
2754      } else {
2755          s.target_backing_sectors = -1;
2756      }
2757  
2758      ret = bdrv_get_info(out_bs, &bdi);
2759      if (ret < 0) {
2760          if (s.compressed) {
2761              error_report("could not get block driver info");
2762              goto out;
2763          }
2764      } else {
2765          s.compressed = s.compressed || bdi.needs_compressed_writes;
2766          s.cluster_sectors = bdi.cluster_size / BDRV_SECTOR_SIZE;
2767      }
2768  
2769      if (rate_limit) {
2770          set_rate_limit(s.target, rate_limit);
2771      }
2772  
2773      ret = convert_do_copy(&s);
2774  
2775      /* Now copy the bitmaps */
2776      if (bitmaps && ret == 0) {
2777          ret = convert_copy_bitmaps(blk_bs(s.src[0]), out_bs, skip_broken);
2778      }
2779  
2780  out:
2781      if (!ret) {
2782          qemu_progress_print(100, 0);
2783      }
2784      qemu_progress_end();
2785      qemu_opts_del(opts);
2786      qemu_opts_free(create_opts);
2787      qobject_unref(open_opts);
2788      blk_unref(s.target);
2789      if (s.src) {
2790          for (bs_i = 0; bs_i < s.src_num; bs_i++) {
2791              blk_unref(s.src[bs_i]);
2792          }
2793          g_free(s.src);
2794      }
2795      g_free(s.src_sectors);
2796      g_free(s.src_alignment);
2797  fail_getopt:
2798      qemu_opts_del(sn_opts);
2799      g_free(options);
2800  
2801      return !!ret;
2802  }
2803  
2804  
2805  static void dump_snapshots(BlockDriverState *bs)
2806  {
2807      QEMUSnapshotInfo *sn_tab, *sn;
2808      int nb_sns, i;
2809  
2810      nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2811      if (nb_sns <= 0)
2812          return;
2813      printf("Snapshot list:\n");
2814      bdrv_snapshot_dump(NULL);
2815      printf("\n");
2816      for(i = 0; i < nb_sns; i++) {
2817          sn = &sn_tab[i];
2818          bdrv_snapshot_dump(sn);
2819          printf("\n");
2820      }
2821      g_free(sn_tab);
2822  }
2823  
2824  static void dump_json_block_graph_info_list(BlockGraphInfoList *list)
2825  {
2826      GString *str;
2827      QObject *obj;
2828      Visitor *v = qobject_output_visitor_new(&obj);
2829  
2830      visit_type_BlockGraphInfoList(v, NULL, &list, &error_abort);
2831      visit_complete(v, &obj);
2832      str = qobject_to_json_pretty(obj, true);
2833      assert(str != NULL);
2834      printf("%s\n", str->str);
2835      qobject_unref(obj);
2836      visit_free(v);
2837      g_string_free(str, true);
2838  }
2839  
2840  static void dump_json_block_graph_info(BlockGraphInfo *info)
2841  {
2842      GString *str;
2843      QObject *obj;
2844      Visitor *v = qobject_output_visitor_new(&obj);
2845  
2846      visit_type_BlockGraphInfo(v, NULL, &info, &error_abort);
2847      visit_complete(v, &obj);
2848      str = qobject_to_json_pretty(obj, true);
2849      assert(str != NULL);
2850      printf("%s\n", str->str);
2851      qobject_unref(obj);
2852      visit_free(v);
2853      g_string_free(str, true);
2854  }
2855  
2856  static void dump_human_image_info(BlockGraphInfo *info, int indentation,
2857                                    const char *path)
2858  {
2859      BlockChildInfoList *children_list;
2860  
2861      bdrv_node_info_dump(qapi_BlockGraphInfo_base(info), indentation,
2862                          info->children == NULL);
2863  
2864      for (children_list = info->children; children_list;
2865           children_list = children_list->next)
2866      {
2867          BlockChildInfo *child = children_list->value;
2868          g_autofree char *child_path = NULL;
2869  
2870          printf("%*sChild node '%s%s':\n",
2871                 indentation * 4, "", path, child->name);
2872          child_path = g_strdup_printf("%s%s/", path, child->name);
2873          dump_human_image_info(child->info, indentation + 1, child_path);
2874      }
2875  }
2876  
2877  static void dump_human_image_info_list(BlockGraphInfoList *list)
2878  {
2879      BlockGraphInfoList *elem;
2880      bool delim = false;
2881  
2882      for (elem = list; elem; elem = elem->next) {
2883          if (delim) {
2884              printf("\n");
2885          }
2886          delim = true;
2887  
2888          dump_human_image_info(elem->value, 0, "/");
2889      }
2890  }
2891  
2892  static gboolean str_equal_func(gconstpointer a, gconstpointer b)
2893  {
2894      return strcmp(a, b) == 0;
2895  }
2896  
2897  /**
2898   * Open an image file chain and return an BlockGraphInfoList
2899   *
2900   * @filename: topmost image filename
2901   * @fmt: topmost image format (may be NULL to autodetect)
2902   * @chain: true  - enumerate entire backing file chain
2903   *         false - only topmost image file
2904   *
2905   * Returns a list of BlockNodeInfo objects or NULL if there was an error
2906   * opening an image file.  If there was an error a message will have been
2907   * printed to stderr.
2908   */
2909  static BlockGraphInfoList *collect_image_info_list(bool image_opts,
2910                                                     const char *filename,
2911                                                     const char *fmt,
2912                                                     bool chain, bool force_share)
2913  {
2914      BlockGraphInfoList *head = NULL;
2915      BlockGraphInfoList **tail = &head;
2916      GHashTable *filenames;
2917      Error *err = NULL;
2918  
2919      filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
2920  
2921      while (filename) {
2922          BlockBackend *blk;
2923          BlockDriverState *bs;
2924          BlockGraphInfo *info;
2925  
2926          if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
2927              error_report("Backing file '%s' creates an infinite loop.",
2928                           filename);
2929              goto err;
2930          }
2931          g_hash_table_insert(filenames, (gpointer)filename, NULL);
2932  
2933          blk = img_open(image_opts, filename, fmt,
2934                         BDRV_O_NO_BACKING | BDRV_O_NO_IO, false, false,
2935                         force_share);
2936          if (!blk) {
2937              goto err;
2938          }
2939          bs = blk_bs(blk);
2940  
2941          /*
2942           * Note that the returned BlockGraphInfo object will not have
2943           * information about this image's backing node, because we have opened
2944           * it with BDRV_O_NO_BACKING.  Printing this object will therefore not
2945           * duplicate the backing chain information that we obtain by walking
2946           * the chain manually here.
2947           */
2948          bdrv_graph_rdlock_main_loop();
2949          bdrv_query_block_graph_info(bs, &info, &err);
2950          bdrv_graph_rdunlock_main_loop();
2951  
2952          if (err) {
2953              error_report_err(err);
2954              blk_unref(blk);
2955              goto err;
2956          }
2957  
2958          QAPI_LIST_APPEND(tail, info);
2959  
2960          blk_unref(blk);
2961  
2962          /* Clear parameters that only apply to the topmost image */
2963          filename = fmt = NULL;
2964          image_opts = false;
2965  
2966          if (chain) {
2967              if (info->full_backing_filename) {
2968                  filename = info->full_backing_filename;
2969              } else if (info->backing_filename) {
2970                  error_report("Could not determine absolute backing filename,"
2971                               " but backing filename '%s' present",
2972                               info->backing_filename);
2973                  goto err;
2974              }
2975              if (info->backing_filename_format) {
2976                  fmt = info->backing_filename_format;
2977              }
2978          }
2979      }
2980      g_hash_table_destroy(filenames);
2981      return head;
2982  
2983  err:
2984      qapi_free_BlockGraphInfoList(head);
2985      g_hash_table_destroy(filenames);
2986      return NULL;
2987  }
2988  
2989  static int img_info(int argc, char **argv)
2990  {
2991      int c;
2992      OutputFormat output_format = OFORMAT_HUMAN;
2993      bool chain = false;
2994      const char *filename, *fmt, *output;
2995      BlockGraphInfoList *list;
2996      bool image_opts = false;
2997      bool force_share = false;
2998  
2999      fmt = NULL;
3000      output = NULL;
3001      for(;;) {
3002          int option_index = 0;
3003          static const struct option long_options[] = {
3004              {"help", no_argument, 0, 'h'},
3005              {"format", required_argument, 0, 'f'},
3006              {"output", required_argument, 0, OPTION_OUTPUT},
3007              {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
3008              {"object", required_argument, 0, OPTION_OBJECT},
3009              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3010              {"force-share", no_argument, 0, 'U'},
3011              {0, 0, 0, 0}
3012          };
3013          c = getopt_long(argc, argv, ":f:hU",
3014                          long_options, &option_index);
3015          if (c == -1) {
3016              break;
3017          }
3018          switch(c) {
3019          case ':':
3020              missing_argument(argv[optind - 1]);
3021              break;
3022          case '?':
3023              unrecognized_option(argv[optind - 1]);
3024              break;
3025          case 'h':
3026              help();
3027              break;
3028          case 'f':
3029              fmt = optarg;
3030              break;
3031          case 'U':
3032              force_share = true;
3033              break;
3034          case OPTION_OUTPUT:
3035              output = optarg;
3036              break;
3037          case OPTION_BACKING_CHAIN:
3038              chain = true;
3039              break;
3040          case OPTION_OBJECT:
3041              user_creatable_process_cmdline(optarg);
3042              break;
3043          case OPTION_IMAGE_OPTS:
3044              image_opts = true;
3045              break;
3046          }
3047      }
3048      if (optind != argc - 1) {
3049          error_exit("Expecting one image file name");
3050      }
3051      filename = argv[optind++];
3052  
3053      if (output && !strcmp(output, "json")) {
3054          output_format = OFORMAT_JSON;
3055      } else if (output && !strcmp(output, "human")) {
3056          output_format = OFORMAT_HUMAN;
3057      } else if (output) {
3058          error_report("--output must be used with human or json as argument.");
3059          return 1;
3060      }
3061  
3062      list = collect_image_info_list(image_opts, filename, fmt, chain,
3063                                     force_share);
3064      if (!list) {
3065          return 1;
3066      }
3067  
3068      switch (output_format) {
3069      case OFORMAT_HUMAN:
3070          dump_human_image_info_list(list);
3071          break;
3072      case OFORMAT_JSON:
3073          if (chain) {
3074              dump_json_block_graph_info_list(list);
3075          } else {
3076              dump_json_block_graph_info(list->value);
3077          }
3078          break;
3079      }
3080  
3081      qapi_free_BlockGraphInfoList(list);
3082      return 0;
3083  }
3084  
3085  static int dump_map_entry(OutputFormat output_format, MapEntry *e,
3086                            MapEntry *next)
3087  {
3088      switch (output_format) {
3089      case OFORMAT_HUMAN:
3090          if (e->data && !e->has_offset) {
3091              error_report("File contains external, encrypted or compressed clusters.");
3092              return -1;
3093          }
3094          if (e->data && !e->zero) {
3095              printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
3096                     e->start, e->length,
3097                     e->has_offset ? e->offset : 0,
3098                     e->filename ?: "");
3099          }
3100          /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
3101           * Modify the flags here to allow more coalescing.
3102           */
3103          if (next && (!next->data || next->zero)) {
3104              next->data = false;
3105              next->zero = true;
3106          }
3107          break;
3108      case OFORMAT_JSON:
3109          printf("{ \"start\": %"PRId64", \"length\": %"PRId64","
3110                 " \"depth\": %"PRId64", \"present\": %s, \"zero\": %s,"
3111                 " \"data\": %s, \"compressed\": %s",
3112                 e->start, e->length, e->depth,
3113                 e->present ? "true" : "false",
3114                 e->zero ? "true" : "false",
3115                 e->data ? "true" : "false",
3116                 e->compressed ? "true" : "false");
3117          if (e->has_offset) {
3118              printf(", \"offset\": %"PRId64"", e->offset);
3119          }
3120          putchar('}');
3121  
3122          if (next) {
3123              puts(",");
3124          }
3125          break;
3126      }
3127      return 0;
3128  }
3129  
3130  static int get_block_status(BlockDriverState *bs, int64_t offset,
3131                              int64_t bytes, MapEntry *e)
3132  {
3133      int ret;
3134      int depth;
3135      BlockDriverState *file;
3136      bool has_offset;
3137      int64_t map;
3138      char *filename = NULL;
3139  
3140      /* As an optimization, we could cache the current range of unallocated
3141       * clusters in each file of the chain, and avoid querying the same
3142       * range repeatedly.
3143       */
3144  
3145      depth = 0;
3146      for (;;) {
3147          bs = bdrv_skip_filters(bs);
3148          ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file);
3149          if (ret < 0) {
3150              return ret;
3151          }
3152          assert(bytes);
3153          if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
3154              break;
3155          }
3156          bs = bdrv_cow_bs(bs);
3157          if (bs == NULL) {
3158              ret = 0;
3159              break;
3160          }
3161  
3162          depth++;
3163      }
3164  
3165      has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
3166  
3167      if (file && has_offset) {
3168          bdrv_refresh_filename(file);
3169          filename = file->filename;
3170      }
3171  
3172      *e = (MapEntry) {
3173          .start = offset,
3174          .length = bytes,
3175          .data = !!(ret & BDRV_BLOCK_DATA),
3176          .zero = !!(ret & BDRV_BLOCK_ZERO),
3177          .compressed = !!(ret & BDRV_BLOCK_COMPRESSED),
3178          .offset = map,
3179          .has_offset = has_offset,
3180          .depth = depth,
3181          .present = !!(ret & BDRV_BLOCK_ALLOCATED),
3182          .filename = filename,
3183      };
3184  
3185      return 0;
3186  }
3187  
3188  static inline bool entry_mergeable(const MapEntry *curr, const MapEntry *next)
3189  {
3190      if (curr->length == 0) {
3191          return false;
3192      }
3193      if (curr->zero != next->zero ||
3194          curr->data != next->data ||
3195          curr->compressed != next->compressed ||
3196          curr->depth != next->depth ||
3197          curr->present != next->present ||
3198          !curr->filename != !next->filename ||
3199          curr->has_offset != next->has_offset) {
3200          return false;
3201      }
3202      if (curr->filename && strcmp(curr->filename, next->filename)) {
3203          return false;
3204      }
3205      if (curr->has_offset && curr->offset + curr->length != next->offset) {
3206          return false;
3207      }
3208      return true;
3209  }
3210  
3211  static int img_map(int argc, char **argv)
3212  {
3213      int c;
3214      OutputFormat output_format = OFORMAT_HUMAN;
3215      BlockBackend *blk;
3216      BlockDriverState *bs;
3217      const char *filename, *fmt, *output;
3218      int64_t length;
3219      MapEntry curr = { .length = 0 }, next;
3220      int ret = 0;
3221      bool image_opts = false;
3222      bool force_share = false;
3223      int64_t start_offset = 0;
3224      int64_t max_length = -1;
3225  
3226      fmt = NULL;
3227      output = NULL;
3228      for (;;) {
3229          int option_index = 0;
3230          static const struct option long_options[] = {
3231              {"help", no_argument, 0, 'h'},
3232              {"format", required_argument, 0, 'f'},
3233              {"output", required_argument, 0, OPTION_OUTPUT},
3234              {"object", required_argument, 0, OPTION_OBJECT},
3235              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3236              {"force-share", no_argument, 0, 'U'},
3237              {"start-offset", required_argument, 0, 's'},
3238              {"max-length", required_argument, 0, 'l'},
3239              {0, 0, 0, 0}
3240          };
3241          c = getopt_long(argc, argv, ":f:s:l:hU",
3242                          long_options, &option_index);
3243          if (c == -1) {
3244              break;
3245          }
3246          switch (c) {
3247          case ':':
3248              missing_argument(argv[optind - 1]);
3249              break;
3250          case '?':
3251              unrecognized_option(argv[optind - 1]);
3252              break;
3253          case 'h':
3254              help();
3255              break;
3256          case 'f':
3257              fmt = optarg;
3258              break;
3259          case 'U':
3260              force_share = true;
3261              break;
3262          case OPTION_OUTPUT:
3263              output = optarg;
3264              break;
3265          case 's':
3266              start_offset = cvtnum("start offset", optarg);
3267              if (start_offset < 0) {
3268                  return 1;
3269              }
3270              break;
3271          case 'l':
3272              max_length = cvtnum("max length", optarg);
3273              if (max_length < 0) {
3274                  return 1;
3275              }
3276              break;
3277          case OPTION_OBJECT:
3278              user_creatable_process_cmdline(optarg);
3279              break;
3280          case OPTION_IMAGE_OPTS:
3281              image_opts = true;
3282              break;
3283          }
3284      }
3285      if (optind != argc - 1) {
3286          error_exit("Expecting one image file name");
3287      }
3288      filename = argv[optind];
3289  
3290      if (output && !strcmp(output, "json")) {
3291          output_format = OFORMAT_JSON;
3292      } else if (output && !strcmp(output, "human")) {
3293          output_format = OFORMAT_HUMAN;
3294      } else if (output) {
3295          error_report("--output must be used with human or json as argument.");
3296          return 1;
3297      }
3298  
3299      blk = img_open(image_opts, filename, fmt, 0, false, false, force_share);
3300      if (!blk) {
3301          return 1;
3302      }
3303      bs = blk_bs(blk);
3304  
3305      if (output_format == OFORMAT_HUMAN) {
3306          printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
3307      } else if (output_format == OFORMAT_JSON) {
3308          putchar('[');
3309      }
3310  
3311      length = blk_getlength(blk);
3312      if (length < 0) {
3313          error_report("Failed to get size for '%s'", filename);
3314          return 1;
3315      }
3316      if (max_length != -1) {
3317          length = MIN(start_offset + max_length, length);
3318      }
3319  
3320      curr.start = start_offset;
3321      while (curr.start + curr.length < length) {
3322          int64_t offset = curr.start + curr.length;
3323          int64_t n = length - offset;
3324  
3325          ret = get_block_status(bs, offset, n, &next);
3326          if (ret < 0) {
3327              error_report("Could not read file metadata: %s", strerror(-ret));
3328              goto out;
3329          }
3330  
3331          if (entry_mergeable(&curr, &next)) {
3332              curr.length += next.length;
3333              continue;
3334          }
3335  
3336          if (curr.length > 0) {
3337              ret = dump_map_entry(output_format, &curr, &next);
3338              if (ret < 0) {
3339                  goto out;
3340              }
3341          }
3342          curr = next;
3343      }
3344  
3345      ret = dump_map_entry(output_format, &curr, NULL);
3346      if (output_format == OFORMAT_JSON) {
3347          puts("]");
3348      }
3349  
3350  out:
3351      blk_unref(blk);
3352      return ret < 0;
3353  }
3354  
3355  #define SNAPSHOT_LIST   1
3356  #define SNAPSHOT_CREATE 2
3357  #define SNAPSHOT_APPLY  3
3358  #define SNAPSHOT_DELETE 4
3359  
3360  static int img_snapshot(int argc, char **argv)
3361  {
3362      BlockBackend *blk;
3363      BlockDriverState *bs;
3364      QEMUSnapshotInfo sn;
3365      char *filename, *snapshot_name = NULL;
3366      int c, ret = 0, bdrv_oflags;
3367      int action = 0;
3368      bool quiet = false;
3369      Error *err = NULL;
3370      bool image_opts = false;
3371      bool force_share = false;
3372      int64_t rt;
3373  
3374      bdrv_oflags = BDRV_O_RDWR;
3375      /* Parse commandline parameters */
3376      for(;;) {
3377          static const struct option long_options[] = {
3378              {"help", no_argument, 0, 'h'},
3379              {"object", required_argument, 0, OPTION_OBJECT},
3380              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3381              {"force-share", no_argument, 0, 'U'},
3382              {0, 0, 0, 0}
3383          };
3384          c = getopt_long(argc, argv, ":la:c:d:hqU",
3385                          long_options, NULL);
3386          if (c == -1) {
3387              break;
3388          }
3389          switch(c) {
3390          case ':':
3391              missing_argument(argv[optind - 1]);
3392              break;
3393          case '?':
3394              unrecognized_option(argv[optind - 1]);
3395              break;
3396          case 'h':
3397              help();
3398              return 0;
3399          case 'l':
3400              if (action) {
3401                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3402                  return 0;
3403              }
3404              action = SNAPSHOT_LIST;
3405              bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
3406              break;
3407          case 'a':
3408              if (action) {
3409                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3410                  return 0;
3411              }
3412              action = SNAPSHOT_APPLY;
3413              snapshot_name = optarg;
3414              break;
3415          case 'c':
3416              if (action) {
3417                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3418                  return 0;
3419              }
3420              action = SNAPSHOT_CREATE;
3421              snapshot_name = optarg;
3422              break;
3423          case 'd':
3424              if (action) {
3425                  error_exit("Cannot mix '-l', '-a', '-c', '-d'");
3426                  return 0;
3427              }
3428              action = SNAPSHOT_DELETE;
3429              snapshot_name = optarg;
3430              break;
3431          case 'q':
3432              quiet = true;
3433              break;
3434          case 'U':
3435              force_share = true;
3436              break;
3437          case OPTION_OBJECT:
3438              user_creatable_process_cmdline(optarg);
3439              break;
3440          case OPTION_IMAGE_OPTS:
3441              image_opts = true;
3442              break;
3443          }
3444      }
3445  
3446      if (optind != argc - 1) {
3447          error_exit("Expecting one image file name");
3448      }
3449      filename = argv[optind++];
3450  
3451      /* Open the image */
3452      blk = img_open(image_opts, filename, NULL, bdrv_oflags, false, quiet,
3453                     force_share);
3454      if (!blk) {
3455          return 1;
3456      }
3457      bs = blk_bs(blk);
3458  
3459      /* Perform the requested action */
3460      switch(action) {
3461      case SNAPSHOT_LIST:
3462          dump_snapshots(bs);
3463          break;
3464  
3465      case SNAPSHOT_CREATE:
3466          memset(&sn, 0, sizeof(sn));
3467          pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
3468  
3469          rt = g_get_real_time();
3470          sn.date_sec = rt / G_USEC_PER_SEC;
3471          sn.date_nsec = (rt % G_USEC_PER_SEC) * 1000;
3472  
3473          ret = bdrv_snapshot_create(bs, &sn);
3474          if (ret) {
3475              error_report("Could not create snapshot '%s': %s",
3476                  snapshot_name, strerror(-ret));
3477          }
3478          break;
3479  
3480      case SNAPSHOT_APPLY:
3481          ret = bdrv_snapshot_goto(bs, snapshot_name, &err);
3482          if (ret) {
3483              error_reportf_err(err, "Could not apply snapshot '%s': ",
3484                                snapshot_name);
3485          }
3486          break;
3487  
3488      case SNAPSHOT_DELETE:
3489          ret = bdrv_snapshot_find(bs, &sn, snapshot_name);
3490          if (ret < 0) {
3491              error_report("Could not delete snapshot '%s': snapshot not "
3492                           "found", snapshot_name);
3493              ret = 1;
3494          } else {
3495              ret = bdrv_snapshot_delete(bs, sn.id_str, sn.name, &err);
3496              if (ret < 0) {
3497                  error_reportf_err(err, "Could not delete snapshot '%s': ",
3498                                    snapshot_name);
3499                  ret = 1;
3500              }
3501          }
3502          break;
3503      }
3504  
3505      /* Cleanup */
3506      blk_unref(blk);
3507      if (ret) {
3508          return 1;
3509      }
3510      return 0;
3511  }
3512  
3513  static int img_rebase(int argc, char **argv)
3514  {
3515      BlockBackend *blk = NULL, *blk_old_backing = NULL, *blk_new_backing = NULL;
3516      uint8_t *buf_old = NULL;
3517      uint8_t *buf_new = NULL;
3518      BlockDriverState *bs = NULL, *prefix_chain_bs = NULL;
3519      BlockDriverState *unfiltered_bs;
3520      char *filename;
3521      const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg;
3522      int c, flags, src_flags, ret;
3523      bool writethrough, src_writethrough;
3524      int unsafe = 0;
3525      bool force_share = false;
3526      int progress = 0;
3527      bool quiet = false;
3528      Error *local_err = NULL;
3529      bool image_opts = false;
3530  
3531      /* Parse commandline parameters */
3532      fmt = NULL;
3533      cache = BDRV_DEFAULT_CACHE;
3534      src_cache = BDRV_DEFAULT_CACHE;
3535      out_baseimg = NULL;
3536      out_basefmt = NULL;
3537      for(;;) {
3538          static const struct option long_options[] = {
3539              {"help", no_argument, 0, 'h'},
3540              {"object", required_argument, 0, OPTION_OBJECT},
3541              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3542              {"force-share", no_argument, 0, 'U'},
3543              {0, 0, 0, 0}
3544          };
3545          c = getopt_long(argc, argv, ":hf:F:b:upt:T:qU",
3546                          long_options, NULL);
3547          if (c == -1) {
3548              break;
3549          }
3550          switch(c) {
3551          case ':':
3552              missing_argument(argv[optind - 1]);
3553              break;
3554          case '?':
3555              unrecognized_option(argv[optind - 1]);
3556              break;
3557          case 'h':
3558              help();
3559              return 0;
3560          case 'f':
3561              fmt = optarg;
3562              break;
3563          case 'F':
3564              out_basefmt = optarg;
3565              break;
3566          case 'b':
3567              out_baseimg = optarg;
3568              break;
3569          case 'u':
3570              unsafe = 1;
3571              break;
3572          case 'p':
3573              progress = 1;
3574              break;
3575          case 't':
3576              cache = optarg;
3577              break;
3578          case 'T':
3579              src_cache = optarg;
3580              break;
3581          case 'q':
3582              quiet = true;
3583              break;
3584          case OPTION_OBJECT:
3585              user_creatable_process_cmdline(optarg);
3586              break;
3587          case OPTION_IMAGE_OPTS:
3588              image_opts = true;
3589              break;
3590          case 'U':
3591              force_share = true;
3592              break;
3593          }
3594      }
3595  
3596      if (quiet) {
3597          progress = 0;
3598      }
3599  
3600      if (optind != argc - 1) {
3601          error_exit("Expecting one image file name");
3602      }
3603      if (!unsafe && !out_baseimg) {
3604          error_exit("Must specify backing file (-b) or use unsafe mode (-u)");
3605      }
3606      filename = argv[optind++];
3607  
3608      qemu_progress_init(progress, 2.0);
3609      qemu_progress_print(0, 100);
3610  
3611      flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
3612      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
3613      if (ret < 0) {
3614          error_report("Invalid cache option: %s", cache);
3615          goto out;
3616      }
3617  
3618      src_flags = 0;
3619      ret = bdrv_parse_cache_mode(src_cache, &src_flags, &src_writethrough);
3620      if (ret < 0) {
3621          error_report("Invalid source cache option: %s", src_cache);
3622          goto out;
3623      }
3624  
3625      /* The source files are opened read-only, don't care about WCE */
3626      assert((src_flags & BDRV_O_RDWR) == 0);
3627      (void) src_writethrough;
3628  
3629      /*
3630       * Open the images.
3631       *
3632       * Ignore the old backing file for unsafe rebase in case we want to correct
3633       * the reference to a renamed or moved backing file.
3634       */
3635      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
3636                     false);
3637      if (!blk) {
3638          ret = -1;
3639          goto out;
3640      }
3641      bs = blk_bs(blk);
3642  
3643      unfiltered_bs = bdrv_skip_filters(bs);
3644  
3645      if (out_basefmt != NULL) {
3646          if (bdrv_find_format(out_basefmt) == NULL) {
3647              error_report("Invalid format name: '%s'", out_basefmt);
3648              ret = -1;
3649              goto out;
3650          }
3651      }
3652  
3653      /* For safe rebasing we need to compare old and new backing file */
3654      if (!unsafe) {
3655          QDict *options = NULL;
3656          BlockDriverState *base_bs = bdrv_cow_bs(unfiltered_bs);
3657  
3658          if (base_bs) {
3659              blk_old_backing = blk_new(qemu_get_aio_context(),
3660                                        BLK_PERM_CONSISTENT_READ,
3661                                        BLK_PERM_ALL);
3662              ret = blk_insert_bs(blk_old_backing, base_bs,
3663                                  &local_err);
3664              if (ret < 0) {
3665                  error_reportf_err(local_err,
3666                                    "Could not reuse old backing file '%s': ",
3667                                    base_bs->filename);
3668                  goto out;
3669              }
3670          } else {
3671              blk_old_backing = NULL;
3672          }
3673  
3674          if (out_baseimg[0]) {
3675              const char *overlay_filename;
3676              char *out_real_path;
3677  
3678              options = qdict_new();
3679              if (out_basefmt) {
3680                  qdict_put_str(options, "driver", out_basefmt);
3681              }
3682              if (force_share) {
3683                  qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true);
3684              }
3685  
3686              bdrv_refresh_filename(bs);
3687              overlay_filename = bs->exact_filename[0] ? bs->exact_filename
3688                                                       : bs->filename;
3689              out_real_path =
3690                  bdrv_get_full_backing_filename_from_filename(overlay_filename,
3691                                                               out_baseimg,
3692                                                               &local_err);
3693              if (local_err) {
3694                  qobject_unref(options);
3695                  error_reportf_err(local_err,
3696                                    "Could not resolve backing filename: ");
3697                  ret = -1;
3698                  goto out;
3699              }
3700  
3701              /*
3702               * Find out whether we rebase an image on top of a previous image
3703               * in its chain.
3704               */
3705              prefix_chain_bs = bdrv_find_backing_image(bs, out_real_path);
3706              if (prefix_chain_bs) {
3707                  qobject_unref(options);
3708                  g_free(out_real_path);
3709  
3710                  blk_new_backing = blk_new(qemu_get_aio_context(),
3711                                            BLK_PERM_CONSISTENT_READ,
3712                                            BLK_PERM_ALL);
3713                  ret = blk_insert_bs(blk_new_backing, prefix_chain_bs,
3714                                      &local_err);
3715                  if (ret < 0) {
3716                      error_reportf_err(local_err,
3717                                        "Could not reuse backing file '%s': ",
3718                                        out_baseimg);
3719                      goto out;
3720                  }
3721              } else {
3722                  blk_new_backing = blk_new_open(out_real_path, NULL,
3723                                                 options, src_flags, &local_err);
3724                  g_free(out_real_path);
3725                  if (!blk_new_backing) {
3726                      error_reportf_err(local_err,
3727                                        "Could not open new backing file '%s': ",
3728                                        out_baseimg);
3729                      ret = -1;
3730                      goto out;
3731                  }
3732              }
3733          }
3734      }
3735  
3736      /*
3737       * Check each unallocated cluster in the COW file. If it is unallocated,
3738       * accesses go to the backing file. We must therefore compare this cluster
3739       * in the old and new backing file, and if they differ we need to copy it
3740       * from the old backing file into the COW file.
3741       *
3742       * If qemu-img crashes during this step, no harm is done. The content of
3743       * the image is the same as the original one at any time.
3744       */
3745      if (!unsafe) {
3746          int64_t size;
3747          int64_t old_backing_size = 0;
3748          int64_t new_backing_size = 0;
3749          uint64_t offset;
3750          int64_t n;
3751          float local_progress = 0;
3752  
3753          buf_old = blk_blockalign(blk, IO_BUF_SIZE);
3754          buf_new = blk_blockalign(blk, IO_BUF_SIZE);
3755  
3756          size = blk_getlength(blk);
3757          if (size < 0) {
3758              error_report("Could not get size of '%s': %s",
3759                           filename, strerror(-size));
3760              ret = -1;
3761              goto out;
3762          }
3763          if (blk_old_backing) {
3764              old_backing_size = blk_getlength(blk_old_backing);
3765              if (old_backing_size < 0) {
3766                  char backing_name[PATH_MAX];
3767  
3768                  bdrv_get_backing_filename(bs, backing_name,
3769                                            sizeof(backing_name));
3770                  error_report("Could not get size of '%s': %s",
3771                               backing_name, strerror(-old_backing_size));
3772                  ret = -1;
3773                  goto out;
3774              }
3775          }
3776          if (blk_new_backing) {
3777              new_backing_size = blk_getlength(blk_new_backing);
3778              if (new_backing_size < 0) {
3779                  error_report("Could not get size of '%s': %s",
3780                               out_baseimg, strerror(-new_backing_size));
3781                  ret = -1;
3782                  goto out;
3783              }
3784          }
3785  
3786          if (size != 0) {
3787              local_progress = (float)100 / (size / MIN(size, IO_BUF_SIZE));
3788          }
3789  
3790          for (offset = 0; offset < size; offset += n) {
3791              bool buf_old_is_zero = false;
3792  
3793              /* How many bytes can we handle with the next read? */
3794              n = MIN(IO_BUF_SIZE, size - offset);
3795  
3796              /* If the cluster is allocated, we don't need to take action */
3797              ret = bdrv_is_allocated(unfiltered_bs, offset, n, &n);
3798              if (ret < 0) {
3799                  error_report("error while reading image metadata: %s",
3800                               strerror(-ret));
3801                  goto out;
3802              }
3803              if (ret) {
3804                  continue;
3805              }
3806  
3807              if (prefix_chain_bs) {
3808                  /*
3809                   * If cluster wasn't changed since prefix_chain, we don't need
3810                   * to take action
3811                   */
3812                  ret = bdrv_is_allocated_above(bdrv_cow_bs(unfiltered_bs),
3813                                                prefix_chain_bs, false,
3814                                                offset, n, &n);
3815                  if (ret < 0) {
3816                      error_report("error while reading image metadata: %s",
3817                                   strerror(-ret));
3818                      goto out;
3819                  }
3820                  if (!ret) {
3821                      continue;
3822                  }
3823              }
3824  
3825              /*
3826               * Read old and new backing file and take into consideration that
3827               * backing files may be smaller than the COW image.
3828               */
3829              if (offset >= old_backing_size) {
3830                  memset(buf_old, 0, n);
3831                  buf_old_is_zero = true;
3832              } else {
3833                  if (offset + n > old_backing_size) {
3834                      n = old_backing_size - offset;
3835                  }
3836  
3837                  ret = blk_pread(blk_old_backing, offset, n, buf_old, 0);
3838                  if (ret < 0) {
3839                      error_report("error while reading from old backing file");
3840                      goto out;
3841                  }
3842              }
3843  
3844              if (offset >= new_backing_size || !blk_new_backing) {
3845                  memset(buf_new, 0, n);
3846              } else {
3847                  if (offset + n > new_backing_size) {
3848                      n = new_backing_size - offset;
3849                  }
3850  
3851                  ret = blk_pread(blk_new_backing, offset, n, buf_new, 0);
3852                  if (ret < 0) {
3853                      error_report("error while reading from new backing file");
3854                      goto out;
3855                  }
3856              }
3857  
3858              /* If they differ, we need to write to the COW file */
3859              uint64_t written = 0;
3860  
3861              while (written < n) {
3862                  int64_t pnum;
3863  
3864                  if (compare_buffers(buf_old + written, buf_new + written,
3865                                      n - written, &pnum))
3866                  {
3867                      if (buf_old_is_zero) {
3868                          ret = blk_pwrite_zeroes(blk, offset + written, pnum, 0);
3869                      } else {
3870                          ret = blk_pwrite(blk, offset + written, pnum,
3871                                           buf_old + written, 0);
3872                      }
3873                      if (ret < 0) {
3874                          error_report("Error while writing to COW image: %s",
3875                              strerror(-ret));
3876                          goto out;
3877                      }
3878                  }
3879  
3880                  written += pnum;
3881              }
3882              qemu_progress_print(local_progress, 100);
3883          }
3884      }
3885  
3886      /*
3887       * Change the backing file. All clusters that are different from the old
3888       * backing file are overwritten in the COW file now, so the visible content
3889       * doesn't change when we switch the backing file.
3890       */
3891      if (out_baseimg && *out_baseimg) {
3892          ret = bdrv_change_backing_file(unfiltered_bs, out_baseimg, out_basefmt,
3893                                         true);
3894      } else {
3895          ret = bdrv_change_backing_file(unfiltered_bs, NULL, NULL, false);
3896      }
3897  
3898      if (ret == -ENOSPC) {
3899          error_report("Could not change the backing file to '%s': No "
3900                       "space left in the file header", out_baseimg);
3901      } else if (ret == -EINVAL && out_baseimg && !out_basefmt) {
3902          error_report("Could not change the backing file to '%s': backing "
3903                       "format must be specified", out_baseimg);
3904      } else if (ret < 0) {
3905          error_report("Could not change the backing file to '%s': %s",
3906              out_baseimg, strerror(-ret));
3907      }
3908  
3909      qemu_progress_print(100, 0);
3910      /*
3911       * TODO At this point it is possible to check if any clusters that are
3912       * allocated in the COW file are the same in the backing file. If so, they
3913       * could be dropped from the COW file. Don't do this before switching the
3914       * backing file, in case of a crash this would lead to corruption.
3915       */
3916  out:
3917      qemu_progress_end();
3918      /* Cleanup */
3919      if (!unsafe) {
3920          blk_unref(blk_old_backing);
3921          blk_unref(blk_new_backing);
3922      }
3923      qemu_vfree(buf_old);
3924      qemu_vfree(buf_new);
3925  
3926      blk_unref(blk);
3927      if (ret) {
3928          return 1;
3929      }
3930      return 0;
3931  }
3932  
3933  static int img_resize(int argc, char **argv)
3934  {
3935      Error *err = NULL;
3936      int c, ret, relative;
3937      const char *filename, *fmt, *size;
3938      int64_t n, total_size, current_size;
3939      bool quiet = false;
3940      BlockBackend *blk = NULL;
3941      PreallocMode prealloc = PREALLOC_MODE_OFF;
3942      QemuOpts *param;
3943  
3944      static QemuOptsList resize_options = {
3945          .name = "resize_options",
3946          .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
3947          .desc = {
3948              {
3949                  .name = BLOCK_OPT_SIZE,
3950                  .type = QEMU_OPT_SIZE,
3951                  .help = "Virtual disk size"
3952              }, {
3953                  /* end of list */
3954              }
3955          },
3956      };
3957      bool image_opts = false;
3958      bool shrink = false;
3959  
3960      /* Remove size from argv manually so that negative numbers are not treated
3961       * as options by getopt. */
3962      if (argc < 3) {
3963          error_exit("Not enough arguments");
3964          return 1;
3965      }
3966  
3967      size = argv[--argc];
3968  
3969      /* Parse getopt arguments */
3970      fmt = NULL;
3971      for(;;) {
3972          static const struct option long_options[] = {
3973              {"help", no_argument, 0, 'h'},
3974              {"object", required_argument, 0, OPTION_OBJECT},
3975              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
3976              {"preallocation", required_argument, 0, OPTION_PREALLOCATION},
3977              {"shrink", no_argument, 0, OPTION_SHRINK},
3978              {0, 0, 0, 0}
3979          };
3980          c = getopt_long(argc, argv, ":f:hq",
3981                          long_options, NULL);
3982          if (c == -1) {
3983              break;
3984          }
3985          switch(c) {
3986          case ':':
3987              missing_argument(argv[optind - 1]);
3988              break;
3989          case '?':
3990              unrecognized_option(argv[optind - 1]);
3991              break;
3992          case 'h':
3993              help();
3994              break;
3995          case 'f':
3996              fmt = optarg;
3997              break;
3998          case 'q':
3999              quiet = true;
4000              break;
4001          case OPTION_OBJECT:
4002              user_creatable_process_cmdline(optarg);
4003              break;
4004          case OPTION_IMAGE_OPTS:
4005              image_opts = true;
4006              break;
4007          case OPTION_PREALLOCATION:
4008              prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg,
4009                                         PREALLOC_MODE__MAX, NULL);
4010              if (prealloc == PREALLOC_MODE__MAX) {
4011                  error_report("Invalid preallocation mode '%s'", optarg);
4012                  return 1;
4013              }
4014              break;
4015          case OPTION_SHRINK:
4016              shrink = true;
4017              break;
4018          }
4019      }
4020      if (optind != argc - 1) {
4021          error_exit("Expecting image file name and size");
4022      }
4023      filename = argv[optind++];
4024  
4025      /* Choose grow, shrink, or absolute resize mode */
4026      switch (size[0]) {
4027      case '+':
4028          relative = 1;
4029          size++;
4030          break;
4031      case '-':
4032          relative = -1;
4033          size++;
4034          break;
4035      default:
4036          relative = 0;
4037          break;
4038      }
4039  
4040      /* Parse size */
4041      param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
4042      if (!qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err)) {
4043          error_report_err(err);
4044          ret = -1;
4045          qemu_opts_del(param);
4046          goto out;
4047      }
4048      n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
4049      qemu_opts_del(param);
4050  
4051      blk = img_open(image_opts, filename, fmt,
4052                     BDRV_O_RDWR | BDRV_O_RESIZE, false, quiet,
4053                     false);
4054      if (!blk) {
4055          ret = -1;
4056          goto out;
4057      }
4058  
4059      current_size = blk_getlength(blk);
4060      if (current_size < 0) {
4061          error_report("Failed to inquire current image length: %s",
4062                       strerror(-current_size));
4063          ret = -1;
4064          goto out;
4065      }
4066  
4067      if (relative) {
4068          total_size = current_size + n * relative;
4069      } else {
4070          total_size = n;
4071      }
4072      if (total_size <= 0) {
4073          error_report("New image size must be positive");
4074          ret = -1;
4075          goto out;
4076      }
4077  
4078      if (total_size <= current_size && prealloc != PREALLOC_MODE_OFF) {
4079          error_report("Preallocation can only be used for growing images");
4080          ret = -1;
4081          goto out;
4082      }
4083  
4084      if (total_size < current_size && !shrink) {
4085          error_report("Use the --shrink option to perform a shrink operation.");
4086          warn_report("Shrinking an image will delete all data beyond the "
4087                      "shrunken image's end. Before performing such an "
4088                      "operation, make sure there is no important data there.");
4089          ret = -1;
4090          goto out;
4091      }
4092  
4093      /*
4094       * The user expects the image to have the desired size after
4095       * resizing, so pass @exact=true.  It is of no use to report
4096       * success when the image has not actually been resized.
4097       */
4098      ret = blk_truncate(blk, total_size, true, prealloc, 0, &err);
4099      if (!ret) {
4100          qprintf(quiet, "Image resized.\n");
4101      } else {
4102          error_report_err(err);
4103      }
4104  out:
4105      blk_unref(blk);
4106      if (ret) {
4107          return 1;
4108      }
4109      return 0;
4110  }
4111  
4112  static void amend_status_cb(BlockDriverState *bs,
4113                              int64_t offset, int64_t total_work_size,
4114                              void *opaque)
4115  {
4116      qemu_progress_print(100.f * offset / total_work_size, 0);
4117  }
4118  
4119  static int print_amend_option_help(const char *format)
4120  {
4121      BlockDriver *drv;
4122  
4123      /* Find driver and parse its options */
4124      drv = bdrv_find_format(format);
4125      if (!drv) {
4126          error_report("Unknown file format '%s'", format);
4127          return 1;
4128      }
4129  
4130      if (!drv->bdrv_amend_options) {
4131          error_report("Format driver '%s' does not support option amendment",
4132                       format);
4133          return 1;
4134      }
4135  
4136      /* Every driver supporting amendment must have amend_opts */
4137      assert(drv->amend_opts);
4138  
4139      printf("Amend options for '%s':\n", format);
4140      qemu_opts_print_help(drv->amend_opts, false);
4141      return 0;
4142  }
4143  
4144  static int img_amend(int argc, char **argv)
4145  {
4146      Error *err = NULL;
4147      int c, ret = 0;
4148      char *options = NULL;
4149      QemuOptsList *amend_opts = NULL;
4150      QemuOpts *opts = NULL;
4151      const char *fmt = NULL, *filename, *cache;
4152      int flags;
4153      bool writethrough;
4154      bool quiet = false, progress = false;
4155      BlockBackend *blk = NULL;
4156      BlockDriverState *bs = NULL;
4157      bool image_opts = false;
4158      bool force = false;
4159  
4160      cache = BDRV_DEFAULT_CACHE;
4161      for (;;) {
4162          static const struct option long_options[] = {
4163              {"help", no_argument, 0, 'h'},
4164              {"object", required_argument, 0, OPTION_OBJECT},
4165              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4166              {"force", no_argument, 0, OPTION_FORCE},
4167              {0, 0, 0, 0}
4168          };
4169          c = getopt_long(argc, argv, ":ho:f:t:pq",
4170                          long_options, NULL);
4171          if (c == -1) {
4172              break;
4173          }
4174  
4175          switch (c) {
4176          case ':':
4177              missing_argument(argv[optind - 1]);
4178              break;
4179          case '?':
4180              unrecognized_option(argv[optind - 1]);
4181              break;
4182          case 'h':
4183              help();
4184              break;
4185          case 'o':
4186              if (accumulate_options(&options, optarg) < 0) {
4187                  ret = -1;
4188                  goto out_no_progress;
4189              }
4190              break;
4191          case 'f':
4192              fmt = optarg;
4193              break;
4194          case 't':
4195              cache = optarg;
4196              break;
4197          case 'p':
4198              progress = true;
4199              break;
4200          case 'q':
4201              quiet = true;
4202              break;
4203          case OPTION_OBJECT:
4204              user_creatable_process_cmdline(optarg);
4205              break;
4206          case OPTION_IMAGE_OPTS:
4207              image_opts = true;
4208              break;
4209          case OPTION_FORCE:
4210              force = true;
4211              break;
4212          }
4213      }
4214  
4215      if (!options) {
4216          error_exit("Must specify options (-o)");
4217      }
4218  
4219      if (quiet) {
4220          progress = false;
4221      }
4222      qemu_progress_init(progress, 1.0);
4223  
4224      filename = (optind == argc - 1) ? argv[argc - 1] : NULL;
4225      if (fmt && has_help_option(options)) {
4226          /* If a format is explicitly specified (and possibly no filename is
4227           * given), print option help here */
4228          ret = print_amend_option_help(fmt);
4229          goto out;
4230      }
4231  
4232      if (optind != argc - 1) {
4233          error_report("Expecting one image file name");
4234          ret = -1;
4235          goto out;
4236      }
4237  
4238      flags = BDRV_O_RDWR;
4239      ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
4240      if (ret < 0) {
4241          error_report("Invalid cache option: %s", cache);
4242          goto out;
4243      }
4244  
4245      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
4246                     false);
4247      if (!blk) {
4248          ret = -1;
4249          goto out;
4250      }
4251      bs = blk_bs(blk);
4252  
4253      fmt = bs->drv->format_name;
4254  
4255      if (has_help_option(options)) {
4256          /* If the format was auto-detected, print option help here */
4257          ret = print_amend_option_help(fmt);
4258          goto out;
4259      }
4260  
4261      if (!bs->drv->bdrv_amend_options) {
4262          error_report("Format driver '%s' does not support option amendment",
4263                       fmt);
4264          ret = -1;
4265          goto out;
4266      }
4267  
4268      /* Every driver supporting amendment must have amend_opts */
4269      assert(bs->drv->amend_opts);
4270  
4271      amend_opts = qemu_opts_append(amend_opts, bs->drv->amend_opts);
4272      opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort);
4273      if (!qemu_opts_do_parse(opts, options, NULL, &err)) {
4274          /* Try to parse options using the create options */
4275          amend_opts = qemu_opts_append(amend_opts, bs->drv->create_opts);
4276          qemu_opts_del(opts);
4277          opts = qemu_opts_create(amend_opts, NULL, 0, &error_abort);
4278          if (qemu_opts_do_parse(opts, options, NULL, NULL)) {
4279              error_append_hint(&err,
4280                                "This option is only supported for image creation\n");
4281          }
4282  
4283          error_report_err(err);
4284          ret = -1;
4285          goto out;
4286      }
4287  
4288      /* In case the driver does not call amend_status_cb() */
4289      qemu_progress_print(0.f, 0);
4290      ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL, force, &err);
4291      qemu_progress_print(100.f, 0);
4292      if (ret < 0) {
4293          error_report_err(err);
4294          goto out;
4295      }
4296  
4297  out:
4298      qemu_progress_end();
4299  
4300  out_no_progress:
4301      blk_unref(blk);
4302      qemu_opts_del(opts);
4303      qemu_opts_free(amend_opts);
4304      g_free(options);
4305  
4306      if (ret) {
4307          return 1;
4308      }
4309      return 0;
4310  }
4311  
4312  typedef struct BenchData {
4313      BlockBackend *blk;
4314      uint64_t image_size;
4315      bool write;
4316      int bufsize;
4317      int step;
4318      int nrreq;
4319      int n;
4320      int flush_interval;
4321      bool drain_on_flush;
4322      uint8_t *buf;
4323      QEMUIOVector *qiov;
4324  
4325      int in_flight;
4326      bool in_flush;
4327      uint64_t offset;
4328  } BenchData;
4329  
4330  static void bench_undrained_flush_cb(void *opaque, int ret)
4331  {
4332      if (ret < 0) {
4333          error_report("Failed flush request: %s", strerror(-ret));
4334          exit(EXIT_FAILURE);
4335      }
4336  }
4337  
4338  static void bench_cb(void *opaque, int ret)
4339  {
4340      BenchData *b = opaque;
4341      BlockAIOCB *acb;
4342  
4343      if (ret < 0) {
4344          error_report("Failed request: %s", strerror(-ret));
4345          exit(EXIT_FAILURE);
4346      }
4347  
4348      if (b->in_flush) {
4349          /* Just finished a flush with drained queue: Start next requests */
4350          assert(b->in_flight == 0);
4351          b->in_flush = false;
4352      } else if (b->in_flight > 0) {
4353          int remaining = b->n - b->in_flight;
4354  
4355          b->n--;
4356          b->in_flight--;
4357  
4358          /* Time for flush? Drain queue if requested, then flush */
4359          if (b->flush_interval && remaining % b->flush_interval == 0) {
4360              if (!b->in_flight || !b->drain_on_flush) {
4361                  BlockCompletionFunc *cb;
4362  
4363                  if (b->drain_on_flush) {
4364                      b->in_flush = true;
4365                      cb = bench_cb;
4366                  } else {
4367                      cb = bench_undrained_flush_cb;
4368                  }
4369  
4370                  acb = blk_aio_flush(b->blk, cb, b);
4371                  if (!acb) {
4372                      error_report("Failed to issue flush request");
4373                      exit(EXIT_FAILURE);
4374                  }
4375              }
4376              if (b->drain_on_flush) {
4377                  return;
4378              }
4379          }
4380      }
4381  
4382      while (b->n > b->in_flight && b->in_flight < b->nrreq) {
4383          int64_t offset = b->offset;
4384          /* blk_aio_* might look for completed I/Os and kick bench_cb
4385           * again, so make sure this operation is counted by in_flight
4386           * and b->offset is ready for the next submission.
4387           */
4388          b->in_flight++;
4389          b->offset += b->step;
4390          b->offset %= b->image_size;
4391          if (b->write) {
4392              acb = blk_aio_pwritev(b->blk, offset, b->qiov, 0, bench_cb, b);
4393          } else {
4394              acb = blk_aio_preadv(b->blk, offset, b->qiov, 0, bench_cb, b);
4395          }
4396          if (!acb) {
4397              error_report("Failed to issue request");
4398              exit(EXIT_FAILURE);
4399          }
4400      }
4401  }
4402  
4403  static int img_bench(int argc, char **argv)
4404  {
4405      int c, ret = 0;
4406      const char *fmt = NULL, *filename;
4407      bool quiet = false;
4408      bool image_opts = false;
4409      bool is_write = false;
4410      int count = 75000;
4411      int depth = 64;
4412      int64_t offset = 0;
4413      size_t bufsize = 4096;
4414      int pattern = 0;
4415      size_t step = 0;
4416      int flush_interval = 0;
4417      bool drain_on_flush = true;
4418      int64_t image_size;
4419      BlockBackend *blk = NULL;
4420      BenchData data = {};
4421      int flags = 0;
4422      bool writethrough = false;
4423      struct timeval t1, t2;
4424      int i;
4425      bool force_share = false;
4426      size_t buf_size = 0;
4427  
4428      for (;;) {
4429          static const struct option long_options[] = {
4430              {"help", no_argument, 0, 'h'},
4431              {"flush-interval", required_argument, 0, OPTION_FLUSH_INTERVAL},
4432              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4433              {"pattern", required_argument, 0, OPTION_PATTERN},
4434              {"no-drain", no_argument, 0, OPTION_NO_DRAIN},
4435              {"force-share", no_argument, 0, 'U'},
4436              {0, 0, 0, 0}
4437          };
4438          c = getopt_long(argc, argv, ":hc:d:f:ni:o:qs:S:t:wU", long_options,
4439                          NULL);
4440          if (c == -1) {
4441              break;
4442          }
4443  
4444          switch (c) {
4445          case ':':
4446              missing_argument(argv[optind - 1]);
4447              break;
4448          case '?':
4449              unrecognized_option(argv[optind - 1]);
4450              break;
4451          case 'h':
4452              help();
4453              break;
4454          case 'c':
4455          {
4456              unsigned long res;
4457  
4458              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4459                  error_report("Invalid request count specified");
4460                  return 1;
4461              }
4462              count = res;
4463              break;
4464          }
4465          case 'd':
4466          {
4467              unsigned long res;
4468  
4469              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4470                  error_report("Invalid queue depth specified");
4471                  return 1;
4472              }
4473              depth = res;
4474              break;
4475          }
4476          case 'f':
4477              fmt = optarg;
4478              break;
4479          case 'n':
4480              flags |= BDRV_O_NATIVE_AIO;
4481              break;
4482          case 'i':
4483              ret = bdrv_parse_aio(optarg, &flags);
4484              if (ret < 0) {
4485                  error_report("Invalid aio option: %s", optarg);
4486                  ret = -1;
4487                  goto out;
4488              }
4489              break;
4490          case 'o':
4491          {
4492              offset = cvtnum("offset", optarg);
4493              if (offset < 0) {
4494                  return 1;
4495              }
4496              break;
4497          }
4498              break;
4499          case 'q':
4500              quiet = true;
4501              break;
4502          case 's':
4503          {
4504              int64_t sval;
4505  
4506              sval = cvtnum_full("buffer size", optarg, 0, INT_MAX);
4507              if (sval < 0) {
4508                  return 1;
4509              }
4510  
4511              bufsize = sval;
4512              break;
4513          }
4514          case 'S':
4515          {
4516              int64_t sval;
4517  
4518              sval = cvtnum_full("step_size", optarg, 0, INT_MAX);
4519              if (sval < 0) {
4520                  return 1;
4521              }
4522  
4523              step = sval;
4524              break;
4525          }
4526          case 't':
4527              ret = bdrv_parse_cache_mode(optarg, &flags, &writethrough);
4528              if (ret < 0) {
4529                  error_report("Invalid cache mode");
4530                  ret = -1;
4531                  goto out;
4532              }
4533              break;
4534          case 'w':
4535              flags |= BDRV_O_RDWR;
4536              is_write = true;
4537              break;
4538          case 'U':
4539              force_share = true;
4540              break;
4541          case OPTION_PATTERN:
4542          {
4543              unsigned long res;
4544  
4545              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > 0xff) {
4546                  error_report("Invalid pattern byte specified");
4547                  return 1;
4548              }
4549              pattern = res;
4550              break;
4551          }
4552          case OPTION_FLUSH_INTERVAL:
4553          {
4554              unsigned long res;
4555  
4556              if (qemu_strtoul(optarg, NULL, 0, &res) < 0 || res > INT_MAX) {
4557                  error_report("Invalid flush interval specified");
4558                  return 1;
4559              }
4560              flush_interval = res;
4561              break;
4562          }
4563          case OPTION_NO_DRAIN:
4564              drain_on_flush = false;
4565              break;
4566          case OPTION_IMAGE_OPTS:
4567              image_opts = true;
4568              break;
4569          }
4570      }
4571  
4572      if (optind != argc - 1) {
4573          error_exit("Expecting one image file name");
4574      }
4575      filename = argv[argc - 1];
4576  
4577      if (!is_write && flush_interval) {
4578          error_report("--flush-interval is only available in write tests");
4579          ret = -1;
4580          goto out;
4581      }
4582      if (flush_interval && flush_interval < depth) {
4583          error_report("Flush interval can't be smaller than depth");
4584          ret = -1;
4585          goto out;
4586      }
4587  
4588      blk = img_open(image_opts, filename, fmt, flags, writethrough, quiet,
4589                     force_share);
4590      if (!blk) {
4591          ret = -1;
4592          goto out;
4593      }
4594  
4595      image_size = blk_getlength(blk);
4596      if (image_size < 0) {
4597          ret = image_size;
4598          goto out;
4599      }
4600  
4601      data = (BenchData) {
4602          .blk            = blk,
4603          .image_size     = image_size,
4604          .bufsize        = bufsize,
4605          .step           = step ?: bufsize,
4606          .nrreq          = depth,
4607          .n              = count,
4608          .offset         = offset,
4609          .write          = is_write,
4610          .flush_interval = flush_interval,
4611          .drain_on_flush = drain_on_flush,
4612      };
4613      printf("Sending %d %s requests, %d bytes each, %d in parallel "
4614             "(starting at offset %" PRId64 ", step size %d)\n",
4615             data.n, data.write ? "write" : "read", data.bufsize, data.nrreq,
4616             data.offset, data.step);
4617      if (flush_interval) {
4618          printf("Sending flush every %d requests\n", flush_interval);
4619      }
4620  
4621      buf_size = data.nrreq * data.bufsize;
4622      data.buf = blk_blockalign(blk, buf_size);
4623      memset(data.buf, pattern, data.nrreq * data.bufsize);
4624  
4625      blk_register_buf(blk, data.buf, buf_size, &error_fatal);
4626  
4627      data.qiov = g_new(QEMUIOVector, data.nrreq);
4628      for (i = 0; i < data.nrreq; i++) {
4629          qemu_iovec_init(&data.qiov[i], 1);
4630          qemu_iovec_add(&data.qiov[i],
4631                         data.buf + i * data.bufsize, data.bufsize);
4632      }
4633  
4634      gettimeofday(&t1, NULL);
4635      bench_cb(&data, 0);
4636  
4637      while (data.n > 0) {
4638          main_loop_wait(false);
4639      }
4640      gettimeofday(&t2, NULL);
4641  
4642      printf("Run completed in %3.3f seconds.\n",
4643             (t2.tv_sec - t1.tv_sec)
4644             + ((double)(t2.tv_usec - t1.tv_usec) / 1000000));
4645  
4646  out:
4647      if (data.buf) {
4648          blk_unregister_buf(blk, data.buf, buf_size);
4649      }
4650      qemu_vfree(data.buf);
4651      blk_unref(blk);
4652  
4653      if (ret) {
4654          return 1;
4655      }
4656      return 0;
4657  }
4658  
4659  enum ImgBitmapAct {
4660      BITMAP_ADD,
4661      BITMAP_REMOVE,
4662      BITMAP_CLEAR,
4663      BITMAP_ENABLE,
4664      BITMAP_DISABLE,
4665      BITMAP_MERGE,
4666  };
4667  typedef struct ImgBitmapAction {
4668      enum ImgBitmapAct act;
4669      const char *src; /* only used for merge */
4670      QSIMPLEQ_ENTRY(ImgBitmapAction) next;
4671  } ImgBitmapAction;
4672  
4673  static int img_bitmap(int argc, char **argv)
4674  {
4675      Error *err = NULL;
4676      int c, ret = 1;
4677      QemuOpts *opts = NULL;
4678      const char *fmt = NULL, *src_fmt = NULL, *src_filename = NULL;
4679      const char *filename, *bitmap;
4680      BlockBackend *blk = NULL, *src = NULL;
4681      BlockDriverState *bs = NULL, *src_bs = NULL;
4682      bool image_opts = false;
4683      int64_t granularity = 0;
4684      bool add = false, merge = false;
4685      QSIMPLEQ_HEAD(, ImgBitmapAction) actions;
4686      ImgBitmapAction *act, *act_next;
4687      const char *op;
4688      int inactivate_ret;
4689  
4690      QSIMPLEQ_INIT(&actions);
4691  
4692      for (;;) {
4693          static const struct option long_options[] = {
4694              {"help", no_argument, 0, 'h'},
4695              {"object", required_argument, 0, OPTION_OBJECT},
4696              {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
4697              {"add", no_argument, 0, OPTION_ADD},
4698              {"remove", no_argument, 0, OPTION_REMOVE},
4699              {"clear", no_argument, 0, OPTION_CLEAR},
4700              {"enable", no_argument, 0, OPTION_ENABLE},
4701              {"disable", no_argument, 0, OPTION_DISABLE},
4702              {"merge", required_argument, 0, OPTION_MERGE},
4703              {"granularity", required_argument, 0, 'g'},
4704              {"source-file", required_argument, 0, 'b'},
4705              {"source-format", required_argument, 0, 'F'},
4706              {0, 0, 0, 0}
4707          };
4708          c = getopt_long(argc, argv, ":b:f:F:g:h", long_options, NULL);
4709          if (c == -1) {
4710              break;
4711          }
4712  
4713          switch (c) {
4714          case ':':
4715              missing_argument(argv[optind - 1]);
4716              break;
4717          case '?':
4718              unrecognized_option(argv[optind - 1]);
4719              break;
4720          case 'h':
4721              help();
4722              break;
4723          case 'b':
4724              src_filename = optarg;
4725              break;
4726          case 'f':
4727              fmt = optarg;
4728              break;
4729          case 'F':
4730              src_fmt = optarg;
4731              break;
4732          case 'g':
4733              granularity = cvtnum("granularity", optarg);
4734              if (granularity < 0) {
4735                  return 1;
4736              }
4737              break;
4738          case OPTION_ADD:
4739              act = g_new0(ImgBitmapAction, 1);
4740              act->act = BITMAP_ADD;
4741              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4742              add = true;
4743              break;
4744          case OPTION_REMOVE:
4745              act = g_new0(ImgBitmapAction, 1);
4746              act->act = BITMAP_REMOVE;
4747              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4748              break;
4749          case OPTION_CLEAR:
4750              act = g_new0(ImgBitmapAction, 1);
4751              act->act = BITMAP_CLEAR;
4752              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4753              break;
4754          case OPTION_ENABLE:
4755              act = g_new0(ImgBitmapAction, 1);
4756              act->act = BITMAP_ENABLE;
4757              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4758              break;
4759          case OPTION_DISABLE:
4760              act = g_new0(ImgBitmapAction, 1);
4761              act->act = BITMAP_DISABLE;
4762              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4763              break;
4764          case OPTION_MERGE:
4765              act = g_new0(ImgBitmapAction, 1);
4766              act->act = BITMAP_MERGE;
4767              act->src = optarg;
4768              QSIMPLEQ_INSERT_TAIL(&actions, act, next);
4769              merge = true;
4770              break;
4771          case OPTION_OBJECT:
4772              user_creatable_process_cmdline(optarg);
4773              break;
4774          case OPTION_IMAGE_OPTS:
4775              image_opts = true;
4776              break;
4777          }
4778      }
4779  
4780      if (QSIMPLEQ_EMPTY(&actions)) {
4781          error_report("Need at least one of --add, --remove, --clear, "
4782                       "--enable, --disable, or --merge");
4783          goto out;
4784      }
4785  
4786      if (granularity && !add) {
4787          error_report("granularity only supported with --add");
4788          goto out;
4789      }
4790      if (src_fmt && !src_filename) {
4791          error_report("-F only supported with -b");
4792          goto out;
4793      }
4794      if (src_filename && !merge) {
4795          error_report("Merge bitmap source file only supported with "
4796                       "--merge");
4797          goto out;
4798      }
4799  
4800      if (optind != argc - 2) {
4801          error_report("Expecting filename and bitmap name");
4802          goto out;
4803      }
4804  
4805      filename = argv[optind];
4806      bitmap = argv[optind + 1];
4807  
4808      /*
4809       * No need to open backing chains; we will be manipulating bitmaps
4810       * directly in this image without reference to image contents.
4811       */
4812      blk = img_open(image_opts, filename, fmt, BDRV_O_RDWR | BDRV_O_NO_BACKING,
4813                     false, false, false);
4814      if (!blk) {
4815          goto out;
4816      }
4817      bs = blk_bs(blk);
4818      if (src_filename) {
4819          src = img_open(false, src_filename, src_fmt, BDRV_O_NO_BACKING,
4820                         false, false, false);
4821          if (!src) {
4822              goto out;
4823          }
4824          src_bs = blk_bs(src);
4825      } else {
4826          src_bs = bs;
4827      }
4828  
4829      QSIMPLEQ_FOREACH_SAFE(act, &actions, next, act_next) {
4830          switch (act->act) {
4831          case BITMAP_ADD:
4832              qmp_block_dirty_bitmap_add(bs->node_name, bitmap,
4833                                         !!granularity, granularity, true, true,
4834                                         false, false, &err);
4835              op = "add";
4836              break;
4837          case BITMAP_REMOVE:
4838              qmp_block_dirty_bitmap_remove(bs->node_name, bitmap, &err);
4839              op = "remove";
4840              break;
4841          case BITMAP_CLEAR:
4842              qmp_block_dirty_bitmap_clear(bs->node_name, bitmap, &err);
4843              op = "clear";
4844              break;
4845          case BITMAP_ENABLE:
4846              qmp_block_dirty_bitmap_enable(bs->node_name, bitmap, &err);
4847              op = "enable";
4848              break;
4849          case BITMAP_DISABLE:
4850              qmp_block_dirty_bitmap_disable(bs->node_name, bitmap, &err);
4851              op = "disable";
4852              break;
4853          case BITMAP_MERGE:
4854              do_dirty_bitmap_merge(bs->node_name, bitmap, src_bs->node_name,
4855                                    act->src, &err);
4856              op = "merge";
4857              break;
4858          default:
4859              g_assert_not_reached();
4860          }
4861  
4862          if (err) {
4863              error_reportf_err(err, "Operation %s on bitmap %s failed: ",
4864                                op, bitmap);
4865              goto out;
4866          }
4867          g_free(act);
4868      }
4869  
4870      ret = 0;
4871  
4872   out:
4873      /*
4874       * Manually inactivate the images first because this way we can know whether
4875       * an error occurred. blk_unref() doesn't tell us about failures.
4876       */
4877      inactivate_ret = bdrv_inactivate_all();
4878      if (inactivate_ret < 0) {
4879          error_report("Error while closing the image: %s", strerror(-inactivate_ret));
4880          ret = 1;
4881      }
4882  
4883      blk_unref(src);
4884      blk_unref(blk);
4885      qemu_opts_del(opts);
4886      return ret;
4887  }
4888  
4889  #define C_BS      01
4890  #define C_COUNT   02
4891  #define C_IF      04
4892  #define C_OF      010
4893  #define C_SKIP    020
4894  
4895  struct DdInfo {
4896      unsigned int flags;
4897      int64_t count;
4898  };
4899  
4900  struct DdIo {
4901      int bsz;    /* Block size */
4902      char *filename;
4903      uint8_t *buf;
4904      int64_t offset;
4905  };
4906  
4907  struct DdOpts {
4908      const char *name;
4909      int (*f)(const char *, struct DdIo *, struct DdIo *, struct DdInfo *);
4910      unsigned int flag;
4911  };
4912  
4913  static int img_dd_bs(const char *arg,
4914                       struct DdIo *in, struct DdIo *out,
4915                       struct DdInfo *dd)
4916  {
4917      int64_t res;
4918  
4919      res = cvtnum_full("bs", arg, 1, INT_MAX);
4920  
4921      if (res < 0) {
4922          return 1;
4923      }
4924      in->bsz = out->bsz = res;
4925  
4926      return 0;
4927  }
4928  
4929  static int img_dd_count(const char *arg,
4930                          struct DdIo *in, struct DdIo *out,
4931                          struct DdInfo *dd)
4932  {
4933      dd->count = cvtnum("count", arg);
4934  
4935      if (dd->count < 0) {
4936          return 1;
4937      }
4938  
4939      return 0;
4940  }
4941  
4942  static int img_dd_if(const char *arg,
4943                       struct DdIo *in, struct DdIo *out,
4944                       struct DdInfo *dd)
4945  {
4946      in->filename = g_strdup(arg);
4947  
4948      return 0;
4949  }
4950  
4951  static int img_dd_of(const char *arg,
4952                       struct DdIo *in, struct DdIo *out,
4953                       struct DdInfo *dd)
4954  {
4955      out->filename = g_strdup(arg);
4956  
4957      return 0;
4958  }
4959  
4960  static int img_dd_skip(const char *arg,
4961                         struct DdIo *in, struct DdIo *out,
4962                         struct DdInfo *dd)
4963  {
4964      in->offset = cvtnum("skip", arg);
4965  
4966      if (in->offset < 0) {
4967          return 1;
4968      }
4969  
4970      return 0;
4971  }
4972  
4973  static int img_dd(int argc, char **argv)
4974  {
4975      int ret = 0;
4976      char *arg = NULL;
4977      char *tmp;
4978      BlockDriver *drv = NULL, *proto_drv = NULL;
4979      BlockBackend *blk1 = NULL, *blk2 = NULL;
4980      QemuOpts *opts = NULL;
4981      QemuOptsList *create_opts = NULL;
4982      Error *local_err = NULL;
4983      bool image_opts = false;
4984      int c, i;
4985      const char *out_fmt = "raw";
4986      const char *fmt = NULL;
4987      int64_t size = 0;
4988      int64_t out_pos, in_pos;
4989      bool force_share = false;
4990      struct DdInfo dd = {
4991          .flags = 0,
4992          .count = 0,
4993      };
4994      struct DdIo in = {
4995          .bsz = 512, /* Block size is by default 512 bytes */
4996          .filename = NULL,
4997          .buf = NULL,
4998          .offset = 0
4999      };
5000      struct DdIo out = {
5001          .bsz = 512,
5002          .filename = NULL,
5003          .buf = NULL,
5004          .offset = 0
5005      };
5006  
5007      const struct DdOpts options[] = {
5008          { "bs", img_dd_bs, C_BS },
5009          { "count", img_dd_count, C_COUNT },
5010          { "if", img_dd_if, C_IF },
5011          { "of", img_dd_of, C_OF },
5012          { "skip", img_dd_skip, C_SKIP },
5013          { NULL, NULL, 0 }
5014      };
5015      const struct option long_options[] = {
5016          { "help", no_argument, 0, 'h'},
5017          { "object", required_argument, 0, OPTION_OBJECT},
5018          { "image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
5019          { "force-share", no_argument, 0, 'U'},
5020          { 0, 0, 0, 0 }
5021      };
5022  
5023      while ((c = getopt_long(argc, argv, ":hf:O:U", long_options, NULL))) {
5024          if (c == EOF) {
5025              break;
5026          }
5027          switch (c) {
5028          case 'O':
5029              out_fmt = optarg;
5030              break;
5031          case 'f':
5032              fmt = optarg;
5033              break;
5034          case ':':
5035              missing_argument(argv[optind - 1]);
5036              break;
5037          case '?':
5038              unrecognized_option(argv[optind - 1]);
5039              break;
5040          case 'h':
5041              help();
5042              break;
5043          case 'U':
5044              force_share = true;
5045              break;
5046          case OPTION_OBJECT:
5047              user_creatable_process_cmdline(optarg);
5048              break;
5049          case OPTION_IMAGE_OPTS:
5050              image_opts = true;
5051              break;
5052          }
5053      }
5054  
5055      for (i = optind; i < argc; i++) {
5056          int j;
5057          arg = g_strdup(argv[i]);
5058  
5059          tmp = strchr(arg, '=');
5060          if (tmp == NULL) {
5061              error_report("unrecognized operand %s", arg);
5062              ret = -1;
5063              goto out;
5064          }
5065  
5066          *tmp++ = '\0';
5067  
5068          for (j = 0; options[j].name != NULL; j++) {
5069              if (!strcmp(arg, options[j].name)) {
5070                  break;
5071              }
5072          }
5073          if (options[j].name == NULL) {
5074              error_report("unrecognized operand %s", arg);
5075              ret = -1;
5076              goto out;
5077          }
5078  
5079          if (options[j].f(tmp, &in, &out, &dd) != 0) {
5080              ret = -1;
5081              goto out;
5082          }
5083          dd.flags |= options[j].flag;
5084          g_free(arg);
5085          arg = NULL;
5086      }
5087  
5088      if (!(dd.flags & C_IF && dd.flags & C_OF)) {
5089          error_report("Must specify both input and output files");
5090          ret = -1;
5091          goto out;
5092      }
5093  
5094      blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
5095                      force_share);
5096  
5097      if (!blk1) {
5098          ret = -1;
5099          goto out;
5100      }
5101  
5102      drv = bdrv_find_format(out_fmt);
5103      if (!drv) {
5104          error_report("Unknown file format");
5105          ret = -1;
5106          goto out;
5107      }
5108      proto_drv = bdrv_find_protocol(out.filename, true, &local_err);
5109  
5110      if (!proto_drv) {
5111          error_report_err(local_err);
5112          ret = -1;
5113          goto out;
5114      }
5115      if (!drv->create_opts) {
5116          error_report("Format driver '%s' does not support image creation",
5117                       drv->format_name);
5118          ret = -1;
5119          goto out;
5120      }
5121      if (!proto_drv->create_opts) {
5122          error_report("Protocol driver '%s' does not support image creation",
5123                       proto_drv->format_name);
5124          ret = -1;
5125          goto out;
5126      }
5127      create_opts = qemu_opts_append(create_opts, drv->create_opts);
5128      create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
5129  
5130      opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
5131  
5132      size = blk_getlength(blk1);
5133      if (size < 0) {
5134          error_report("Failed to get size for '%s'", in.filename);
5135          ret = -1;
5136          goto out;
5137      }
5138  
5139      if (dd.flags & C_COUNT && dd.count <= INT64_MAX / in.bsz &&
5140          dd.count * in.bsz < size) {
5141          size = dd.count * in.bsz;
5142      }
5143  
5144      /* Overflow means the specified offset is beyond input image's size */
5145      if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
5146                                size < in.bsz * in.offset)) {
5147          qemu_opt_set_number(opts, BLOCK_OPT_SIZE, 0, &error_abort);
5148      } else {
5149          qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
5150                              size - in.bsz * in.offset, &error_abort);
5151      }
5152  
5153      ret = bdrv_create(drv, out.filename, opts, &local_err);
5154      if (ret < 0) {
5155          error_reportf_err(local_err,
5156                            "%s: error while creating output image: ",
5157                            out.filename);
5158          ret = -1;
5159          goto out;
5160      }
5161  
5162      /* TODO, we can't honour --image-opts for the target,
5163       * since it needs to be given in a format compatible
5164       * with the bdrv_create() call above which does not
5165       * support image-opts style.
5166       */
5167      blk2 = img_open_file(out.filename, NULL, out_fmt, BDRV_O_RDWR,
5168                           false, false, false);
5169  
5170      if (!blk2) {
5171          ret = -1;
5172          goto out;
5173      }
5174  
5175      if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
5176                                size < in.offset * in.bsz)) {
5177          /* We give a warning if the skip option is bigger than the input
5178           * size and create an empty output disk image (i.e. like dd(1)).
5179           */
5180          error_report("%s: cannot skip to specified offset", in.filename);
5181          in_pos = size;
5182      } else {
5183          in_pos = in.offset * in.bsz;
5184      }
5185  
5186      in.buf = g_new(uint8_t, in.bsz);
5187  
5188      for (out_pos = 0; in_pos < size; ) {
5189          int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
5190  
5191          ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
5192          if (ret < 0) {
5193              error_report("error while reading from input image file: %s",
5194                           strerror(-ret));
5195              goto out;
5196          }
5197          in_pos += bytes;
5198  
5199          ret = blk_pwrite(blk2, out_pos, bytes, in.buf, 0);
5200          if (ret < 0) {
5201              error_report("error while writing to output image file: %s",
5202                           strerror(-ret));
5203              goto out;
5204          }
5205          out_pos += bytes;
5206      }
5207  
5208  out:
5209      g_free(arg);
5210      qemu_opts_del(opts);
5211      qemu_opts_free(create_opts);
5212      blk_unref(blk1);
5213      blk_unref(blk2);
5214      g_free(in.filename);
5215      g_free(out.filename);
5216      g_free(in.buf);
5217      g_free(out.buf);
5218  
5219      if (ret) {
5220          return 1;
5221      }
5222      return 0;
5223  }
5224  
5225  static void dump_json_block_measure_info(BlockMeasureInfo *info)
5226  {
5227      GString *str;
5228      QObject *obj;
5229      Visitor *v = qobject_output_visitor_new(&obj);
5230  
5231      visit_type_BlockMeasureInfo(v, NULL, &info, &error_abort);
5232      visit_complete(v, &obj);
5233      str = qobject_to_json_pretty(obj, true);
5234      assert(str != NULL);
5235      printf("%s\n", str->str);
5236      qobject_unref(obj);
5237      visit_free(v);
5238      g_string_free(str, true);
5239  }
5240  
5241  static int img_measure(int argc, char **argv)
5242  {
5243      static const struct option long_options[] = {
5244          {"help", no_argument, 0, 'h'},
5245          {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
5246          {"object", required_argument, 0, OPTION_OBJECT},
5247          {"output", required_argument, 0, OPTION_OUTPUT},
5248          {"size", required_argument, 0, OPTION_SIZE},
5249          {"force-share", no_argument, 0, 'U'},
5250          {0, 0, 0, 0}
5251      };
5252      OutputFormat output_format = OFORMAT_HUMAN;
5253      BlockBackend *in_blk = NULL;
5254      BlockDriver *drv;
5255      const char *filename = NULL;
5256      const char *fmt = NULL;
5257      const char *out_fmt = "raw";
5258      char *options = NULL;
5259      char *snapshot_name = NULL;
5260      bool force_share = false;
5261      QemuOpts *opts = NULL;
5262      QemuOpts *object_opts = NULL;
5263      QemuOpts *sn_opts = NULL;
5264      QemuOptsList *create_opts = NULL;
5265      bool image_opts = false;
5266      uint64_t img_size = UINT64_MAX;
5267      BlockMeasureInfo *info = NULL;
5268      Error *local_err = NULL;
5269      int ret = 1;
5270      int c;
5271  
5272      while ((c = getopt_long(argc, argv, "hf:O:o:l:U",
5273                              long_options, NULL)) != -1) {
5274          switch (c) {
5275          case '?':
5276          case 'h':
5277              help();
5278              break;
5279          case 'f':
5280              fmt = optarg;
5281              break;
5282          case 'O':
5283              out_fmt = optarg;
5284              break;
5285          case 'o':
5286              if (accumulate_options(&options, optarg) < 0) {
5287                  goto out;
5288              }
5289              break;
5290          case 'l':
5291              if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) {
5292                  sn_opts = qemu_opts_parse_noisily(&internal_snapshot_opts,
5293                                                    optarg, false);
5294                  if (!sn_opts) {
5295                      error_report("Failed in parsing snapshot param '%s'",
5296                                   optarg);
5297                      goto out;
5298                  }
5299              } else {
5300                  snapshot_name = optarg;
5301              }
5302              break;
5303          case 'U':
5304              force_share = true;
5305              break;
5306          case OPTION_OBJECT:
5307              user_creatable_process_cmdline(optarg);
5308              break;
5309          case OPTION_IMAGE_OPTS:
5310              image_opts = true;
5311              break;
5312          case OPTION_OUTPUT:
5313              if (!strcmp(optarg, "json")) {
5314                  output_format = OFORMAT_JSON;
5315              } else if (!strcmp(optarg, "human")) {
5316                  output_format = OFORMAT_HUMAN;
5317              } else {
5318                  error_report("--output must be used with human or json "
5319                               "as argument.");
5320                  goto out;
5321              }
5322              break;
5323          case OPTION_SIZE:
5324          {
5325              int64_t sval;
5326  
5327              sval = cvtnum("image size", optarg);
5328              if (sval < 0) {
5329                  goto out;
5330              }
5331              img_size = (uint64_t)sval;
5332          }
5333          break;
5334          }
5335      }
5336  
5337      if (argc - optind > 1) {
5338          error_report("At most one filename argument is allowed.");
5339          goto out;
5340      } else if (argc - optind == 1) {
5341          filename = argv[optind];
5342      }
5343  
5344      if (!filename && (image_opts || fmt || snapshot_name || sn_opts)) {
5345          error_report("--image-opts, -f, and -l require a filename argument.");
5346          goto out;
5347      }
5348      if (filename && img_size != UINT64_MAX) {
5349          error_report("--size N cannot be used together with a filename.");
5350          goto out;
5351      }
5352      if (!filename && img_size == UINT64_MAX) {
5353          error_report("Either --size N or one filename must be specified.");
5354          goto out;
5355      }
5356  
5357      if (filename) {
5358          in_blk = img_open(image_opts, filename, fmt, 0,
5359                            false, false, force_share);
5360          if (!in_blk) {
5361              goto out;
5362          }
5363  
5364          if (sn_opts) {
5365              bdrv_snapshot_load_tmp(blk_bs(in_blk),
5366                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_ID),
5367                      qemu_opt_get(sn_opts, SNAPSHOT_OPT_NAME),
5368                      &local_err);
5369          } else if (snapshot_name != NULL) {
5370              bdrv_snapshot_load_tmp_by_id_or_name(blk_bs(in_blk),
5371                      snapshot_name, &local_err);
5372          }
5373          if (local_err) {
5374              error_reportf_err(local_err, "Failed to load snapshot: ");
5375              goto out;
5376          }
5377      }
5378  
5379      drv = bdrv_find_format(out_fmt);
5380      if (!drv) {
5381          error_report("Unknown file format '%s'", out_fmt);
5382          goto out;
5383      }
5384      if (!drv->create_opts) {
5385          error_report("Format driver '%s' does not support image creation",
5386                       drv->format_name);
5387          goto out;
5388      }
5389  
5390      create_opts = qemu_opts_append(create_opts, drv->create_opts);
5391      create_opts = qemu_opts_append(create_opts, bdrv_file.create_opts);
5392      opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
5393      if (options) {
5394          if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
5395              error_report_err(local_err);
5396              error_report("Invalid options for file format '%s'", out_fmt);
5397              goto out;
5398          }
5399      }
5400      if (img_size != UINT64_MAX) {
5401          qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
5402      }
5403  
5404      info = bdrv_measure(drv, opts, in_blk ? blk_bs(in_blk) : NULL, &local_err);
5405      if (local_err) {
5406          error_report_err(local_err);
5407          goto out;
5408      }
5409  
5410      if (output_format == OFORMAT_HUMAN) {
5411          printf("required size: %" PRIu64 "\n", info->required);
5412          printf("fully allocated size: %" PRIu64 "\n", info->fully_allocated);
5413          if (info->has_bitmaps) {
5414              printf("bitmaps size: %" PRIu64 "\n", info->bitmaps);
5415          }
5416      } else {
5417          dump_json_block_measure_info(info);
5418      }
5419  
5420      ret = 0;
5421  
5422  out:
5423      qapi_free_BlockMeasureInfo(info);
5424      qemu_opts_del(object_opts);
5425      qemu_opts_del(opts);
5426      qemu_opts_del(sn_opts);
5427      qemu_opts_free(create_opts);
5428      g_free(options);
5429      blk_unref(in_blk);
5430      return ret;
5431  }
5432  
5433  static const img_cmd_t img_cmds[] = {
5434  #define DEF(option, callback, arg_string)        \
5435      { option, callback },
5436  #include "qemu-img-cmds.h"
5437  #undef DEF
5438      { NULL, NULL, },
5439  };
5440  
5441  int main(int argc, char **argv)
5442  {
5443      const img_cmd_t *cmd;
5444      const char *cmdname;
5445      int c;
5446      static const struct option long_options[] = {
5447          {"help", no_argument, 0, 'h'},
5448          {"version", no_argument, 0, 'V'},
5449          {"trace", required_argument, NULL, 'T'},
5450          {0, 0, 0, 0}
5451      };
5452  
5453  #ifdef CONFIG_POSIX
5454      signal(SIGPIPE, SIG_IGN);
5455  #endif
5456  
5457      socket_init();
5458      error_init(argv[0]);
5459      module_call_init(MODULE_INIT_TRACE);
5460      qemu_init_exec_dir(argv[0]);
5461  
5462      qemu_init_main_loop(&error_fatal);
5463  
5464      qcrypto_init(&error_fatal);
5465  
5466      module_call_init(MODULE_INIT_QOM);
5467      bdrv_init();
5468      if (argc < 2) {
5469          error_exit("Not enough arguments");
5470      }
5471  
5472      qemu_add_opts(&qemu_source_opts);
5473      qemu_add_opts(&qemu_trace_opts);
5474  
5475      while ((c = getopt_long(argc, argv, "+:hVT:", long_options, NULL)) != -1) {
5476          switch (c) {
5477          case ':':
5478              missing_argument(argv[optind - 1]);
5479              return 0;
5480          case '?':
5481              unrecognized_option(argv[optind - 1]);
5482              return 0;
5483          case 'h':
5484              help();
5485              return 0;
5486          case 'V':
5487              printf(QEMU_IMG_VERSION);
5488              return 0;
5489          case 'T':
5490              trace_opt_parse(optarg);
5491              break;
5492          }
5493      }
5494  
5495      cmdname = argv[optind];
5496  
5497      /* reset getopt_long scanning */
5498      argc -= optind;
5499      if (argc < 1) {
5500          return 0;
5501      }
5502      argv += optind;
5503      qemu_reset_optind();
5504  
5505      if (!trace_init_backends()) {
5506          exit(1);
5507      }
5508      trace_init_file();
5509      qemu_set_log(LOG_TRACE, &error_fatal);
5510  
5511      /* find the command */
5512      for (cmd = img_cmds; cmd->name != NULL; cmd++) {
5513          if (!strcmp(cmdname, cmd->name)) {
5514              return cmd->handler(argc, argv);
5515          }
5516      }
5517  
5518      /* not found */
5519      error_exit("Command not found: %s", cmdname);
5520  }
5521