2 * QEMU disk image utility
4 * Copyright (c) 2003-2008 Fabrice Bellard
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
24 #include "qapi-visit.h"
25 #include "qapi/qmp-output-visitor.h"
26 #include "qapi/qmp/qjson.h"
27 #include "qemu-common.h"
28 #include "qemu/option.h"
29 #include "qemu/error-report.h"
30 #include "qemu/osdep.h"
31 #include "sysemu/sysemu.h"
32 #include "block/block_int.h"
33 #include "block/qapi.h"
42 typedef struct img_cmd_t
{
44 int (*handler
)(int argc
, char **argv
);
49 OPTION_BACKING_CHAIN
= 257,
52 typedef enum OutputFormat
{
57 /* Default to cache=writeback as data integrity is not important for qemu-tcg. */
58 #define BDRV_O_FLAGS BDRV_O_CACHE_WB
59 #define BDRV_DEFAULT_CACHE "writeback"
61 static void format_print(void *opaque
, const char *name
)
66 /* Please keep in synch with qemu-img.texi */
67 static void help(void)
69 const char *help_msg
=
70 "qemu-img version " QEMU_VERSION
", Copyright (c) 2004-2008 Fabrice Bellard\n"
71 "usage: qemu-img command [command options]\n"
72 "QEMU disk image utility\n"
75 #define DEF(option, callback, arg_string) \
77 #include "qemu-img-cmds.h"
81 "Command parameters:\n"
82 " 'filename' is a disk image filename\n"
83 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
84 " 'cache' is the cache mode used to write the output disk image, the valid\n"
85 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
86 " 'directsync' and 'unsafe' (default for convert)\n"
87 " 'size' is the disk image size in bytes. Optional suffixes\n"
88 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
89 " 'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P) are\n"
90 " supported. 'b' is ignored.\n"
91 " 'output_filename' is the destination disk image filename\n"
92 " 'output_fmt' is the destination format\n"
93 " 'options' is a comma separated list of format specific options in a\n"
94 " name=value format. Use -o ? for an overview of the options supported by the\n"
96 " '-c' indicates that target image must be compressed (qcow format only)\n"
97 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
98 " match exactly. The image doesn't need a working backing file before\n"
99 " rebasing in this case (useful for renaming the backing file)\n"
100 " '-h' with or without a command shows this help and lists the supported formats\n"
101 " '-p' show progress of command (only certain commands)\n"
102 " '-q' use Quiet mode - do not print any output (except errors)\n"
103 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
104 " for qemu-img to create a sparse image during conversion\n"
105 " '--output' takes the format in which the output must be done (human or json)\n"
107 "Parameters to check subcommand:\n"
108 " '-r' tries to repair any inconsistencies that are found during the check.\n"
109 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
110 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
111 " hiding corruption that has already occurred.\n"
113 "Parameters to snapshot subcommand:\n"
114 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
115 " '-a' applies a snapshot (revert disk to saved state)\n"
116 " '-c' creates a snapshot\n"
117 " '-d' deletes a snapshot\n"
118 " '-l' lists all snapshots in the given image\n"
120 "Parameters to compare subcommand:\n"
121 " '-f' first image format\n"
122 " '-F' second image format\n"
123 " '-s' run in Strict mode - fail on different image size or sector allocation\n";
125 printf("%s\nSupported formats:", help_msg
);
126 bdrv_iterate_format(format_print
, NULL
);
131 static int qprintf(bool quiet
, const char *fmt
, ...)
137 ret
= vprintf(fmt
, args
);
144 /* XXX: put correct support for win32 */
145 static int read_password(char *buf
, int buf_size
)
148 printf("Password: ");
155 if (i
< (buf_size
- 1))
166 static struct termios oldtty
;
168 static void term_exit(void)
170 tcsetattr (0, TCSANOW
, &oldtty
);
173 static void term_init(void)
180 tty
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
181 |INLCR
|IGNCR
|ICRNL
|IXON
);
182 tty
.c_oflag
|= OPOST
;
183 tty
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|IEXTEN
);
184 tty
.c_cflag
&= ~(CSIZE
|PARENB
);
189 tcsetattr (0, TCSANOW
, &tty
);
194 static int read_password(char *buf
, int buf_size
)
199 printf("password: ");
204 ret
= read(0, &ch
, 1);
206 if (errno
== EAGAIN
|| errno
== EINTR
) {
212 } else if (ret
== 0) {
220 if (i
< (buf_size
- 1))
231 static int print_block_option_help(const char *filename
, const char *fmt
)
233 BlockDriver
*drv
, *proto_drv
;
234 QEMUOptionParameter
*create_options
= NULL
;
236 /* Find driver and parse its options */
237 drv
= bdrv_find_format(fmt
);
239 error_report("Unknown file format '%s'", fmt
);
243 proto_drv
= bdrv_find_protocol(filename
);
245 error_report("Unknown protocol '%s'", filename
);
249 create_options
= append_option_parameters(create_options
,
250 drv
->create_options
);
251 create_options
= append_option_parameters(create_options
,
252 proto_drv
->create_options
);
253 print_option_help(create_options
);
254 free_option_parameters(create_options
);
258 static BlockDriverState
*bdrv_new_open(const char *filename
,
264 BlockDriverState
*bs
;
269 bs
= bdrv_new("image");
272 drv
= bdrv_find_format(fmt
);
274 error_report("Unknown file format '%s'", fmt
);
281 ret
= bdrv_open(bs
, filename
, NULL
, flags
, drv
);
283 error_report("Could not open '%s': %s", filename
, strerror(-ret
));
287 if (bdrv_is_encrypted(bs
) && require_io
) {
288 qprintf(quiet
, "Disk image '%s' is encrypted.\n", filename
);
289 if (read_password(password
, sizeof(password
)) < 0) {
290 error_report("No password given");
293 if (bdrv_set_key(bs
, password
) < 0) {
294 error_report("invalid password");
306 static int add_old_style_options(const char *fmt
, QEMUOptionParameter
*list
,
307 const char *base_filename
,
308 const char *base_fmt
)
311 if (set_option_parameter(list
, BLOCK_OPT_BACKING_FILE
, base_filename
)) {
312 error_report("Backing file not supported for file format '%s'",
318 if (set_option_parameter(list
, BLOCK_OPT_BACKING_FMT
, base_fmt
)) {
319 error_report("Backing file format not supported for file "
327 static int img_create(int argc
, char **argv
)
330 uint64_t img_size
= -1;
331 const char *fmt
= "raw";
332 const char *base_fmt
= NULL
;
333 const char *filename
;
334 const char *base_filename
= NULL
;
335 char *options
= NULL
;
336 Error
*local_err
= NULL
;
340 c
= getopt(argc
, argv
, "F:b:f:he6o:q");
353 base_filename
= optarg
;
359 error_report("option -e is deprecated, please use \'-o "
360 "encryption\' instead!");
363 error_report("option -6 is deprecated, please use \'-o "
364 "compat6\' instead!");
375 /* Get the filename */
376 if (optind
>= argc
) {
379 filename
= argv
[optind
++];
381 /* Get image size, if specified */
385 sval
= strtosz_suffix(argv
[optind
++], &end
, STRTOSZ_DEFSUFFIX_B
);
386 if (sval
< 0 || *end
) {
387 if (sval
== -ERANGE
) {
388 error_report("Image size must be less than 8 EiB!");
390 error_report("Invalid image size specified! You may use k, M, "
391 "G, T, P or E suffixes for ");
392 error_report("kilobytes, megabytes, gigabytes, terabytes, "
393 "petabytes and exabytes.");
397 img_size
= (uint64_t)sval
;
400 if (options
&& is_help_option(options
)) {
401 return print_block_option_help(filename
, fmt
);
404 bdrv_img_create(filename
, fmt
, base_filename
, base_fmt
,
405 options
, img_size
, BDRV_O_FLAGS
, &local_err
, quiet
);
406 if (error_is_set(&local_err
)) {
407 error_report("%s", error_get_pretty(local_err
));
408 error_free(local_err
);
415 static void dump_json_image_check(ImageCheck
*check
, bool quiet
)
419 QmpOutputVisitor
*ov
= qmp_output_visitor_new();
421 visit_type_ImageCheck(qmp_output_get_visitor(ov
),
422 &check
, NULL
, &errp
);
423 obj
= qmp_output_get_qobject(ov
);
424 str
= qobject_to_json_pretty(obj
);
426 qprintf(quiet
, "%s\n", qstring_get_str(str
));
428 qmp_output_visitor_cleanup(ov
);
432 static void dump_human_image_check(ImageCheck
*check
, bool quiet
)
434 if (!(check
->corruptions
|| check
->leaks
|| check
->check_errors
)) {
435 qprintf(quiet
, "No errors were found on the image.\n");
437 if (check
->corruptions
) {
438 qprintf(quiet
, "\n%" PRId64
" errors were found on the image.\n"
439 "Data may be corrupted, or further writes to the image "
446 "\n%" PRId64
" leaked clusters were found on the image.\n"
447 "This means waste of disk space, but no harm to data.\n",
451 if (check
->check_errors
) {
454 " internal errors have occurred during the check.\n",
455 check
->check_errors
);
459 if (check
->total_clusters
!= 0 && check
->allocated_clusters
!= 0) {
460 qprintf(quiet
, "%" PRId64
"/%" PRId64
" = %0.2f%% allocated, "
461 "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
462 check
->allocated_clusters
, check
->total_clusters
,
463 check
->allocated_clusters
* 100.0 / check
->total_clusters
,
464 check
->fragmented_clusters
* 100.0 / check
->allocated_clusters
,
465 check
->compressed_clusters
* 100.0 /
466 check
->allocated_clusters
);
469 if (check
->image_end_offset
) {
471 "Image end offset: %" PRId64
"\n", check
->image_end_offset
);
475 static int collect_image_check(BlockDriverState
*bs
,
477 const char *filename
,
482 BdrvCheckResult result
;
484 ret
= bdrv_check(bs
, &result
, fix
);
489 check
->filename
= g_strdup(filename
);
490 check
->format
= g_strdup(bdrv_get_format_name(bs
));
491 check
->check_errors
= result
.check_errors
;
492 check
->corruptions
= result
.corruptions
;
493 check
->has_corruptions
= result
.corruptions
!= 0;
494 check
->leaks
= result
.leaks
;
495 check
->has_leaks
= result
.leaks
!= 0;
496 check
->corruptions_fixed
= result
.corruptions_fixed
;
497 check
->has_corruptions_fixed
= result
.corruptions
!= 0;
498 check
->leaks_fixed
= result
.leaks_fixed
;
499 check
->has_leaks_fixed
= result
.leaks
!= 0;
500 check
->image_end_offset
= result
.image_end_offset
;
501 check
->has_image_end_offset
= result
.image_end_offset
!= 0;
502 check
->total_clusters
= result
.bfi
.total_clusters
;
503 check
->has_total_clusters
= result
.bfi
.total_clusters
!= 0;
504 check
->allocated_clusters
= result
.bfi
.allocated_clusters
;
505 check
->has_allocated_clusters
= result
.bfi
.allocated_clusters
!= 0;
506 check
->fragmented_clusters
= result
.bfi
.fragmented_clusters
;
507 check
->has_fragmented_clusters
= result
.bfi
.fragmented_clusters
!= 0;
508 check
->compressed_clusters
= result
.bfi
.compressed_clusters
;
509 check
->has_compressed_clusters
= result
.bfi
.compressed_clusters
!= 0;
515 * Checks an image for consistency. Exit codes:
517 * 0 - Check completed, image is good
518 * 1 - Check not completed because of internal errors
519 * 2 - Check completed, image is corrupted
520 * 3 - Check completed, image has leaked clusters, but is good otherwise
522 static int img_check(int argc
, char **argv
)
525 OutputFormat output_format
= OFORMAT_HUMAN
;
526 const char *filename
, *fmt
, *output
;
527 BlockDriverState
*bs
;
529 int flags
= BDRV_O_FLAGS
| BDRV_O_CHECK
;
536 int option_index
= 0;
537 static const struct option long_options
[] = {
538 {"help", no_argument
, 0, 'h'},
539 {"format", required_argument
, 0, 'f'},
540 {"repair", no_argument
, 0, 'r'},
541 {"output", required_argument
, 0, OPTION_OUTPUT
},
544 c
= getopt_long(argc
, argv
, "f:hr:q",
545 long_options
, &option_index
);
558 flags
|= BDRV_O_RDWR
;
560 if (!strcmp(optarg
, "leaks")) {
561 fix
= BDRV_FIX_LEAKS
;
562 } else if (!strcmp(optarg
, "all")) {
563 fix
= BDRV_FIX_LEAKS
| BDRV_FIX_ERRORS
;
576 if (optind
>= argc
) {
579 filename
= argv
[optind
++];
581 if (output
&& !strcmp(output
, "json")) {
582 output_format
= OFORMAT_JSON
;
583 } else if (output
&& !strcmp(output
, "human")) {
584 output_format
= OFORMAT_HUMAN
;
586 error_report("--output must be used with human or json as argument.");
590 bs
= bdrv_new_open(filename
, fmt
, flags
, true, quiet
);
595 check
= g_new0(ImageCheck
, 1);
596 ret
= collect_image_check(bs
, check
, filename
, fmt
, fix
);
598 if (ret
== -ENOTSUP
) {
599 if (output_format
== OFORMAT_HUMAN
) {
600 error_report("This image format does not support checks");
606 if (check
->corruptions_fixed
|| check
->leaks_fixed
) {
607 int corruptions_fixed
, leaks_fixed
;
609 leaks_fixed
= check
->leaks_fixed
;
610 corruptions_fixed
= check
->corruptions_fixed
;
612 if (output_format
== OFORMAT_HUMAN
) {
614 "The following inconsistencies were found and repaired:\n\n"
615 " %" PRId64
" leaked clusters\n"
616 " %" PRId64
" corruptions\n\n"
617 "Double checking the fixed image now...\n",
619 check
->corruptions_fixed
);
622 ret
= collect_image_check(bs
, check
, filename
, fmt
, 0);
624 check
->leaks_fixed
= leaks_fixed
;
625 check
->corruptions_fixed
= corruptions_fixed
;
628 switch (output_format
) {
630 dump_human_image_check(check
, quiet
);
633 dump_json_image_check(check
, quiet
);
637 if (ret
|| check
->check_errors
) {
642 if (check
->corruptions
) {
644 } else if (check
->leaks
) {
651 qapi_free_ImageCheck(check
);
657 static int img_commit(int argc
, char **argv
)
660 const char *filename
, *fmt
, *cache
;
661 BlockDriverState
*bs
;
665 cache
= BDRV_DEFAULT_CACHE
;
667 c
= getopt(argc
, argv
, "f:ht:q");
687 if (optind
>= argc
) {
690 filename
= argv
[optind
++];
693 ret
= bdrv_parse_cache_flags(cache
, &flags
);
695 error_report("Invalid cache option: %s", cache
);
699 bs
= bdrv_new_open(filename
, fmt
, flags
, true, quiet
);
703 ret
= bdrv_commit(bs
);
706 qprintf(quiet
, "Image committed.\n");
709 error_report("No disk inserted");
712 error_report("Image is read-only");
715 error_report("Image is already committed");
718 error_report("Error while committing image");
730 * Returns true iff the first sector pointed to by 'buf' contains at least
733 * 'pnum' is set to the number of sectors (including and immediately following
734 * the first one) that are known to be in the same allocated/unallocated state.
736 static int is_allocated_sectors(const uint8_t *buf
, int n
, int *pnum
)
745 is_zero
= buffer_is_zero(buf
, 512);
746 for(i
= 1; i
< n
; i
++) {
748 if (is_zero
!= buffer_is_zero(buf
, 512)) {
757 * Like is_allocated_sectors, but if the buffer starts with a used sector,
758 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
759 * breaking up write requests for only small sparse areas.
761 static int is_allocated_sectors_min(const uint8_t *buf
, int n
, int *pnum
,
765 int num_checked
, num_used
;
771 ret
= is_allocated_sectors(buf
, n
, pnum
);
777 buf
+= BDRV_SECTOR_SIZE
* *pnum
;
779 num_checked
= num_used
;
782 ret
= is_allocated_sectors(buf
, n
, pnum
);
784 buf
+= BDRV_SECTOR_SIZE
* *pnum
;
786 num_checked
+= *pnum
;
788 num_used
= num_checked
;
789 } else if (*pnum
>= min
) {
799 * Compares two buffers sector by sector. Returns 0 if the first sector of both
800 * buffers matches, non-zero otherwise.
802 * pnum is set to the number of sectors (including and immediately following
803 * the first one) that are known to have the same comparison result
805 static int compare_sectors(const uint8_t *buf1
, const uint8_t *buf2
, int n
,
815 res
= !!memcmp(buf1
, buf2
, 512);
816 for(i
= 1; i
< n
; i
++) {
820 if (!!memcmp(buf1
, buf2
, 512) != res
) {
829 #define IO_BUF_SIZE (2 * 1024 * 1024)
831 static int64_t sectors_to_bytes(int64_t sectors
)
833 return sectors
<< BDRV_SECTOR_BITS
;
836 static int64_t sectors_to_process(int64_t total
, int64_t from
)
838 return MIN(total
- from
, IO_BUF_SIZE
>> BDRV_SECTOR_BITS
);
842 * Check if passed sectors are empty (not allocated or contain only 0 bytes)
844 * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
845 * data and negative value on error.
847 * @param bs: Driver used for accessing file
848 * @param sect_num: Number of first sector to check
849 * @param sect_count: Number of sectors to check
850 * @param filename: Name of disk file we are checking (logging purpose)
851 * @param buffer: Allocated buffer for storing read data
852 * @param quiet: Flag for quiet mode
854 static int check_empty_sectors(BlockDriverState
*bs
, int64_t sect_num
,
855 int sect_count
, const char *filename
,
856 uint8_t *buffer
, bool quiet
)
859 ret
= bdrv_read(bs
, sect_num
, buffer
, sect_count
);
861 error_report("Error while reading offset %" PRId64
" of %s: %s",
862 sectors_to_bytes(sect_num
), filename
, strerror(-ret
));
865 ret
= is_allocated_sectors(buffer
, sect_count
, &pnum
);
866 if (ret
|| pnum
!= sect_count
) {
867 qprintf(quiet
, "Content mismatch at offset %" PRId64
"!\n",
868 sectors_to_bytes(ret
? sect_num
: sect_num
+ pnum
));
876 * Compares two images. Exit codes:
878 * 0 - Images are identical
880 * >1 - Error occurred
882 static int img_compare(int argc
, char **argv
)
884 const char *fmt1
= NULL
, *fmt2
= NULL
, *filename1
, *filename2
;
885 BlockDriverState
*bs1
, *bs2
;
886 int64_t total_sectors1
, total_sectors2
;
887 uint8_t *buf1
= NULL
, *buf2
= NULL
;
889 int allocated1
, allocated2
;
890 int ret
= 0; /* return value - 0 Ident, 1 Different, >1 Error */
891 bool progress
= false, quiet
= false, strict
= false;
892 int64_t total_sectors
;
893 int64_t sector_num
= 0;
897 uint64_t progress_base
;
900 c
= getopt(argc
, argv
, "hpf:F:sq");
927 /* Progress is not shown in Quiet mode */
933 if (optind
> argc
- 2) {
936 filename1
= argv
[optind
++];
937 filename2
= argv
[optind
++];
939 /* Initialize before goto out */
940 qemu_progress_init(progress
, 2.0);
942 bs1
= bdrv_new_open(filename1
, fmt1
, BDRV_O_FLAGS
, true, quiet
);
944 error_report("Can't open file %s", filename1
);
949 bs2
= bdrv_new_open(filename2
, fmt2
, BDRV_O_FLAGS
, true, quiet
);
951 error_report("Can't open file %s", filename2
);
956 buf1
= qemu_blockalign(bs1
, IO_BUF_SIZE
);
957 buf2
= qemu_blockalign(bs2
, IO_BUF_SIZE
);
958 bdrv_get_geometry(bs1
, &bs_sectors
);
959 total_sectors1
= bs_sectors
;
960 bdrv_get_geometry(bs2
, &bs_sectors
);
961 total_sectors2
= bs_sectors
;
962 total_sectors
= MIN(total_sectors1
, total_sectors2
);
963 progress_base
= MAX(total_sectors1
, total_sectors2
);
965 qemu_progress_print(0, 100);
967 if (strict
&& total_sectors1
!= total_sectors2
) {
969 qprintf(quiet
, "Strict mode: Image size mismatch!\n");
974 nb_sectors
= sectors_to_process(total_sectors
, sector_num
);
975 if (nb_sectors
<= 0) {
978 allocated1
= bdrv_is_allocated_above(bs1
, NULL
, sector_num
, nb_sectors
,
980 if (allocated1
< 0) {
982 error_report("Sector allocation test failed for %s", filename1
);
986 allocated2
= bdrv_is_allocated_above(bs2
, NULL
, sector_num
, nb_sectors
,
988 if (allocated2
< 0) {
990 error_report("Sector allocation test failed for %s", filename2
);
993 nb_sectors
= MIN(pnum1
, pnum2
);
995 if (allocated1
== allocated2
) {
997 ret
= bdrv_read(bs1
, sector_num
, buf1
, nb_sectors
);
999 error_report("Error while reading offset %" PRId64
" of %s:"
1000 " %s", sectors_to_bytes(sector_num
), filename1
,
1005 ret
= bdrv_read(bs2
, sector_num
, buf2
, nb_sectors
);
1007 error_report("Error while reading offset %" PRId64
1008 " of %s: %s", sectors_to_bytes(sector_num
),
1009 filename2
, strerror(-ret
));
1013 ret
= compare_sectors(buf1
, buf2
, nb_sectors
, &pnum
);
1014 if (ret
|| pnum
!= nb_sectors
) {
1016 qprintf(quiet
, "Content mismatch at offset %" PRId64
"!\n",
1018 ret
? sector_num
: sector_num
+ pnum
));
1025 qprintf(quiet
, "Strict mode: Offset %" PRId64
1026 " allocation mismatch!\n",
1027 sectors_to_bytes(sector_num
));
1032 ret
= check_empty_sectors(bs1
, sector_num
, nb_sectors
,
1033 filename1
, buf1
, quiet
);
1035 ret
= check_empty_sectors(bs2
, sector_num
, nb_sectors
,
1036 filename2
, buf1
, quiet
);
1041 error_report("Error while reading offset %" PRId64
": %s",
1042 sectors_to_bytes(sector_num
), strerror(-ret
));
1047 sector_num
+= nb_sectors
;
1048 qemu_progress_print(((float) nb_sectors
/ progress_base
)*100, 100);
1051 if (total_sectors1
!= total_sectors2
) {
1052 BlockDriverState
*bs_over
;
1053 int64_t total_sectors_over
;
1054 const char *filename_over
;
1056 qprintf(quiet
, "Warning: Image size mismatch!\n");
1057 if (total_sectors1
> total_sectors2
) {
1058 total_sectors_over
= total_sectors1
;
1060 filename_over
= filename1
;
1062 total_sectors_over
= total_sectors2
;
1064 filename_over
= filename2
;
1068 nb_sectors
= sectors_to_process(total_sectors_over
, sector_num
);
1069 if (nb_sectors
<= 0) {
1072 ret
= bdrv_is_allocated_above(bs_over
, NULL
, sector_num
,
1076 error_report("Sector allocation test failed for %s",
1083 ret
= check_empty_sectors(bs_over
, sector_num
, nb_sectors
,
1084 filename_over
, buf1
, quiet
);
1088 error_report("Error while reading offset %" PRId64
1089 " of %s: %s", sectors_to_bytes(sector_num
),
1090 filename_over
, strerror(-ret
));
1095 sector_num
+= nb_sectors
;
1096 qemu_progress_print(((float) nb_sectors
/ progress_base
)*100, 100);
1100 qprintf(quiet
, "Images are identical.\n");
1110 qemu_progress_end();
1114 static int img_convert(int argc
, char **argv
)
1116 int c
, ret
= 0, n
, n1
, bs_n
, bs_i
, compress
, cluster_size
, cluster_sectors
;
1117 int progress
= 0, flags
;
1118 const char *fmt
, *out_fmt
, *cache
, *out_baseimg
, *out_filename
;
1119 BlockDriver
*drv
, *proto_drv
;
1120 BlockDriverState
**bs
= NULL
, *out_bs
= NULL
;
1121 int64_t total_sectors
, nb_sectors
, sector_num
, bs_offset
;
1122 uint64_t bs_sectors
;
1123 uint8_t * buf
= NULL
;
1124 const uint8_t *buf1
;
1125 BlockDriverInfo bdi
;
1126 QEMUOptionParameter
*param
= NULL
, *create_options
= NULL
;
1127 QEMUOptionParameter
*out_baseimg_param
;
1128 char *options
= NULL
;
1129 const char *snapshot_name
= NULL
;
1130 float local_progress
= 0;
1131 int min_sparse
= 8; /* Need at least 4k of zeros for sparse detection */
1140 c
= getopt(argc
, argv
, "f:O:B:s:hce6o:pS:t:q");
1156 out_baseimg
= optarg
;
1162 error_report("option -e is deprecated, please use \'-o "
1163 "encryption\' instead!");
1166 error_report("option -6 is deprecated, please use \'-o "
1167 "compat6\' instead!");
1173 snapshot_name
= optarg
;
1179 sval
= strtosz_suffix(optarg
, &end
, STRTOSZ_DEFSUFFIX_B
);
1180 if (sval
< 0 || *end
) {
1181 error_report("Invalid minimum zero buffer size for sparse output specified");
1185 min_sparse
= sval
/ BDRV_SECTOR_SIZE
;
1204 bs_n
= argc
- optind
- 1;
1209 out_filename
= argv
[argc
- 1];
1211 /* Initialize before goto out */
1212 qemu_progress_init(progress
, 2.0);
1214 if (options
&& is_help_option(options
)) {
1215 ret
= print_block_option_help(out_filename
, out_fmt
);
1219 if (bs_n
> 1 && out_baseimg
) {
1220 error_report("-B makes no sense when concatenating multiple input "
1226 qemu_progress_print(0, 100);
1228 bs
= g_malloc0(bs_n
* sizeof(BlockDriverState
*));
1231 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++) {
1232 bs
[bs_i
] = bdrv_new_open(argv
[optind
+ bs_i
], fmt
, BDRV_O_FLAGS
, true,
1235 error_report("Could not open '%s'", argv
[optind
+ bs_i
]);
1239 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
1240 total_sectors
+= bs_sectors
;
1243 if (snapshot_name
!= NULL
) {
1245 error_report("No support for concatenating multiple snapshot");
1249 if (bdrv_snapshot_load_tmp(bs
[0], snapshot_name
) < 0) {
1250 error_report("Failed to load snapshot");
1256 /* Find driver and parse its options */
1257 drv
= bdrv_find_format(out_fmt
);
1259 error_report("Unknown file format '%s'", out_fmt
);
1264 proto_drv
= bdrv_find_protocol(out_filename
);
1266 error_report("Unknown protocol '%s'", out_filename
);
1271 create_options
= append_option_parameters(create_options
,
1272 drv
->create_options
);
1273 create_options
= append_option_parameters(create_options
,
1274 proto_drv
->create_options
);
1277 param
= parse_option_parameters(options
, create_options
, param
);
1278 if (param
== NULL
) {
1279 error_report("Invalid options for file format '%s'.", out_fmt
);
1284 param
= parse_option_parameters("", create_options
, param
);
1287 set_option_parameter_int(param
, BLOCK_OPT_SIZE
, total_sectors
* 512);
1288 ret
= add_old_style_options(out_fmt
, param
, out_baseimg
, NULL
);
1293 /* Get backing file name if -o backing_file was used */
1294 out_baseimg_param
= get_option_parameter(param
, BLOCK_OPT_BACKING_FILE
);
1295 if (out_baseimg_param
) {
1296 out_baseimg
= out_baseimg_param
->value
.s
;
1299 /* Check if compression is supported */
1301 QEMUOptionParameter
*encryption
=
1302 get_option_parameter(param
, BLOCK_OPT_ENCRYPT
);
1303 QEMUOptionParameter
*preallocation
=
1304 get_option_parameter(param
, BLOCK_OPT_PREALLOC
);
1306 if (!drv
->bdrv_write_compressed
) {
1307 error_report("Compression not supported for this file format");
1312 if (encryption
&& encryption
->value
.n
) {
1313 error_report("Compression and encryption not supported at "
1319 if (preallocation
&& preallocation
->value
.s
1320 && strcmp(preallocation
->value
.s
, "off"))
1322 error_report("Compression and preallocation not supported at "
1329 /* Create the new image */
1330 ret
= bdrv_create(drv
, out_filename
, param
);
1332 if (ret
== -ENOTSUP
) {
1333 error_report("Formatting not supported for file format '%s'",
1335 } else if (ret
== -EFBIG
) {
1336 error_report("The image size is too large for file format '%s'",
1339 error_report("%s: error while converting %s: %s",
1340 out_filename
, out_fmt
, strerror(-ret
));
1345 flags
= BDRV_O_RDWR
;
1346 ret
= bdrv_parse_cache_flags(cache
, &flags
);
1348 error_report("Invalid cache option: %s", cache
);
1352 out_bs
= bdrv_new_open(out_filename
, out_fmt
, flags
, true, quiet
);
1360 bdrv_get_geometry(bs
[0], &bs_sectors
);
1361 buf
= qemu_blockalign(out_bs
, IO_BUF_SIZE
);
1364 ret
= bdrv_get_info(out_bs
, &bdi
);
1366 error_report("could not get block driver info");
1369 cluster_size
= bdi
.cluster_size
;
1370 if (cluster_size
<= 0 || cluster_size
> IO_BUF_SIZE
) {
1371 error_report("invalid cluster size");
1375 cluster_sectors
= cluster_size
>> 9;
1378 nb_sectors
= total_sectors
;
1379 if (nb_sectors
!= 0) {
1380 local_progress
= (float)100 /
1381 (nb_sectors
/ MIN(nb_sectors
, cluster_sectors
));
1389 nb_sectors
= total_sectors
- sector_num
;
1390 if (nb_sectors
<= 0)
1392 if (nb_sectors
>= cluster_sectors
)
1393 n
= cluster_sectors
;
1397 bs_num
= sector_num
- bs_offset
;
1398 assert (bs_num
>= 0);
1401 while (remainder
> 0) {
1403 while (bs_num
== bs_sectors
) {
1405 assert (bs_i
< bs_n
);
1406 bs_offset
+= bs_sectors
;
1407 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
1409 /* printf("changing part: sector_num=%" PRId64 ", "
1410 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
1411 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
1413 assert (bs_num
< bs_sectors
);
1415 nlow
= (remainder
> bs_sectors
- bs_num
) ? bs_sectors
- bs_num
: remainder
;
1417 ret
= bdrv_read(bs
[bs_i
], bs_num
, buf2
, nlow
);
1419 error_report("error while reading sector %" PRId64
": %s",
1420 bs_num
, strerror(-ret
));
1429 assert (remainder
== 0);
1431 if (!buffer_is_zero(buf
, n
* BDRV_SECTOR_SIZE
)) {
1432 ret
= bdrv_write_compressed(out_bs
, sector_num
, buf
, n
);
1434 error_report("error while compressing sector %" PRId64
1435 ": %s", sector_num
, strerror(-ret
));
1440 qemu_progress_print(local_progress
, 100);
1442 /* signal EOF to align */
1443 bdrv_write_compressed(out_bs
, 0, NULL
, 0);
1445 int has_zero_init
= bdrv_has_zero_init(out_bs
);
1447 sector_num
= 0; // total number of sectors converted so far
1448 nb_sectors
= total_sectors
- sector_num
;
1449 if (nb_sectors
!= 0) {
1450 local_progress
= (float)100 /
1451 (nb_sectors
/ MIN(nb_sectors
, IO_BUF_SIZE
/ 512));
1455 nb_sectors
= total_sectors
- sector_num
;
1456 if (nb_sectors
<= 0) {
1459 if (nb_sectors
>= (IO_BUF_SIZE
/ 512)) {
1460 n
= (IO_BUF_SIZE
/ 512);
1465 while (sector_num
- bs_offset
>= bs_sectors
) {
1467 assert (bs_i
< bs_n
);
1468 bs_offset
+= bs_sectors
;
1469 bdrv_get_geometry(bs
[bs_i
], &bs_sectors
);
1470 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1471 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
1472 sector_num, bs_i, bs_offset, bs_sectors); */
1475 if (n
> bs_offset
+ bs_sectors
- sector_num
) {
1476 n
= bs_offset
+ bs_sectors
- sector_num
;
1479 if (has_zero_init
) {
1480 /* If the output image is being created as a copy on write image,
1481 assume that sectors which are unallocated in the input image
1482 are present in both the output's and input's base images (no
1483 need to copy them). */
1485 if (!bdrv_is_allocated(bs
[bs_i
], sector_num
- bs_offset
,
1490 /* The next 'n1' sectors are allocated in the input image. Copy
1491 only those as they may be followed by unallocated sectors. */
1498 ret
= bdrv_read(bs
[bs_i
], sector_num
- bs_offset
, buf
, n
);
1500 error_report("error while reading sector %" PRId64
": %s",
1501 sector_num
- bs_offset
, strerror(-ret
));
1504 /* NOTE: at the same time we convert, we do not write zero
1505 sectors to have a chance to compress the image. Ideally, we
1506 should add a specific call to have the info to go faster */
1509 /* If the output image is being created as a copy on write image,
1510 copy all sectors even the ones containing only NUL bytes,
1511 because they may differ from the sectors in the base image.
1513 If the output is to a host device, we also write out
1514 sectors that are entirely 0, since whatever data was
1515 already there is garbage, not 0s. */
1516 if (!has_zero_init
|| out_baseimg
||
1517 is_allocated_sectors_min(buf1
, n
, &n1
, min_sparse
)) {
1518 ret
= bdrv_write(out_bs
, sector_num
, buf1
, n1
);
1520 error_report("error while writing sector %" PRId64
1521 ": %s", sector_num
, strerror(-ret
));
1529 qemu_progress_print(local_progress
, 100);
1533 qemu_progress_end();
1534 free_option_parameters(create_options
);
1535 free_option_parameters(param
);
1538 bdrv_delete(out_bs
);
1541 for (bs_i
= 0; bs_i
< bs_n
; bs_i
++) {
1543 bdrv_delete(bs
[bs_i
]);
1555 static void dump_snapshots(BlockDriverState
*bs
)
1557 QEMUSnapshotInfo
*sn_tab
, *sn
;
1560 nb_sns
= bdrv_snapshot_list(bs
, &sn_tab
);
1563 printf("Snapshot list:\n");
1564 bdrv_snapshot_dump(fprintf
, stdout
, NULL
);
1566 for(i
= 0; i
< nb_sns
; i
++) {
1568 bdrv_snapshot_dump(fprintf
, stdout
, sn
);
1574 static void dump_json_image_info_list(ImageInfoList
*list
)
1578 QmpOutputVisitor
*ov
= qmp_output_visitor_new();
1580 visit_type_ImageInfoList(qmp_output_get_visitor(ov
),
1581 &list
, NULL
, &errp
);
1582 obj
= qmp_output_get_qobject(ov
);
1583 str
= qobject_to_json_pretty(obj
);
1584 assert(str
!= NULL
);
1585 printf("%s\n", qstring_get_str(str
));
1586 qobject_decref(obj
);
1587 qmp_output_visitor_cleanup(ov
);
1591 static void dump_json_image_info(ImageInfo
*info
)
1595 QmpOutputVisitor
*ov
= qmp_output_visitor_new();
1597 visit_type_ImageInfo(qmp_output_get_visitor(ov
),
1598 &info
, NULL
, &errp
);
1599 obj
= qmp_output_get_qobject(ov
);
1600 str
= qobject_to_json_pretty(obj
);
1601 assert(str
!= NULL
);
1602 printf("%s\n", qstring_get_str(str
));
1603 qobject_decref(obj
);
1604 qmp_output_visitor_cleanup(ov
);
1608 static void dump_human_image_info_list(ImageInfoList
*list
)
1610 ImageInfoList
*elem
;
1613 for (elem
= list
; elem
; elem
= elem
->next
) {
1619 bdrv_image_info_dump(fprintf
, stdout
, elem
->value
);
1623 static gboolean
str_equal_func(gconstpointer a
, gconstpointer b
)
1625 return strcmp(a
, b
) == 0;
1629 * Open an image file chain and return an ImageInfoList
1631 * @filename: topmost image filename
1632 * @fmt: topmost image format (may be NULL to autodetect)
1633 * @chain: true - enumerate entire backing file chain
1634 * false - only topmost image file
1636 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1637 * image file. If there was an error a message will have been printed to
1640 static ImageInfoList
*collect_image_info_list(const char *filename
,
1644 ImageInfoList
*head
= NULL
;
1645 ImageInfoList
**last
= &head
;
1646 GHashTable
*filenames
;
1649 filenames
= g_hash_table_new_full(g_str_hash
, str_equal_func
, NULL
, NULL
);
1652 BlockDriverState
*bs
;
1654 ImageInfoList
*elem
;
1656 if (g_hash_table_lookup_extended(filenames
, filename
, NULL
, NULL
)) {
1657 error_report("Backing file '%s' creates an infinite loop.",
1661 g_hash_table_insert(filenames
, (gpointer
)filename
, NULL
);
1663 bs
= bdrv_new_open(filename
, fmt
, BDRV_O_FLAGS
| BDRV_O_NO_BACKING
,
1669 bdrv_query_image_info(bs
, &info
, &err
);
1670 if (error_is_set(&err
)) {
1671 error_report("%s", error_get_pretty(err
));
1676 elem
= g_new0(ImageInfoList
, 1);
1683 filename
= fmt
= NULL
;
1685 if (info
->has_full_backing_filename
) {
1686 filename
= info
->full_backing_filename
;
1687 } else if (info
->has_backing_filename
) {
1688 filename
= info
->backing_filename
;
1690 if (info
->has_backing_filename_format
) {
1691 fmt
= info
->backing_filename_format
;
1695 g_hash_table_destroy(filenames
);
1699 qapi_free_ImageInfoList(head
);
1700 g_hash_table_destroy(filenames
);
1704 static int img_info(int argc
, char **argv
)
1707 OutputFormat output_format
= OFORMAT_HUMAN
;
1709 const char *filename
, *fmt
, *output
;
1710 ImageInfoList
*list
;
1715 int option_index
= 0;
1716 static const struct option long_options
[] = {
1717 {"help", no_argument
, 0, 'h'},
1718 {"format", required_argument
, 0, 'f'},
1719 {"output", required_argument
, 0, OPTION_OUTPUT
},
1720 {"backing-chain", no_argument
, 0, OPTION_BACKING_CHAIN
},
1723 c
= getopt_long(argc
, argv
, "f:h",
1724 long_options
, &option_index
);
1739 case OPTION_BACKING_CHAIN
:
1744 if (optind
>= argc
) {
1747 filename
= argv
[optind
++];
1749 if (output
&& !strcmp(output
, "json")) {
1750 output_format
= OFORMAT_JSON
;
1751 } else if (output
&& !strcmp(output
, "human")) {
1752 output_format
= OFORMAT_HUMAN
;
1753 } else if (output
) {
1754 error_report("--output must be used with human or json as argument.");
1758 list
= collect_image_info_list(filename
, fmt
, chain
);
1763 switch (output_format
) {
1765 dump_human_image_info_list(list
);
1769 dump_json_image_info_list(list
);
1771 dump_json_image_info(list
->value
);
1776 qapi_free_ImageInfoList(list
);
1780 #define SNAPSHOT_LIST 1
1781 #define SNAPSHOT_CREATE 2
1782 #define SNAPSHOT_APPLY 3
1783 #define SNAPSHOT_DELETE 4
1785 static int img_snapshot(int argc
, char **argv
)
1787 BlockDriverState
*bs
;
1788 QEMUSnapshotInfo sn
;
1789 char *filename
, *snapshot_name
= NULL
;
1790 int c
, ret
= 0, bdrv_oflags
;
1795 bdrv_oflags
= BDRV_O_FLAGS
| BDRV_O_RDWR
;
1796 /* Parse commandline parameters */
1798 c
= getopt(argc
, argv
, "la:c:d:hq");
1812 action
= SNAPSHOT_LIST
;
1813 bdrv_oflags
&= ~BDRV_O_RDWR
; /* no need for RW */
1820 action
= SNAPSHOT_APPLY
;
1821 snapshot_name
= optarg
;
1828 action
= SNAPSHOT_CREATE
;
1829 snapshot_name
= optarg
;
1836 action
= SNAPSHOT_DELETE
;
1837 snapshot_name
= optarg
;
1845 if (optind
>= argc
) {
1848 filename
= argv
[optind
++];
1850 /* Open the image */
1851 bs
= bdrv_new_open(filename
, NULL
, bdrv_oflags
, true, quiet
);
1856 /* Perform the requested action */
1862 case SNAPSHOT_CREATE
:
1863 memset(&sn
, 0, sizeof(sn
));
1864 pstrcpy(sn
.name
, sizeof(sn
.name
), snapshot_name
);
1866 qemu_gettimeofday(&tv
);
1867 sn
.date_sec
= tv
.tv_sec
;
1868 sn
.date_nsec
= tv
.tv_usec
* 1000;
1870 ret
= bdrv_snapshot_create(bs
, &sn
);
1872 error_report("Could not create snapshot '%s': %d (%s)",
1873 snapshot_name
, ret
, strerror(-ret
));
1877 case SNAPSHOT_APPLY
:
1878 ret
= bdrv_snapshot_goto(bs
, snapshot_name
);
1880 error_report("Could not apply snapshot '%s': %d (%s)",
1881 snapshot_name
, ret
, strerror(-ret
));
1885 case SNAPSHOT_DELETE
:
1886 ret
= bdrv_snapshot_delete(bs
, snapshot_name
);
1888 error_report("Could not delete snapshot '%s': %d (%s)",
1889 snapshot_name
, ret
, strerror(-ret
));
1902 static int img_rebase(int argc
, char **argv
)
1904 BlockDriverState
*bs
, *bs_old_backing
= NULL
, *bs_new_backing
= NULL
;
1905 BlockDriver
*old_backing_drv
, *new_backing_drv
;
1907 const char *fmt
, *cache
, *out_basefmt
, *out_baseimg
;
1913 /* Parse commandline parameters */
1915 cache
= BDRV_DEFAULT_CACHE
;
1919 c
= getopt(argc
, argv
, "uhf:F:b:pt:q");
1932 out_basefmt
= optarg
;
1935 out_baseimg
= optarg
;
1956 if ((optind
>= argc
) || (!unsafe
&& !out_baseimg
)) {
1959 filename
= argv
[optind
++];
1961 qemu_progress_init(progress
, 2.0);
1962 qemu_progress_print(0, 100);
1964 flags
= BDRV_O_RDWR
| (unsafe
? BDRV_O_NO_BACKING
: 0);
1965 ret
= bdrv_parse_cache_flags(cache
, &flags
);
1967 error_report("Invalid cache option: %s", cache
);
1974 * Ignore the old backing file for unsafe rebase in case we want to correct
1975 * the reference to a renamed or moved backing file.
1977 bs
= bdrv_new_open(filename
, fmt
, flags
, true, quiet
);
1982 /* Find the right drivers for the backing files */
1983 old_backing_drv
= NULL
;
1984 new_backing_drv
= NULL
;
1986 if (!unsafe
&& bs
->backing_format
[0] != '\0') {
1987 old_backing_drv
= bdrv_find_format(bs
->backing_format
);
1988 if (old_backing_drv
== NULL
) {
1989 error_report("Invalid format name: '%s'", bs
->backing_format
);
1995 if (out_basefmt
!= NULL
) {
1996 new_backing_drv
= bdrv_find_format(out_basefmt
);
1997 if (new_backing_drv
== NULL
) {
1998 error_report("Invalid format name: '%s'", out_basefmt
);
2004 /* For safe rebasing we need to compare old and new backing file */
2006 /* Make the compiler happy */
2007 bs_old_backing
= NULL
;
2008 bs_new_backing
= NULL
;
2010 char backing_name
[1024];
2012 bs_old_backing
= bdrv_new("old_backing");
2013 bdrv_get_backing_filename(bs
, backing_name
, sizeof(backing_name
));
2014 ret
= bdrv_open(bs_old_backing
, backing_name
, NULL
, BDRV_O_FLAGS
,
2017 error_report("Could not open old backing file '%s'", backing_name
);
2020 if (out_baseimg
[0]) {
2021 bs_new_backing
= bdrv_new("new_backing");
2022 ret
= bdrv_open(bs_new_backing
, out_baseimg
, NULL
, BDRV_O_FLAGS
,
2025 error_report("Could not open new backing file '%s'",
2033 * Check each unallocated cluster in the COW file. If it is unallocated,
2034 * accesses go to the backing file. We must therefore compare this cluster
2035 * in the old and new backing file, and if they differ we need to copy it
2036 * from the old backing file into the COW file.
2038 * If qemu-img crashes during this step, no harm is done. The content of
2039 * the image is the same as the original one at any time.
2042 uint64_t num_sectors
;
2043 uint64_t old_backing_num_sectors
;
2044 uint64_t new_backing_num_sectors
= 0;
2049 float local_progress
= 0;
2051 buf_old
= qemu_blockalign(bs
, IO_BUF_SIZE
);
2052 buf_new
= qemu_blockalign(bs
, IO_BUF_SIZE
);
2054 bdrv_get_geometry(bs
, &num_sectors
);
2055 bdrv_get_geometry(bs_old_backing
, &old_backing_num_sectors
);
2056 if (bs_new_backing
) {
2057 bdrv_get_geometry(bs_new_backing
, &new_backing_num_sectors
);
2060 if (num_sectors
!= 0) {
2061 local_progress
= (float)100 /
2062 (num_sectors
/ MIN(num_sectors
, IO_BUF_SIZE
/ 512));
2065 for (sector
= 0; sector
< num_sectors
; sector
+= n
) {
2067 /* How many sectors can we handle with the next read? */
2068 if (sector
+ (IO_BUF_SIZE
/ 512) <= num_sectors
) {
2069 n
= (IO_BUF_SIZE
/ 512);
2071 n
= num_sectors
- sector
;
2074 /* If the cluster is allocated, we don't need to take action */
2075 ret
= bdrv_is_allocated(bs
, sector
, n
, &n
);
2081 * Read old and new backing file and take into consideration that
2082 * backing files may be smaller than the COW image.
2084 if (sector
>= old_backing_num_sectors
) {
2085 memset(buf_old
, 0, n
* BDRV_SECTOR_SIZE
);
2087 if (sector
+ n
> old_backing_num_sectors
) {
2088 n
= old_backing_num_sectors
- sector
;
2091 ret
= bdrv_read(bs_old_backing
, sector
, buf_old
, n
);
2093 error_report("error while reading from old backing file");
2098 if (sector
>= new_backing_num_sectors
|| !bs_new_backing
) {
2099 memset(buf_new
, 0, n
* BDRV_SECTOR_SIZE
);
2101 if (sector
+ n
> new_backing_num_sectors
) {
2102 n
= new_backing_num_sectors
- sector
;
2105 ret
= bdrv_read(bs_new_backing
, sector
, buf_new
, n
);
2107 error_report("error while reading from new backing file");
2112 /* If they differ, we need to write to the COW file */
2113 uint64_t written
= 0;
2115 while (written
< n
) {
2118 if (compare_sectors(buf_old
+ written
* 512,
2119 buf_new
+ written
* 512, n
- written
, &pnum
))
2121 ret
= bdrv_write(bs
, sector
+ written
,
2122 buf_old
+ written
* 512, pnum
);
2124 error_report("Error while writing to COW image: %s",
2132 qemu_progress_print(local_progress
, 100);
2135 qemu_vfree(buf_old
);
2136 qemu_vfree(buf_new
);
2140 * Change the backing file. All clusters that are different from the old
2141 * backing file are overwritten in the COW file now, so the visible content
2142 * doesn't change when we switch the backing file.
2144 if (out_baseimg
&& *out_baseimg
) {
2145 ret
= bdrv_change_backing_file(bs
, out_baseimg
, out_basefmt
);
2147 ret
= bdrv_change_backing_file(bs
, NULL
, NULL
);
2150 if (ret
== -ENOSPC
) {
2151 error_report("Could not change the backing file to '%s': No "
2152 "space left in the file header", out_baseimg
);
2153 } else if (ret
< 0) {
2154 error_report("Could not change the backing file to '%s': %s",
2155 out_baseimg
, strerror(-ret
));
2158 qemu_progress_print(100, 0);
2160 * TODO At this point it is possible to check if any clusters that are
2161 * allocated in the COW file are the same in the backing file. If so, they
2162 * could be dropped from the COW file. Don't do this before switching the
2163 * backing file, in case of a crash this would lead to corruption.
2166 qemu_progress_end();
2169 if (bs_old_backing
!= NULL
) {
2170 bdrv_delete(bs_old_backing
);
2172 if (bs_new_backing
!= NULL
) {
2173 bdrv_delete(bs_new_backing
);
2184 static int img_resize(int argc
, char **argv
)
2186 int c
, ret
, relative
;
2187 const char *filename
, *fmt
, *size
;
2188 int64_t n
, total_size
;
2190 BlockDriverState
*bs
= NULL
;
2192 static QemuOptsList resize_options
= {
2193 .name
= "resize_options",
2194 .head
= QTAILQ_HEAD_INITIALIZER(resize_options
.head
),
2197 .name
= BLOCK_OPT_SIZE
,
2198 .type
= QEMU_OPT_SIZE
,
2199 .help
= "Virtual disk size"
2206 /* Remove size from argv manually so that negative numbers are not treated
2207 * as options by getopt. */
2213 size
= argv
[--argc
];
2215 /* Parse getopt arguments */
2218 c
= getopt(argc
, argv
, "f:hq");
2235 if (optind
>= argc
) {
2238 filename
= argv
[optind
++];
2240 /* Choose grow, shrink, or absolute resize mode */
2256 param
= qemu_opts_create_nofail(&resize_options
);
2257 if (qemu_opt_set(param
, BLOCK_OPT_SIZE
, size
)) {
2258 /* Error message already printed when size parsing fails */
2260 qemu_opts_del(param
);
2263 n
= qemu_opt_get_size(param
, BLOCK_OPT_SIZE
, 0);
2264 qemu_opts_del(param
);
2266 bs
= bdrv_new_open(filename
, fmt
, BDRV_O_FLAGS
| BDRV_O_RDWR
, true, quiet
);
2273 total_size
= bdrv_getlength(bs
) + n
* relative
;
2277 if (total_size
<= 0) {
2278 error_report("New image size must be positive");
2283 ret
= bdrv_truncate(bs
, total_size
);
2286 qprintf(quiet
, "Image resized.\n");
2289 error_report("This image does not support resize");
2292 error_report("Image is read-only");
2295 error_report("Error resizing image (%d)", -ret
);
2308 static const img_cmd_t img_cmds
[] = {
2309 #define DEF(option, callback, arg_string) \
2310 { option, callback },
2311 #include "qemu-img-cmds.h"
2317 int main(int argc
, char **argv
)
2319 const img_cmd_t
*cmd
;
2320 const char *cmdname
;
2322 error_set_progname(argv
[0]);
2324 qemu_init_main_loop();
2331 /* find the command */
2332 for(cmd
= img_cmds
; cmd
->name
!= NULL
; cmd
++) {
2333 if (!strcmp(cmdname
, cmd
->name
)) {
2334 return cmd
->handler(argc
, argv
);