blob: cc3fed7b44a51d19caa84a9c22dd06e157c11d55 [file] [log] [blame]
bellardea2384d2004-08-01 21:59:26 +00001/*
bellardfb43f4d2006-08-07 21:34:46 +00002 * QEMU disk image utility
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard68d0f702008-01-06 17:21:48 +00004 * Copyright (c) 2003-2008 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellardea2384d2004-08-01 21:59:26 +00006 * 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 */
Benoît Canetc054b3f2012-09-05 13:09:02 +020024#include "qapi-visit.h"
25#include "qapi/qmp-output-visitor.h"
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010026#include "qapi/qmp/qjson.h"
pbrookfaf07962007-11-11 02:51:17 +000027#include "qemu-common.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010028#include "qemu/option.h"
29#include "qemu/error-report.h"
30#include "qemu/osdep.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010031#include "sysemu/sysemu.h"
Paolo Bonzini737e1502012-12-17 18:19:44 +010032#include "block/block_int.h"
Wenchao Xiaf364ec62013-05-25 11:09:44 +080033#include "block/qapi.h"
Benoît Canetc054b3f2012-09-05 13:09:02 +020034#include <getopt.h>
aliguori9230eaf2009-03-28 17:55:19 +000035#include <stdio.h>
Miroslav Rezaninaf382d432013-02-13 09:09:40 +010036#include <stdarg.h>
bellardea2384d2004-08-01 21:59:26 +000037
bellarde8445332006-06-14 15:32:10 +000038#ifdef _WIN32
39#include <windows.h>
40#endif
41
Anthony Liguoric227f092009-10-01 16:12:16 -050042typedef struct img_cmd_t {
Stuart Brady153859b2009-06-07 00:42:17 +010043 const char *name;
44 int (*handler)(int argc, char **argv);
Anthony Liguoric227f092009-10-01 16:12:16 -050045} img_cmd_t;
Stuart Brady153859b2009-06-07 00:42:17 +010046
Federico Simoncelli8599ea42013-01-28 06:59:47 -050047enum {
48 OPTION_OUTPUT = 256,
49 OPTION_BACKING_CHAIN = 257,
50};
51
52typedef enum OutputFormat {
53 OFORMAT_JSON,
54 OFORMAT_HUMAN,
55} OutputFormat;
56
aurel32137519c2008-11-30 19:12:49 +000057/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
Stefan Hajnocziadfe0782010-04-13 10:29:35 +010058#define BDRV_O_FLAGS BDRV_O_CACHE_WB
Federico Simoncelli661a0f72011-06-20 12:48:19 -040059#define BDRV_DEFAULT_CACHE "writeback"
aurel32137519c2008-11-30 19:12:49 +000060
bellardea2384d2004-08-01 21:59:26 +000061static void format_print(void *opaque, const char *name)
62{
63 printf(" %s", name);
64}
65
blueswir1d2c639d2009-01-24 18:19:25 +000066/* Please keep in synch with qemu-img.texi */
pbrook3f379ab2007-11-11 03:33:13 +000067static void help(void)
bellardea2384d2004-08-01 21:59:26 +000068{
Paolo Bonzinie00291c2010-02-04 16:49:56 +010069 const char *help_msg =
70 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
malc3f020d72010-02-08 12:04:56 +030071 "usage: qemu-img command [command options]\n"
72 "QEMU disk image utility\n"
73 "\n"
74 "Command syntax:\n"
Stuart Brady153859b2009-06-07 00:42:17 +010075#define DEF(option, callback, arg_string) \
76 " " arg_string "\n"
77#include "qemu-img-cmds.h"
78#undef DEF
79#undef GEN_DOCS
malc3f020d72010-02-08 12:04:56 +030080 "\n"
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"
Federico Simoncelli661a0f72011-06-20 12:48:19 -040084 " 'cache' is the cache mode used to write the output disk image, the valid\n"
Liu Yuan80ccf932012-04-20 17:10:56 +080085 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
86 " 'directsync' and 'unsafe' (default for convert)\n"
malc3f020d72010-02-08 12:04:56 +030087 " 'size' is the disk image size in bytes. Optional suffixes\n"
Kevin Wolf5e009842013-06-05 14:19:27 +020088 " '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"
malc3f020d72010-02-08 12:04:56 +030091 " '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"
95 " used format\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"
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200101 " '-p' show progress of command (only certain commands)\n"
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100102 " '-q' use Quiet mode - do not print any output (except errors)\n"
Peter Lieven11b66992013-10-24 12:07:05 +0200103 " '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n"
104 " contain only zeros for qemu-img to create a sparse image during\n"
105 " conversion. If the number of bytes is 0, the source will not be scanned for\n"
106 " unallocated or zero sectors, and the destination image will always be\n"
107 " fully allocated\n"
108 " images will always be fully allocated\n"
Benoît Canetc054b3f2012-09-05 13:09:02 +0200109 " '--output' takes the format in which the output must be done (human or json)\n"
Alexandre Derumierb2e10492013-09-02 19:07:24 +0100110 " '-n' skips the target volume creation (useful if the volume is created\n"
111 " prior to running qemu-img)\n"
malc3f020d72010-02-08 12:04:56 +0300112 "\n"
Kevin Wolf4534ff52012-05-11 16:07:02 +0200113 "Parameters to check subcommand:\n"
114 " '-r' tries to repair any inconsistencies that are found during the check.\n"
115 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
116 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
Stefan Weil0546b8c2012-08-10 22:03:25 +0200117 " hiding corruption that has already occurred.\n"
Kevin Wolf4534ff52012-05-11 16:07:02 +0200118 "\n"
malc3f020d72010-02-08 12:04:56 +0300119 "Parameters to snapshot subcommand:\n"
120 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
121 " '-a' applies a snapshot (revert disk to saved state)\n"
122 " '-c' creates a snapshot\n"
123 " '-d' deletes a snapshot\n"
Miroslav Rezaninad14ed182013-02-13 09:09:41 +0100124 " '-l' lists all snapshots in the given image\n"
125 "\n"
126 "Parameters to compare subcommand:\n"
127 " '-f' first image format\n"
128 " '-F' second image format\n"
129 " '-s' run in Strict mode - fail on different image size or sector allocation\n";
Paolo Bonzinie00291c2010-02-04 16:49:56 +0100130
131 printf("%s\nSupported formats:", help_msg);
bellardea2384d2004-08-01 21:59:26 +0000132 bdrv_iterate_format(format_print, NULL);
133 printf("\n");
134 exit(1);
135}
136
Stefan Weil7c30f652013-06-16 17:01:05 +0200137static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...)
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100138{
139 int ret = 0;
140 if (!quiet) {
141 va_list args;
142 va_start(args, fmt);
143 ret = vprintf(fmt, args);
144 va_end(args);
145 }
146 return ret;
147}
148
bellardea2384d2004-08-01 21:59:26 +0000149#if defined(WIN32)
150/* XXX: put correct support for win32 */
151static int read_password(char *buf, int buf_size)
152{
153 int c, i;
154 printf("Password: ");
155 fflush(stdout);
156 i = 0;
157 for(;;) {
158 c = getchar();
159 if (c == '\n')
160 break;
161 if (i < (buf_size - 1))
162 buf[i++] = c;
163 }
164 buf[i] = '\0';
165 return 0;
166}
167
168#else
169
170#include <termios.h>
171
172static struct termios oldtty;
173
174static void term_exit(void)
175{
176 tcsetattr (0, TCSANOW, &oldtty);
177}
178
179static void term_init(void)
180{
181 struct termios tty;
182
183 tcgetattr (0, &tty);
184 oldtty = tty;
185
186 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
187 |INLCR|IGNCR|ICRNL|IXON);
188 tty.c_oflag |= OPOST;
189 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
190 tty.c_cflag &= ~(CSIZE|PARENB);
191 tty.c_cflag |= CS8;
192 tty.c_cc[VMIN] = 1;
193 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +0000194
bellardea2384d2004-08-01 21:59:26 +0000195 tcsetattr (0, TCSANOW, &tty);
196
197 atexit(term_exit);
198}
199
pbrook3f379ab2007-11-11 03:33:13 +0000200static int read_password(char *buf, int buf_size)
bellardea2384d2004-08-01 21:59:26 +0000201{
202 uint8_t ch;
203 int i, ret;
204
205 printf("password: ");
206 fflush(stdout);
207 term_init();
208 i = 0;
209 for(;;) {
210 ret = read(0, &ch, 1);
211 if (ret == -1) {
212 if (errno == EAGAIN || errno == EINTR) {
213 continue;
214 } else {
215 ret = -1;
216 break;
217 }
218 } else if (ret == 0) {
219 ret = -1;
220 break;
221 } else {
222 if (ch == '\r') {
223 ret = 0;
224 break;
225 }
226 if (i < (buf_size - 1))
227 buf[i++] = ch;
228 }
229 }
230 term_exit();
231 buf[i] = '\0';
232 printf("\n");
233 return ret;
234}
235#endif
236
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100237static int print_block_option_help(const char *filename, const char *fmt)
238{
239 BlockDriver *drv, *proto_drv;
240 QEMUOptionParameter *create_options = NULL;
241
242 /* Find driver and parse its options */
243 drv = bdrv_find_format(fmt);
244 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100245 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100246 return 1;
247 }
248
Kevin Wolf98289622013-07-10 15:47:39 +0200249 proto_drv = bdrv_find_protocol(filename, true);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100250 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100251 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100252 return 1;
253 }
254
255 create_options = append_option_parameters(create_options,
256 drv->create_options);
257 create_options = append_option_parameters(create_options,
258 proto_drv->create_options);
259 print_option_help(create_options);
260 free_option_parameters(create_options);
261 return 0;
262}
263
bellard75c23802004-08-27 21:28:58 +0000264static BlockDriverState *bdrv_new_open(const char *filename,
Sheng Yang9bc378c2010-01-29 10:15:06 +0800265 const char *fmt,
Daniel P. Berrangef0536bb2012-09-10 12:11:31 +0100266 int flags,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100267 bool require_io,
268 bool quiet)
bellard75c23802004-08-27 21:28:58 +0000269{
270 BlockDriverState *bs;
271 BlockDriver *drv;
272 char password[256];
Max Reitz34b5d2c2013-09-05 14:45:29 +0200273 Error *local_err = NULL;
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100274 int ret;
bellard75c23802004-08-27 21:28:58 +0000275
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100276 bs = bdrv_new("image");
Kevin Wolfad717132010-12-16 15:37:41 +0100277
bellard75c23802004-08-27 21:28:58 +0000278 if (fmt) {
279 drv = bdrv_find_format(fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900280 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100281 error_report("Unknown file format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900282 goto fail;
283 }
bellard75c23802004-08-27 21:28:58 +0000284 } else {
285 drv = NULL;
286 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100287
Max Reitz34b5d2c2013-09-05 14:45:29 +0200288 ret = bdrv_open(bs, filename, NULL, flags, drv, &local_err);
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100289 if (ret < 0) {
Max Reitz34b5d2c2013-09-05 14:45:29 +0200290 error_report("Could not open '%s': %s", filename,
291 error_get_pretty(local_err));
292 error_free(local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900293 goto fail;
bellard75c23802004-08-27 21:28:58 +0000294 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100295
Daniel P. Berrangef0536bb2012-09-10 12:11:31 +0100296 if (bdrv_is_encrypted(bs) && require_io) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100297 qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900298 if (read_password(password, sizeof(password)) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100299 error_report("No password given");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900300 goto fail;
301 }
302 if (bdrv_set_key(bs, password) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100303 error_report("invalid password");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900304 goto fail;
305 }
bellard75c23802004-08-27 21:28:58 +0000306 }
307 return bs;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900308fail:
309 if (bs) {
Fam Zheng4f6fd342013-08-23 09:14:47 +0800310 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900311 }
312 return NULL;
bellard75c23802004-08-27 21:28:58 +0000313}
314
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900315static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
Jes Sorenseneec77d92010-12-07 17:44:34 +0100316 const char *base_filename,
317 const char *base_fmt)
Kevin Wolfefa84d42009-05-18 16:42:12 +0200318{
Kevin Wolfefa84d42009-05-18 16:42:12 +0200319 if (base_filename) {
320 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100321 error_report("Backing file not supported for file format '%s'",
322 fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900323 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200324 }
325 }
326 if (base_fmt) {
327 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100328 error_report("Backing file format not supported for file "
329 "format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900330 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200331 }
332 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900333 return 0;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200334}
335
bellardea2384d2004-08-01 21:59:26 +0000336static int img_create(int argc, char **argv)
337{
Luiz Capitulinoa9300912012-11-30 10:52:06 -0200338 int c;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100339 uint64_t img_size = -1;
bellardea2384d2004-08-01 21:59:26 +0000340 const char *fmt = "raw";
aliguori9230eaf2009-03-28 17:55:19 +0000341 const char *base_fmt = NULL;
bellardea2384d2004-08-01 21:59:26 +0000342 const char *filename;
343 const char *base_filename = NULL;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200344 char *options = NULL;
Luiz Capitulino9b375252012-11-30 10:52:05 -0200345 Error *local_err = NULL;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100346 bool quiet = false;
ths3b46e622007-09-17 08:09:54 +0000347
bellardea2384d2004-08-01 21:59:26 +0000348 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100349 c = getopt(argc, argv, "F:b:f:he6o:q");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100350 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000351 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100352 }
bellardea2384d2004-08-01 21:59:26 +0000353 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100354 case '?':
bellardea2384d2004-08-01 21:59:26 +0000355 case 'h':
356 help();
357 break;
aliguori9230eaf2009-03-28 17:55:19 +0000358 case 'F':
359 base_fmt = optarg;
360 break;
bellardea2384d2004-08-01 21:59:26 +0000361 case 'b':
362 base_filename = optarg;
363 break;
364 case 'f':
365 fmt = optarg;
366 break;
367 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200368 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100369 "encryption\' instead!");
370 return 1;
thsd8871c52007-10-24 16:11:42 +0000371 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200372 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100373 "compat6\' instead!");
374 return 1;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200375 case 'o':
376 options = optarg;
377 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100378 case 'q':
379 quiet = true;
380 break;
bellardea2384d2004-08-01 21:59:26 +0000381 }
382 }
aliguori9230eaf2009-03-28 17:55:19 +0000383
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900384 /* Get the filename */
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100385 if (optind >= argc) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900386 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100387 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900388 filename = argv[optind++];
389
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100390 /* Get image size, if specified */
391 if (optind < argc) {
Jes Sorensen70b4f4b2011-01-05 11:41:02 +0100392 int64_t sval;
Markus Armbrustere36b3692011-11-22 09:46:05 +0100393 char *end;
394 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
395 if (sval < 0 || *end) {
liguang79443392012-12-17 09:49:23 +0800396 if (sval == -ERANGE) {
397 error_report("Image size must be less than 8 EiB!");
398 } else {
399 error_report("Invalid image size specified! You may use k, M, "
Kevin Wolf5e009842013-06-05 14:19:27 +0200400 "G, T, P or E suffixes for ");
401 error_report("kilobytes, megabytes, gigabytes, terabytes, "
402 "petabytes and exabytes.");
liguang79443392012-12-17 09:49:23 +0800403 }
Luiz Capitulinoa9300912012-11-30 10:52:06 -0200404 return 1;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100405 }
406 img_size = (uint64_t)sval;
407 }
Kevin Wolffc11eb22013-08-05 10:53:04 +0200408 if (optind != argc) {
409 help();
410 }
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100411
Peter Maydellc8057f92012-08-02 13:45:54 +0100412 if (options && is_help_option(options)) {
Luiz Capitulinoa9300912012-11-30 10:52:06 -0200413 return print_block_option_help(filename, fmt);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100414 }
415
Luiz Capitulino9b375252012-11-30 10:52:05 -0200416 bdrv_img_create(filename, fmt, base_filename, base_fmt,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100417 options, img_size, BDRV_O_FLAGS, &local_err, quiet);
Luiz Capitulino9b375252012-11-30 10:52:05 -0200418 if (error_is_set(&local_err)) {
Max Reitzb70d8c22013-09-06 16:51:03 +0200419 error_report("%s: %s", filename, error_get_pretty(local_err));
Luiz Capitulino9b375252012-11-30 10:52:05 -0200420 error_free(local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900421 return 1;
422 }
Luiz Capitulinoa9300912012-11-30 10:52:06 -0200423
bellardea2384d2004-08-01 21:59:26 +0000424 return 0;
425}
426
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100427static void dump_json_image_check(ImageCheck *check, bool quiet)
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500428{
429 Error *errp = NULL;
430 QString *str;
431 QmpOutputVisitor *ov = qmp_output_visitor_new();
432 QObject *obj;
433 visit_type_ImageCheck(qmp_output_get_visitor(ov),
434 &check, NULL, &errp);
435 obj = qmp_output_get_qobject(ov);
436 str = qobject_to_json_pretty(obj);
437 assert(str != NULL);
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100438 qprintf(quiet, "%s\n", qstring_get_str(str));
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500439 qobject_decref(obj);
440 qmp_output_visitor_cleanup(ov);
441 QDECREF(str);
442}
443
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100444static void dump_human_image_check(ImageCheck *check, bool quiet)
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500445{
446 if (!(check->corruptions || check->leaks || check->check_errors)) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100447 qprintf(quiet, "No errors were found on the image.\n");
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500448 } else {
449 if (check->corruptions) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100450 qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
451 "Data may be corrupted, or further writes to the image "
452 "may corrupt it.\n",
453 check->corruptions);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500454 }
455
456 if (check->leaks) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100457 qprintf(quiet,
458 "\n%" PRId64 " leaked clusters were found on the image.\n"
459 "This means waste of disk space, but no harm to data.\n",
460 check->leaks);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500461 }
462
463 if (check->check_errors) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100464 qprintf(quiet,
465 "\n%" PRId64
466 " internal errors have occurred during the check.\n",
467 check->check_errors);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500468 }
469 }
470
471 if (check->total_clusters != 0 && check->allocated_clusters != 0) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100472 qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
473 "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
474 check->allocated_clusters, check->total_clusters,
475 check->allocated_clusters * 100.0 / check->total_clusters,
476 check->fragmented_clusters * 100.0 / check->allocated_clusters,
477 check->compressed_clusters * 100.0 /
478 check->allocated_clusters);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500479 }
480
481 if (check->image_end_offset) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100482 qprintf(quiet,
483 "Image end offset: %" PRId64 "\n", check->image_end_offset);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500484 }
485}
486
487static int collect_image_check(BlockDriverState *bs,
488 ImageCheck *check,
489 const char *filename,
490 const char *fmt,
491 int fix)
492{
493 int ret;
494 BdrvCheckResult result;
495
496 ret = bdrv_check(bs, &result, fix);
497 if (ret < 0) {
498 return ret;
499 }
500
501 check->filename = g_strdup(filename);
502 check->format = g_strdup(bdrv_get_format_name(bs));
503 check->check_errors = result.check_errors;
504 check->corruptions = result.corruptions;
505 check->has_corruptions = result.corruptions != 0;
506 check->leaks = result.leaks;
507 check->has_leaks = result.leaks != 0;
508 check->corruptions_fixed = result.corruptions_fixed;
509 check->has_corruptions_fixed = result.corruptions != 0;
510 check->leaks_fixed = result.leaks_fixed;
511 check->has_leaks_fixed = result.leaks != 0;
512 check->image_end_offset = result.image_end_offset;
513 check->has_image_end_offset = result.image_end_offset != 0;
514 check->total_clusters = result.bfi.total_clusters;
515 check->has_total_clusters = result.bfi.total_clusters != 0;
516 check->allocated_clusters = result.bfi.allocated_clusters;
517 check->has_allocated_clusters = result.bfi.allocated_clusters != 0;
518 check->fragmented_clusters = result.bfi.fragmented_clusters;
519 check->has_fragmented_clusters = result.bfi.fragmented_clusters != 0;
Stefan Hajnoczie6439d72013-02-07 17:15:04 +0100520 check->compressed_clusters = result.bfi.compressed_clusters;
521 check->has_compressed_clusters = result.bfi.compressed_clusters != 0;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500522
523 return 0;
524}
525
Kevin Wolfe076f332010-06-29 11:43:13 +0200526/*
527 * Checks an image for consistency. Exit codes:
528 *
529 * 0 - Check completed, image is good
530 * 1 - Check not completed because of internal errors
531 * 2 - Check completed, image is corrupted
532 * 3 - Check completed, image has leaked clusters, but is good otherwise
533 */
aliguori15859692009-04-21 23:11:53 +0000534static int img_check(int argc, char **argv)
535{
536 int c, ret;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500537 OutputFormat output_format = OFORMAT_HUMAN;
538 const char *filename, *fmt, *output;
aliguori15859692009-04-21 23:11:53 +0000539 BlockDriverState *bs;
Kevin Wolf4534ff52012-05-11 16:07:02 +0200540 int fix = 0;
Stefan Hajnoczi058f8f12012-08-09 13:05:56 +0100541 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500542 ImageCheck *check;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100543 bool quiet = false;
aliguori15859692009-04-21 23:11:53 +0000544
545 fmt = NULL;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500546 output = NULL;
aliguori15859692009-04-21 23:11:53 +0000547 for(;;) {
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500548 int option_index = 0;
549 static const struct option long_options[] = {
550 {"help", no_argument, 0, 'h'},
551 {"format", required_argument, 0, 'f'},
552 {"repair", no_argument, 0, 'r'},
553 {"output", required_argument, 0, OPTION_OUTPUT},
554 {0, 0, 0, 0}
555 };
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100556 c = getopt_long(argc, argv, "f:hr:q",
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500557 long_options, &option_index);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100558 if (c == -1) {
aliguori15859692009-04-21 23:11:53 +0000559 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100560 }
aliguori15859692009-04-21 23:11:53 +0000561 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100562 case '?':
aliguori15859692009-04-21 23:11:53 +0000563 case 'h':
564 help();
565 break;
566 case 'f':
567 fmt = optarg;
568 break;
Kevin Wolf4534ff52012-05-11 16:07:02 +0200569 case 'r':
570 flags |= BDRV_O_RDWR;
571
572 if (!strcmp(optarg, "leaks")) {
573 fix = BDRV_FIX_LEAKS;
574 } else if (!strcmp(optarg, "all")) {
575 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
576 } else {
577 help();
578 }
579 break;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500580 case OPTION_OUTPUT:
581 output = optarg;
582 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100583 case 'q':
584 quiet = true;
585 break;
aliguori15859692009-04-21 23:11:53 +0000586 }
587 }
Kevin Wolffc11eb22013-08-05 10:53:04 +0200588 if (optind != argc - 1) {
aliguori15859692009-04-21 23:11:53 +0000589 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100590 }
aliguori15859692009-04-21 23:11:53 +0000591 filename = argv[optind++];
592
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500593 if (output && !strcmp(output, "json")) {
594 output_format = OFORMAT_JSON;
595 } else if (output && !strcmp(output, "human")) {
596 output_format = OFORMAT_HUMAN;
597 } else if (output) {
598 error_report("--output must be used with human or json as argument.");
599 return 1;
600 }
601
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100602 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900603 if (!bs) {
604 return 1;
605 }
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500606
607 check = g_new0(ImageCheck, 1);
608 ret = collect_image_check(bs, check, filename, fmt, fix);
Kevin Wolfe076f332010-06-29 11:43:13 +0200609
610 if (ret == -ENOTSUP) {
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500611 if (output_format == OFORMAT_HUMAN) {
612 error_report("This image format does not support checks");
613 }
Peter Lievenfefddf92013-10-24 08:53:34 +0200614 ret = 63;
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500615 goto fail;
Kevin Wolfe076f332010-06-29 11:43:13 +0200616 }
617
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500618 if (check->corruptions_fixed || check->leaks_fixed) {
619 int corruptions_fixed, leaks_fixed;
620
621 leaks_fixed = check->leaks_fixed;
622 corruptions_fixed = check->corruptions_fixed;
623
624 if (output_format == OFORMAT_HUMAN) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100625 qprintf(quiet,
626 "The following inconsistencies were found and repaired:\n\n"
627 " %" PRId64 " leaked clusters\n"
628 " %" PRId64 " corruptions\n\n"
629 "Double checking the fixed image now...\n",
630 check->leaks_fixed,
631 check->corruptions_fixed);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500632 }
633
634 ret = collect_image_check(bs, check, filename, fmt, 0);
635
636 check->leaks_fixed = leaks_fixed;
637 check->corruptions_fixed = corruptions_fixed;
Kevin Wolfccf34712012-05-11 18:16:54 +0200638 }
639
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500640 switch (output_format) {
641 case OFORMAT_HUMAN:
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100642 dump_human_image_check(check, quiet);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500643 break;
644 case OFORMAT_JSON:
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100645 dump_json_image_check(check, quiet);
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500646 break;
647 }
648
649 if (ret || check->check_errors) {
650 ret = 1;
651 goto fail;
652 }
653
654 if (check->corruptions) {
655 ret = 2;
656 } else if (check->leaks) {
657 ret = 3;
Kevin Wolfe076f332010-06-29 11:43:13 +0200658 } else {
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500659 ret = 0;
aliguori15859692009-04-21 23:11:53 +0000660 }
661
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500662fail:
663 qapi_free_ImageCheck(check);
Fam Zheng4f6fd342013-08-23 09:14:47 +0800664 bdrv_unref(bs);
Kevin Wolfe076f332010-06-29 11:43:13 +0200665
Federico Simoncelli8599ea42013-01-28 06:59:47 -0500666 return ret;
aliguori15859692009-04-21 23:11:53 +0000667}
668
bellardea2384d2004-08-01 21:59:26 +0000669static int img_commit(int argc, char **argv)
670{
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400671 int c, ret, flags;
672 const char *filename, *fmt, *cache;
bellardea2384d2004-08-01 21:59:26 +0000673 BlockDriverState *bs;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100674 bool quiet = false;
bellardea2384d2004-08-01 21:59:26 +0000675
676 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400677 cache = BDRV_DEFAULT_CACHE;
bellardea2384d2004-08-01 21:59:26 +0000678 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100679 c = getopt(argc, argv, "f:ht:q");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100680 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000681 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100682 }
bellardea2384d2004-08-01 21:59:26 +0000683 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100684 case '?':
bellardea2384d2004-08-01 21:59:26 +0000685 case 'h':
686 help();
687 break;
688 case 'f':
689 fmt = optarg;
690 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400691 case 't':
692 cache = optarg;
693 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100694 case 'q':
695 quiet = true;
696 break;
bellardea2384d2004-08-01 21:59:26 +0000697 }
698 }
Kevin Wolffc11eb22013-08-05 10:53:04 +0200699 if (optind != argc - 1) {
bellardea2384d2004-08-01 21:59:26 +0000700 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100701 }
bellardea2384d2004-08-01 21:59:26 +0000702 filename = argv[optind++];
703
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400704 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +0100705 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400706 if (ret < 0) {
707 error_report("Invalid cache option: %s", cache);
708 return -1;
709 }
710
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100711 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900712 if (!bs) {
713 return 1;
714 }
bellardea2384d2004-08-01 21:59:26 +0000715 ret = bdrv_commit(bs);
716 switch(ret) {
717 case 0:
Miroslav Rezaninaf382d432013-02-13 09:09:40 +0100718 qprintf(quiet, "Image committed.\n");
bellardea2384d2004-08-01 21:59:26 +0000719 break;
720 case -ENOENT:
Jes Sorensen15654a62010-12-16 14:31:53 +0100721 error_report("No disk inserted");
bellardea2384d2004-08-01 21:59:26 +0000722 break;
723 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +0100724 error_report("Image is read-only");
bellardea2384d2004-08-01 21:59:26 +0000725 break;
726 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +0100727 error_report("Image is already committed");
bellardea2384d2004-08-01 21:59:26 +0000728 break;
729 default:
Jes Sorensen15654a62010-12-16 14:31:53 +0100730 error_report("Error while committing image");
bellardea2384d2004-08-01 21:59:26 +0000731 break;
732 }
733
Fam Zheng4f6fd342013-08-23 09:14:47 +0800734 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900735 if (ret) {
736 return 1;
737 }
bellardea2384d2004-08-01 21:59:26 +0000738 return 0;
739}
740
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400741/*
thsf58c7b32008-06-05 21:53:49 +0000742 * Returns true iff the first sector pointed to by 'buf' contains at least
743 * a non-NUL byte.
744 *
745 * 'pnum' is set to the number of sectors (including and immediately following
746 * the first one) that are known to be in the same allocated/unallocated state.
747 */
bellardea2384d2004-08-01 21:59:26 +0000748static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
749{
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000750 bool is_zero;
751 int i;
bellardea2384d2004-08-01 21:59:26 +0000752
753 if (n <= 0) {
754 *pnum = 0;
755 return 0;
756 }
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000757 is_zero = buffer_is_zero(buf, 512);
bellardea2384d2004-08-01 21:59:26 +0000758 for(i = 1; i < n; i++) {
759 buf += 512;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000760 if (is_zero != buffer_is_zero(buf, 512)) {
bellardea2384d2004-08-01 21:59:26 +0000761 break;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000762 }
bellardea2384d2004-08-01 21:59:26 +0000763 }
764 *pnum = i;
Stefan Hajnoczi1a6d39f2012-02-07 13:27:24 +0000765 return !is_zero;
bellardea2384d2004-08-01 21:59:26 +0000766}
767
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100768/*
Kevin Wolfa22f1232011-08-26 15:27:13 +0200769 * Like is_allocated_sectors, but if the buffer starts with a used sector,
770 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
771 * breaking up write requests for only small sparse areas.
772 */
773static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
774 int min)
775{
776 int ret;
777 int num_checked, num_used;
778
779 if (n < min) {
780 min = n;
781 }
782
783 ret = is_allocated_sectors(buf, n, pnum);
784 if (!ret) {
785 return ret;
786 }
787
788 num_used = *pnum;
789 buf += BDRV_SECTOR_SIZE * *pnum;
790 n -= *pnum;
791 num_checked = num_used;
792
793 while (n > 0) {
794 ret = is_allocated_sectors(buf, n, pnum);
795
796 buf += BDRV_SECTOR_SIZE * *pnum;
797 n -= *pnum;
798 num_checked += *pnum;
799 if (ret) {
800 num_used = num_checked;
801 } else if (*pnum >= min) {
802 break;
803 }
804 }
805
806 *pnum = num_used;
807 return 1;
808}
809
810/*
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100811 * Compares two buffers sector by sector. Returns 0 if the first sector of both
812 * buffers matches, non-zero otherwise.
813 *
814 * pnum is set to the number of sectors (including and immediately following
815 * the first one) that are known to have the same comparison result
816 */
817static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
818 int *pnum)
819{
820 int res, i;
821
822 if (n <= 0) {
823 *pnum = 0;
824 return 0;
825 }
826
827 res = !!memcmp(buf1, buf2, 512);
828 for(i = 1; i < n; i++) {
829 buf1 += 512;
830 buf2 += 512;
831
832 if (!!memcmp(buf1, buf2, 512) != res) {
833 break;
834 }
835 }
836
837 *pnum = i;
838 return res;
839}
840
Kevin Wolf80ee15a2009-09-15 12:30:43 +0200841#define IO_BUF_SIZE (2 * 1024 * 1024)
bellardea2384d2004-08-01 21:59:26 +0000842
Miroslav Rezaninad14ed182013-02-13 09:09:41 +0100843static int64_t sectors_to_bytes(int64_t sectors)
844{
845 return sectors << BDRV_SECTOR_BITS;
846}
847
848static int64_t sectors_to_process(int64_t total, int64_t from)
849{
850 return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
851}
852
853/*
854 * Check if passed sectors are empty (not allocated or contain only 0 bytes)
855 *
856 * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
857 * data and negative value on error.
858 *
859 * @param bs: Driver used for accessing file
860 * @param sect_num: Number of first sector to check
861 * @param sect_count: Number of sectors to check
862 * @param filename: Name of disk file we are checking (logging purpose)
863 * @param buffer: Allocated buffer for storing read data
864 * @param quiet: Flag for quiet mode
865 */
866static int check_empty_sectors(BlockDriverState *bs, int64_t sect_num,
867 int sect_count, const char *filename,
868 uint8_t *buffer, bool quiet)
869{
870 int pnum, ret = 0;
871 ret = bdrv_read(bs, sect_num, buffer, sect_count);
872 if (ret < 0) {
873 error_report("Error while reading offset %" PRId64 " of %s: %s",
874 sectors_to_bytes(sect_num), filename, strerror(-ret));
875 return ret;
876 }
877 ret = is_allocated_sectors(buffer, sect_count, &pnum);
878 if (ret || pnum != sect_count) {
879 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
880 sectors_to_bytes(ret ? sect_num : sect_num + pnum));
881 return 1;
882 }
883
884 return 0;
885}
886
887/*
888 * Compares two images. Exit codes:
889 *
890 * 0 - Images are identical
891 * 1 - Images differ
892 * >1 - Error occurred
893 */
894static int img_compare(int argc, char **argv)
895{
896 const char *fmt1 = NULL, *fmt2 = NULL, *filename1, *filename2;
897 BlockDriverState *bs1, *bs2;
898 int64_t total_sectors1, total_sectors2;
899 uint8_t *buf1 = NULL, *buf2 = NULL;
900 int pnum1, pnum2;
901 int allocated1, allocated2;
902 int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
903 bool progress = false, quiet = false, strict = false;
904 int64_t total_sectors;
905 int64_t sector_num = 0;
906 int64_t nb_sectors;
907 int c, pnum;
908 uint64_t bs_sectors;
909 uint64_t progress_base;
910
911 for (;;) {
912 c = getopt(argc, argv, "hpf:F:sq");
913 if (c == -1) {
914 break;
915 }
916 switch (c) {
917 case '?':
918 case 'h':
919 help();
920 break;
921 case 'f':
922 fmt1 = optarg;
923 break;
924 case 'F':
925 fmt2 = optarg;
926 break;
927 case 'p':
928 progress = true;
929 break;
930 case 'q':
931 quiet = true;
932 break;
933 case 's':
934 strict = true;
935 break;
936 }
937 }
938
939 /* Progress is not shown in Quiet mode */
940 if (quiet) {
941 progress = false;
942 }
943
944
Kevin Wolffc11eb22013-08-05 10:53:04 +0200945 if (optind != argc - 2) {
Miroslav Rezaninad14ed182013-02-13 09:09:41 +0100946 help();
947 }
948 filename1 = argv[optind++];
949 filename2 = argv[optind++];
950
951 /* Initialize before goto out */
952 qemu_progress_init(progress, 2.0);
953
954 bs1 = bdrv_new_open(filename1, fmt1, BDRV_O_FLAGS, true, quiet);
955 if (!bs1) {
956 error_report("Can't open file %s", filename1);
957 ret = 2;
958 goto out3;
959 }
960
961 bs2 = bdrv_new_open(filename2, fmt2, BDRV_O_FLAGS, true, quiet);
962 if (!bs2) {
963 error_report("Can't open file %s", filename2);
964 ret = 2;
965 goto out2;
966 }
967
968 buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
969 buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
970 bdrv_get_geometry(bs1, &bs_sectors);
971 total_sectors1 = bs_sectors;
972 bdrv_get_geometry(bs2, &bs_sectors);
973 total_sectors2 = bs_sectors;
974 total_sectors = MIN(total_sectors1, total_sectors2);
975 progress_base = MAX(total_sectors1, total_sectors2);
976
977 qemu_progress_print(0, 100);
978
979 if (strict && total_sectors1 != total_sectors2) {
980 ret = 1;
981 qprintf(quiet, "Strict mode: Image size mismatch!\n");
982 goto out;
983 }
984
985 for (;;) {
986 nb_sectors = sectors_to_process(total_sectors, sector_num);
987 if (nb_sectors <= 0) {
988 break;
989 }
990 allocated1 = bdrv_is_allocated_above(bs1, NULL, sector_num, nb_sectors,
991 &pnum1);
992 if (allocated1 < 0) {
993 ret = 3;
994 error_report("Sector allocation test failed for %s", filename1);
995 goto out;
996 }
997
998 allocated2 = bdrv_is_allocated_above(bs2, NULL, sector_num, nb_sectors,
999 &pnum2);
1000 if (allocated2 < 0) {
1001 ret = 3;
1002 error_report("Sector allocation test failed for %s", filename2);
1003 goto out;
1004 }
1005 nb_sectors = MIN(pnum1, pnum2);
1006
1007 if (allocated1 == allocated2) {
1008 if (allocated1) {
1009 ret = bdrv_read(bs1, sector_num, buf1, nb_sectors);
1010 if (ret < 0) {
1011 error_report("Error while reading offset %" PRId64 " of %s:"
1012 " %s", sectors_to_bytes(sector_num), filename1,
1013 strerror(-ret));
1014 ret = 4;
1015 goto out;
1016 }
1017 ret = bdrv_read(bs2, sector_num, buf2, nb_sectors);
1018 if (ret < 0) {
1019 error_report("Error while reading offset %" PRId64
1020 " of %s: %s", sectors_to_bytes(sector_num),
1021 filename2, strerror(-ret));
1022 ret = 4;
1023 goto out;
1024 }
1025 ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
1026 if (ret || pnum != nb_sectors) {
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001027 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1028 sectors_to_bytes(
1029 ret ? sector_num : sector_num + pnum));
Fam Zheng36452f12013-11-13 20:26:49 +08001030 ret = 1;
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001031 goto out;
1032 }
1033 }
1034 } else {
1035 if (strict) {
1036 ret = 1;
1037 qprintf(quiet, "Strict mode: Offset %" PRId64
1038 " allocation mismatch!\n",
1039 sectors_to_bytes(sector_num));
1040 goto out;
1041 }
1042
1043 if (allocated1) {
1044 ret = check_empty_sectors(bs1, sector_num, nb_sectors,
1045 filename1, buf1, quiet);
1046 } else {
1047 ret = check_empty_sectors(bs2, sector_num, nb_sectors,
1048 filename2, buf1, quiet);
1049 }
1050 if (ret) {
1051 if (ret < 0) {
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001052 error_report("Error while reading offset %" PRId64 ": %s",
1053 sectors_to_bytes(sector_num), strerror(-ret));
Fam Zheng36452f12013-11-13 20:26:49 +08001054 ret = 4;
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001055 }
1056 goto out;
1057 }
1058 }
1059 sector_num += nb_sectors;
1060 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1061 }
1062
1063 if (total_sectors1 != total_sectors2) {
1064 BlockDriverState *bs_over;
1065 int64_t total_sectors_over;
1066 const char *filename_over;
1067
1068 qprintf(quiet, "Warning: Image size mismatch!\n");
1069 if (total_sectors1 > total_sectors2) {
1070 total_sectors_over = total_sectors1;
1071 bs_over = bs1;
1072 filename_over = filename1;
1073 } else {
1074 total_sectors_over = total_sectors2;
1075 bs_over = bs2;
1076 filename_over = filename2;
1077 }
1078
1079 for (;;) {
1080 nb_sectors = sectors_to_process(total_sectors_over, sector_num);
1081 if (nb_sectors <= 0) {
1082 break;
1083 }
1084 ret = bdrv_is_allocated_above(bs_over, NULL, sector_num,
1085 nb_sectors, &pnum);
1086 if (ret < 0) {
1087 ret = 3;
1088 error_report("Sector allocation test failed for %s",
1089 filename_over);
1090 goto out;
1091
1092 }
1093 nb_sectors = pnum;
1094 if (ret) {
1095 ret = check_empty_sectors(bs_over, sector_num, nb_sectors,
1096 filename_over, buf1, quiet);
1097 if (ret) {
1098 if (ret < 0) {
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001099 error_report("Error while reading offset %" PRId64
1100 " of %s: %s", sectors_to_bytes(sector_num),
1101 filename_over, strerror(-ret));
Fam Zheng36452f12013-11-13 20:26:49 +08001102 ret = 4;
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001103 }
1104 goto out;
1105 }
1106 }
1107 sector_num += nb_sectors;
1108 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1109 }
1110 }
1111
1112 qprintf(quiet, "Images are identical.\n");
1113 ret = 0;
1114
1115out:
Fam Zheng4f6fd342013-08-23 09:14:47 +08001116 bdrv_unref(bs2);
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001117 qemu_vfree(buf1);
1118 qemu_vfree(buf2);
1119out2:
Fam Zheng4f6fd342013-08-23 09:14:47 +08001120 bdrv_unref(bs1);
Miroslav Rezaninad14ed182013-02-13 09:09:41 +01001121out3:
1122 qemu_progress_end();
1123 return ret;
1124}
1125
bellardea2384d2004-08-01 21:59:26 +00001126static int img_convert(int argc, char **argv)
1127{
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001128 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size,
1129 cluster_sectors, skip_create;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001130 int progress = 0, flags;
1131 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001132 BlockDriver *drv, *proto_drv;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001133 BlockDriverState **bs = NULL, *out_bs = NULL;
ths96b8f132007-12-17 01:35:20 +00001134 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
1135 uint64_t bs_sectors;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001136 uint8_t * buf = NULL;
bellardea2384d2004-08-01 21:59:26 +00001137 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +00001138 BlockDriverInfo bdi;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001139 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfa18953f2010-10-14 15:46:04 +02001140 QEMUOptionParameter *out_baseimg_param;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001141 char *options = NULL;
edison51ef6722010-09-21 19:58:41 -07001142 const char *snapshot_name = NULL;
Kevin Wolf1f710492012-10-12 14:29:18 +02001143 float local_progress = 0;
Kevin Wolfa22f1232011-08-26 15:27:13 +02001144 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001145 bool quiet = false;
Max Reitzcc84d902013-09-06 17:14:26 +02001146 Error *local_err = NULL;
bellardea2384d2004-08-01 21:59:26 +00001147
1148 fmt = NULL;
1149 out_fmt = "raw";
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001150 cache = "unsafe";
thsf58c7b32008-06-05 21:53:49 +00001151 out_baseimg = NULL;
Jes Sorenseneec77d92010-12-07 17:44:34 +01001152 compress = 0;
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001153 skip_create = 0;
bellardea2384d2004-08-01 21:59:26 +00001154 for(;;) {
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001155 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:qn");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001156 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001157 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001158 }
bellardea2384d2004-08-01 21:59:26 +00001159 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001160 case '?':
bellardea2384d2004-08-01 21:59:26 +00001161 case 'h':
1162 help();
1163 break;
1164 case 'f':
1165 fmt = optarg;
1166 break;
1167 case 'O':
1168 out_fmt = optarg;
1169 break;
thsf58c7b32008-06-05 21:53:49 +00001170 case 'B':
1171 out_baseimg = optarg;
1172 break;
bellardea2384d2004-08-01 21:59:26 +00001173 case 'c':
Jes Sorenseneec77d92010-12-07 17:44:34 +01001174 compress = 1;
bellardea2384d2004-08-01 21:59:26 +00001175 break;
1176 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +02001177 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +01001178 "encryption\' instead!");
1179 return 1;
thsec36ba12007-09-16 21:59:02 +00001180 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +02001181 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +01001182 "compat6\' instead!");
1183 return 1;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001184 case 'o':
1185 options = optarg;
1186 break;
edison51ef6722010-09-21 19:58:41 -07001187 case 's':
1188 snapshot_name = optarg;
1189 break;
Kevin Wolfa22f1232011-08-26 15:27:13 +02001190 case 'S':
1191 {
1192 int64_t sval;
Markus Armbrustere36b3692011-11-22 09:46:05 +01001193 char *end;
1194 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
1195 if (sval < 0 || *end) {
Kevin Wolfa22f1232011-08-26 15:27:13 +02001196 error_report("Invalid minimum zero buffer size for sparse output specified");
1197 return 1;
1198 }
1199
1200 min_sparse = sval / BDRV_SECTOR_SIZE;
1201 break;
1202 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001203 case 'p':
1204 progress = 1;
1205 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001206 case 't':
1207 cache = optarg;
1208 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001209 case 'q':
1210 quiet = true;
1211 break;
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001212 case 'n':
1213 skip_create = 1;
1214 break;
bellardea2384d2004-08-01 21:59:26 +00001215 }
1216 }
ths3b46e622007-09-17 08:09:54 +00001217
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001218 if (quiet) {
1219 progress = 0;
1220 }
1221
balrog926c2d22007-10-31 01:11:44 +00001222 bs_n = argc - optind - 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001223 if (bs_n < 1) {
1224 help();
1225 }
balrog926c2d22007-10-31 01:11:44 +00001226
1227 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +00001228
Charles Arnoldfa170c12012-05-11 10:57:54 -06001229 /* Initialize before goto out */
1230 qemu_progress_init(progress, 2.0);
1231
Peter Maydellc8057f92012-08-02 13:45:54 +01001232 if (options && is_help_option(options)) {
Jes Sorensen4ac8aac2010-12-06 15:25:38 +01001233 ret = print_block_option_help(out_filename, out_fmt);
1234 goto out;
1235 }
1236
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001237 if (bs_n > 1 && out_baseimg) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001238 error_report("-B makes no sense when concatenating multiple input "
1239 "images");
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001240 ret = -1;
1241 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001242 }
Dong Xu Wangf8111c22012-03-15 20:13:31 +08001243
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001244 qemu_progress_print(0, 100);
1245
Anthony Liguori7267c092011-08-20 22:09:37 -05001246 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
balrog926c2d22007-10-31 01:11:44 +00001247
1248 total_sectors = 0;
1249 for (bs_i = 0; bs_i < bs_n; bs_i++) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001250 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true,
1251 quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001252 if (!bs[bs_i]) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001253 error_report("Could not open '%s'", argv[optind + bs_i]);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001254 ret = -1;
1255 goto out;
1256 }
balrog926c2d22007-10-31 01:11:44 +00001257 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1258 total_sectors += bs_sectors;
1259 }
bellardea2384d2004-08-01 21:59:26 +00001260
edison51ef6722010-09-21 19:58:41 -07001261 if (snapshot_name != NULL) {
1262 if (bs_n > 1) {
Markus Armbruster6daf1942011-06-22 14:03:54 +02001263 error_report("No support for concatenating multiple snapshot");
edison51ef6722010-09-21 19:58:41 -07001264 ret = -1;
1265 goto out;
1266 }
1267 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
Markus Armbruster6daf1942011-06-22 14:03:54 +02001268 error_report("Failed to load snapshot");
edison51ef6722010-09-21 19:58:41 -07001269 ret = -1;
1270 goto out;
1271 }
1272 }
1273
Kevin Wolfefa84d42009-05-18 16:42:12 +02001274 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +00001275 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001276 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001277 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001278 ret = -1;
1279 goto out;
1280 }
balrog926c2d22007-10-31 01:11:44 +00001281
Kevin Wolf98289622013-07-10 15:47:39 +02001282 proto_drv = bdrv_find_protocol(out_filename, true);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001283 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001284 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001285 ret = -1;
1286 goto out;
1287 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001288
1289 create_options = append_option_parameters(create_options,
1290 drv->create_options);
1291 create_options = append_option_parameters(create_options,
1292 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +02001293
Kevin Wolfefa84d42009-05-18 16:42:12 +02001294 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001295 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001296 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001297 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001298 ret = -1;
1299 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001300 }
1301 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001302 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001303 }
1304
1305 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +01001306 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001307 if (ret < 0) {
1308 goto out;
1309 }
Kevin Wolfefa84d42009-05-18 16:42:12 +02001310
Kevin Wolfa18953f2010-10-14 15:46:04 +02001311 /* Get backing file name if -o backing_file was used */
1312 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
1313 if (out_baseimg_param) {
1314 out_baseimg = out_baseimg_param->value.s;
1315 }
1316
Kevin Wolfefa84d42009-05-18 16:42:12 +02001317 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +01001318 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +02001319 QEMUOptionParameter *encryption =
1320 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
Kevin Wolf41521fa2011-10-18 16:19:42 +02001321 QEMUOptionParameter *preallocation =
1322 get_option_parameter(param, BLOCK_OPT_PREALLOC);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001323
1324 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001325 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001326 ret = -1;
1327 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001328 }
1329
1330 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001331 error_report("Compression and encryption not supported at "
1332 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001333 ret = -1;
1334 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001335 }
Kevin Wolf41521fa2011-10-18 16:19:42 +02001336
1337 if (preallocation && preallocation->value.s
1338 && strcmp(preallocation->value.s, "off"))
1339 {
1340 error_report("Compression and preallocation not supported at "
1341 "the same time");
1342 ret = -1;
1343 goto out;
1344 }
Kevin Wolfefa84d42009-05-18 16:42:12 +02001345 }
1346
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001347 if (!skip_create) {
1348 /* Create the new image */
Max Reitzcc84d902013-09-06 17:14:26 +02001349 ret = bdrv_create(drv, out_filename, param, &local_err);
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001350 if (ret < 0) {
Max Reitzcc84d902013-09-06 17:14:26 +02001351 error_report("%s: error while converting %s: %s",
1352 out_filename, out_fmt, error_get_pretty(local_err));
1353 error_free(local_err);
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001354 goto out;
bellardea2384d2004-08-01 21:59:26 +00001355 }
1356 }
ths3b46e622007-09-17 08:09:54 +00001357
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001358 flags = BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01001359 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001360 if (ret < 0) {
1361 error_report("Invalid cache option: %s", cache);
1362 return -1;
1363 }
1364
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001365 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001366 if (!out_bs) {
1367 ret = -1;
1368 goto out;
1369 }
bellardea2384d2004-08-01 21:59:26 +00001370
balrog926c2d22007-10-31 01:11:44 +00001371 bs_i = 0;
1372 bs_offset = 0;
1373 bdrv_get_geometry(bs[0], &bs_sectors);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001374 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +00001375
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001376 if (skip_create) {
1377 int64_t output_length = bdrv_getlength(out_bs);
1378 if (output_length < 0) {
1379 error_report("unable to get output image length: %s\n",
1380 strerror(-output_length));
1381 ret = -1;
1382 goto out;
1383 } else if (output_length < total_sectors << BDRV_SECTOR_BITS) {
1384 error_report("output file is smaller than input file");
1385 ret = -1;
1386 goto out;
1387 }
1388 }
1389
Jes Sorenseneec77d92010-12-07 17:44:34 +01001390 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001391 ret = bdrv_get_info(out_bs, &bdi);
1392 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001393 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001394 goto out;
1395 }
bellardfaea38e2006-08-05 21:31:00 +00001396 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001397 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001398 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001399 ret = -1;
1400 goto out;
1401 }
bellardea2384d2004-08-01 21:59:26 +00001402 cluster_sectors = cluster_size >> 9;
1403 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001404
1405 nb_sectors = total_sectors;
Kevin Wolf1f710492012-10-12 14:29:18 +02001406 if (nb_sectors != 0) {
1407 local_progress = (float)100 /
1408 (nb_sectors / MIN(nb_sectors, cluster_sectors));
1409 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001410
bellardea2384d2004-08-01 21:59:26 +00001411 for(;;) {
balrog926c2d22007-10-31 01:11:44 +00001412 int64_t bs_num;
1413 int remainder;
1414 uint8_t *buf2;
1415
bellardea2384d2004-08-01 21:59:26 +00001416 nb_sectors = total_sectors - sector_num;
1417 if (nb_sectors <= 0)
1418 break;
1419 if (nb_sectors >= cluster_sectors)
1420 n = cluster_sectors;
1421 else
1422 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +00001423
1424 bs_num = sector_num - bs_offset;
1425 assert (bs_num >= 0);
1426 remainder = n;
1427 buf2 = buf;
1428 while (remainder > 0) {
1429 int nlow;
1430 while (bs_num == bs_sectors) {
1431 bs_i++;
1432 assert (bs_i < bs_n);
1433 bs_offset += bs_sectors;
1434 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1435 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +00001436 /* printf("changing part: sector_num=%" PRId64 ", "
1437 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
1438 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +00001439 }
1440 assert (bs_num < bs_sectors);
1441
1442 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
1443
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001444 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
1445 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001446 error_report("error while reading sector %" PRId64 ": %s",
1447 bs_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001448 goto out;
1449 }
balrog926c2d22007-10-31 01:11:44 +00001450
1451 buf2 += nlow * 512;
1452 bs_num += nlow;
1453
1454 remainder -= nlow;
1455 }
1456 assert (remainder == 0);
1457
Stefan Hajnoczi54f106d2013-04-15 17:17:33 +02001458 if (!buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)) {
1459 ret = bdrv_write_compressed(out_bs, sector_num, buf, n);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001460 if (ret != 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001461 error_report("error while compressing sector %" PRId64
1462 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001463 goto out;
1464 }
bellardea2384d2004-08-01 21:59:26 +00001465 }
1466 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001467 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001468 }
bellardfaea38e2006-08-05 21:31:00 +00001469 /* signal EOF to align */
1470 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +00001471 } else {
Peter Lieven11b66992013-10-24 12:07:05 +02001472 int has_zero_init = min_sparse ? bdrv_has_zero_init(out_bs) : 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02001473
thsf58c7b32008-06-05 21:53:49 +00001474 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001475 nb_sectors = total_sectors - sector_num;
Kevin Wolf1f710492012-10-12 14:29:18 +02001476 if (nb_sectors != 0) {
1477 local_progress = (float)100 /
1478 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
1479 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001480
bellardea2384d2004-08-01 21:59:26 +00001481 for(;;) {
1482 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001483 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +00001484 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001485 }
1486 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +00001487 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001488 } else {
bellardea2384d2004-08-01 21:59:26 +00001489 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001490 }
balrog926c2d22007-10-31 01:11:44 +00001491
1492 while (sector_num - bs_offset >= bs_sectors) {
1493 bs_i ++;
1494 assert (bs_i < bs_n);
1495 bs_offset += bs_sectors;
1496 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +00001497 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1498 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +00001499 sector_num, bs_i, bs_offset, bs_sectors); */
1500 }
1501
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001502 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +00001503 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001504 }
balrog926c2d22007-10-31 01:11:44 +00001505
Paolo Bonzinie4a86f82013-09-04 19:00:26 +02001506 /* If the output image is being created as a copy on write image,
1507 assume that sectors which are unallocated in the input image
1508 are present in both the output's and input's base images (no
1509 need to copy them). */
1510 if (out_baseimg) {
1511 ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1512 n, &n1);
1513 if (ret < 0) {
1514 error_report("error while reading metadata for sector "
1515 "%" PRId64 ": %s",
1516 sector_num - bs_offset, strerror(-ret));
1517 goto out;
aliguori93c65b42009-04-05 17:40:43 +00001518 }
Paolo Bonzinie4a86f82013-09-04 19:00:26 +02001519 if (!ret) {
1520 sector_num += n1;
1521 continue;
1522 }
1523 /* The next 'n1' sectors are allocated in the input image. Copy
1524 only those as they may be followed by unallocated sectors. */
1525 n = n1;
aliguori93c65b42009-04-05 17:40:43 +00001526 } else {
1527 n1 = n;
thsf58c7b32008-06-05 21:53:49 +00001528 }
1529
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001530 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1531 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001532 error_report("error while reading sector %" PRId64 ": %s",
1533 sector_num - bs_offset, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001534 goto out;
1535 }
bellardea2384d2004-08-01 21:59:26 +00001536 /* NOTE: at the same time we convert, we do not write zero
1537 sectors to have a chance to compress the image. Ideally, we
1538 should add a specific call to have the info to go faster */
1539 buf1 = buf;
1540 while (n > 0) {
Paolo Bonzini11212d82013-09-04 19:00:27 +02001541 if (!has_zero_init ||
Kevin Wolfa22f1232011-08-26 15:27:13 +02001542 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001543 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1544 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001545 error_report("error while writing sector %" PRId64
1546 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001547 goto out;
1548 }
bellardea2384d2004-08-01 21:59:26 +00001549 }
1550 sector_num += n1;
1551 n -= n1;
1552 buf1 += n1 * 512;
1553 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001554 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001555 }
1556 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001557out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001558 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001559 free_option_parameters(create_options);
1560 free_option_parameters(param);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001561 qemu_vfree(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001562 if (out_bs) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001563 bdrv_unref(out_bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001564 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001565 if (bs) {
1566 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1567 if (bs[bs_i]) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001568 bdrv_unref(bs[bs_i]);
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001569 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001570 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001571 g_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001572 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001573 if (ret) {
1574 return 1;
1575 }
bellardea2384d2004-08-01 21:59:26 +00001576 return 0;
1577}
1578
bellard57d1a2b2004-08-03 21:15:11 +00001579
bellardfaea38e2006-08-05 21:31:00 +00001580static void dump_snapshots(BlockDriverState *bs)
1581{
1582 QEMUSnapshotInfo *sn_tab, *sn;
1583 int nb_sns, i;
bellardfaea38e2006-08-05 21:31:00 +00001584
1585 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1586 if (nb_sns <= 0)
1587 return;
1588 printf("Snapshot list:\n");
Wenchao Xia5b917042013-05-25 11:09:45 +08001589 bdrv_snapshot_dump(fprintf, stdout, NULL);
1590 printf("\n");
bellardfaea38e2006-08-05 21:31:00 +00001591 for(i = 0; i < nb_sns; i++) {
1592 sn = &sn_tab[i];
Wenchao Xia5b917042013-05-25 11:09:45 +08001593 bdrv_snapshot_dump(fprintf, stdout, sn);
1594 printf("\n");
bellardfaea38e2006-08-05 21:31:00 +00001595 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001596 g_free(sn_tab);
bellardfaea38e2006-08-05 21:31:00 +00001597}
1598
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001599static void dump_json_image_info_list(ImageInfoList *list)
1600{
1601 Error *errp = NULL;
1602 QString *str;
1603 QmpOutputVisitor *ov = qmp_output_visitor_new();
1604 QObject *obj;
1605 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1606 &list, NULL, &errp);
1607 obj = qmp_output_get_qobject(ov);
1608 str = qobject_to_json_pretty(obj);
1609 assert(str != NULL);
1610 printf("%s\n", qstring_get_str(str));
1611 qobject_decref(obj);
1612 qmp_output_visitor_cleanup(ov);
1613 QDECREF(str);
1614}
1615
Benoît Canetc054b3f2012-09-05 13:09:02 +02001616static void dump_json_image_info(ImageInfo *info)
1617{
1618 Error *errp = NULL;
1619 QString *str;
1620 QmpOutputVisitor *ov = qmp_output_visitor_new();
1621 QObject *obj;
1622 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1623 &info, NULL, &errp);
1624 obj = qmp_output_get_qobject(ov);
1625 str = qobject_to_json_pretty(obj);
1626 assert(str != NULL);
1627 printf("%s\n", qstring_get_str(str));
1628 qobject_decref(obj);
1629 qmp_output_visitor_cleanup(ov);
1630 QDECREF(str);
1631}
1632
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001633static void dump_human_image_info_list(ImageInfoList *list)
1634{
1635 ImageInfoList *elem;
1636 bool delim = false;
1637
1638 for (elem = list; elem; elem = elem->next) {
1639 if (delim) {
1640 printf("\n");
1641 }
1642 delim = true;
1643
Wenchao Xia5b917042013-05-25 11:09:45 +08001644 bdrv_image_info_dump(fprintf, stdout, elem->value);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001645 }
1646}
1647
1648static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1649{
1650 return strcmp(a, b) == 0;
1651}
1652
1653/**
1654 * Open an image file chain and return an ImageInfoList
1655 *
1656 * @filename: topmost image filename
1657 * @fmt: topmost image format (may be NULL to autodetect)
1658 * @chain: true - enumerate entire backing file chain
1659 * false - only topmost image file
1660 *
1661 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1662 * image file. If there was an error a message will have been printed to
1663 * stderr.
1664 */
1665static ImageInfoList *collect_image_info_list(const char *filename,
1666 const char *fmt,
1667 bool chain)
1668{
1669 ImageInfoList *head = NULL;
1670 ImageInfoList **last = &head;
1671 GHashTable *filenames;
Wenchao Xia43526ec2013-06-06 12:27:58 +08001672 Error *err = NULL;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001673
1674 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1675
1676 while (filename) {
1677 BlockDriverState *bs;
1678 ImageInfo *info;
1679 ImageInfoList *elem;
1680
1681 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1682 error_report("Backing file '%s' creates an infinite loop.",
1683 filename);
1684 goto err;
1685 }
1686 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1687
1688 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001689 false, false);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001690 if (!bs) {
1691 goto err;
1692 }
1693
Wenchao Xia43526ec2013-06-06 12:27:58 +08001694 bdrv_query_image_info(bs, &info, &err);
1695 if (error_is_set(&err)) {
1696 error_report("%s", error_get_pretty(err));
1697 error_free(err);
1698 goto err;
Wenchao Xiafb0ed452013-06-06 12:27:57 +08001699 }
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001700
1701 elem = g_new0(ImageInfoList, 1);
1702 elem->value = info;
1703 *last = elem;
1704 last = &elem->next;
1705
Fam Zheng4f6fd342013-08-23 09:14:47 +08001706 bdrv_unref(bs);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001707
1708 filename = fmt = NULL;
1709 if (chain) {
1710 if (info->has_full_backing_filename) {
1711 filename = info->full_backing_filename;
1712 } else if (info->has_backing_filename) {
1713 filename = info->backing_filename;
1714 }
1715 if (info->has_backing_filename_format) {
1716 fmt = info->backing_filename_format;
1717 }
1718 }
1719 }
1720 g_hash_table_destroy(filenames);
1721 return head;
1722
1723err:
1724 qapi_free_ImageInfoList(head);
1725 g_hash_table_destroy(filenames);
1726 return NULL;
1727}
1728
Benoît Canetc054b3f2012-09-05 13:09:02 +02001729static int img_info(int argc, char **argv)
1730{
1731 int c;
1732 OutputFormat output_format = OFORMAT_HUMAN;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001733 bool chain = false;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001734 const char *filename, *fmt, *output;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001735 ImageInfoList *list;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001736
bellardea2384d2004-08-01 21:59:26 +00001737 fmt = NULL;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001738 output = NULL;
bellardea2384d2004-08-01 21:59:26 +00001739 for(;;) {
Benoît Canetc054b3f2012-09-05 13:09:02 +02001740 int option_index = 0;
1741 static const struct option long_options[] = {
1742 {"help", no_argument, 0, 'h'},
1743 {"format", required_argument, 0, 'f'},
1744 {"output", required_argument, 0, OPTION_OUTPUT},
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001745 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
Benoît Canetc054b3f2012-09-05 13:09:02 +02001746 {0, 0, 0, 0}
1747 };
1748 c = getopt_long(argc, argv, "f:h",
1749 long_options, &option_index);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001750 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001751 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001752 }
bellardea2384d2004-08-01 21:59:26 +00001753 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001754 case '?':
bellardea2384d2004-08-01 21:59:26 +00001755 case 'h':
1756 help();
1757 break;
1758 case 'f':
1759 fmt = optarg;
1760 break;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001761 case OPTION_OUTPUT:
1762 output = optarg;
1763 break;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001764 case OPTION_BACKING_CHAIN:
1765 chain = true;
1766 break;
bellardea2384d2004-08-01 21:59:26 +00001767 }
1768 }
Kevin Wolffc11eb22013-08-05 10:53:04 +02001769 if (optind != argc - 1) {
bellardea2384d2004-08-01 21:59:26 +00001770 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001771 }
bellardea2384d2004-08-01 21:59:26 +00001772 filename = argv[optind++];
1773
Benoît Canetc054b3f2012-09-05 13:09:02 +02001774 if (output && !strcmp(output, "json")) {
1775 output_format = OFORMAT_JSON;
1776 } else if (output && !strcmp(output, "human")) {
1777 output_format = OFORMAT_HUMAN;
1778 } else if (output) {
1779 error_report("--output must be used with human or json as argument.");
1780 return 1;
1781 }
1782
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001783 list = collect_image_info_list(filename, fmt, chain);
1784 if (!list) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001785 return 1;
1786 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001787
Benoît Canetc054b3f2012-09-05 13:09:02 +02001788 switch (output_format) {
1789 case OFORMAT_HUMAN:
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001790 dump_human_image_info_list(list);
Benoît Canetc054b3f2012-09-05 13:09:02 +02001791 break;
1792 case OFORMAT_JSON:
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001793 if (chain) {
1794 dump_json_image_info_list(list);
1795 } else {
1796 dump_json_image_info(list->value);
1797 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001798 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001799 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001800
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001801 qapi_free_ImageInfoList(list);
bellardea2384d2004-08-01 21:59:26 +00001802 return 0;
1803}
1804
Paolo Bonzini4c93a13b2013-09-04 19:00:33 +02001805
1806typedef struct MapEntry {
1807 int flags;
1808 int depth;
1809 int64_t start;
1810 int64_t length;
1811 int64_t offset;
1812 BlockDriverState *bs;
1813} MapEntry;
1814
1815static void dump_map_entry(OutputFormat output_format, MapEntry *e,
1816 MapEntry *next)
1817{
1818 switch (output_format) {
1819 case OFORMAT_HUMAN:
1820 if ((e->flags & BDRV_BLOCK_DATA) &&
1821 !(e->flags & BDRV_BLOCK_OFFSET_VALID)) {
1822 error_report("File contains external, encrypted or compressed clusters.");
1823 exit(1);
1824 }
1825 if ((e->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) == BDRV_BLOCK_DATA) {
1826 printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
1827 e->start, e->length, e->offset, e->bs->filename);
1828 }
1829 /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
1830 * Modify the flags here to allow more coalescing.
1831 */
1832 if (next &&
1833 (next->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) != BDRV_BLOCK_DATA) {
1834 next->flags &= ~BDRV_BLOCK_DATA;
1835 next->flags |= BDRV_BLOCK_ZERO;
1836 }
1837 break;
1838 case OFORMAT_JSON:
1839 printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": %d,"
1840 " \"zero\": %s, \"data\": %s",
1841 (e->start == 0 ? "[" : ",\n"),
1842 e->start, e->length, e->depth,
1843 (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false",
1844 (e->flags & BDRV_BLOCK_DATA) ? "true" : "false");
1845 if (e->flags & BDRV_BLOCK_OFFSET_VALID) {
Paolo Bonzinic745bfb2013-09-11 18:47:52 +02001846 printf(", \"offset\": %"PRId64"", e->offset);
Paolo Bonzini4c93a13b2013-09-04 19:00:33 +02001847 }
1848 putchar('}');
1849
1850 if (!next) {
1851 printf("]\n");
1852 }
1853 break;
1854 }
1855}
1856
1857static int get_block_status(BlockDriverState *bs, int64_t sector_num,
1858 int nb_sectors, MapEntry *e)
1859{
1860 int64_t ret;
1861 int depth;
1862
1863 /* As an optimization, we could cache the current range of unallocated
1864 * clusters in each file of the chain, and avoid querying the same
1865 * range repeatedly.
1866 */
1867
1868 depth = 0;
1869 for (;;) {
1870 ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors);
1871 if (ret < 0) {
1872 return ret;
1873 }
1874 assert(nb_sectors);
1875 if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
1876 break;
1877 }
1878 bs = bs->backing_hd;
1879 if (bs == NULL) {
1880 ret = 0;
1881 break;
1882 }
1883
1884 depth++;
1885 }
1886
1887 e->start = sector_num * BDRV_SECTOR_SIZE;
1888 e->length = nb_sectors * BDRV_SECTOR_SIZE;
1889 e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK;
1890 e->offset = ret & BDRV_BLOCK_OFFSET_MASK;
1891 e->depth = depth;
1892 e->bs = bs;
1893 return 0;
1894}
1895
1896static int img_map(int argc, char **argv)
1897{
1898 int c;
1899 OutputFormat output_format = OFORMAT_HUMAN;
1900 BlockDriverState *bs;
1901 const char *filename, *fmt, *output;
1902 int64_t length;
1903 MapEntry curr = { .length = 0 }, next;
1904 int ret = 0;
1905
1906 fmt = NULL;
1907 output = NULL;
1908 for (;;) {
1909 int option_index = 0;
1910 static const struct option long_options[] = {
1911 {"help", no_argument, 0, 'h'},
1912 {"format", required_argument, 0, 'f'},
1913 {"output", required_argument, 0, OPTION_OUTPUT},
1914 {0, 0, 0, 0}
1915 };
1916 c = getopt_long(argc, argv, "f:h",
1917 long_options, &option_index);
1918 if (c == -1) {
1919 break;
1920 }
1921 switch (c) {
1922 case '?':
1923 case 'h':
1924 help();
1925 break;
1926 case 'f':
1927 fmt = optarg;
1928 break;
1929 case OPTION_OUTPUT:
1930 output = optarg;
1931 break;
1932 }
1933 }
1934 if (optind >= argc) {
1935 help();
1936 }
1937 filename = argv[optind++];
1938
1939 if (output && !strcmp(output, "json")) {
1940 output_format = OFORMAT_JSON;
1941 } else if (output && !strcmp(output, "human")) {
1942 output_format = OFORMAT_HUMAN;
1943 } else if (output) {
1944 error_report("--output must be used with human or json as argument.");
1945 return 1;
1946 }
1947
1948 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS, true, false);
1949 if (!bs) {
1950 return 1;
1951 }
1952
1953 if (output_format == OFORMAT_HUMAN) {
1954 printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
1955 }
1956
1957 length = bdrv_getlength(bs);
1958 while (curr.start + curr.length < length) {
1959 int64_t nsectors_left;
1960 int64_t sector_num;
1961 int n;
1962
1963 sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
1964
1965 /* Probe up to 1 GiB at a time. */
1966 nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
1967 n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
1968 ret = get_block_status(bs, sector_num, n, &next);
1969
1970 if (ret < 0) {
1971 error_report("Could not read file metadata: %s", strerror(-ret));
1972 goto out;
1973 }
1974
1975 if (curr.length != 0 && curr.flags == next.flags &&
1976 curr.depth == next.depth &&
1977 ((curr.flags & BDRV_BLOCK_OFFSET_VALID) == 0 ||
1978 curr.offset + curr.length == next.offset)) {
1979 curr.length += next.length;
1980 continue;
1981 }
1982
1983 if (curr.length > 0) {
1984 dump_map_entry(output_format, &curr, &next);
1985 }
1986 curr = next;
1987 }
1988
1989 dump_map_entry(output_format, &curr, NULL);
1990
1991out:
1992 bdrv_unref(bs);
1993 return ret < 0;
1994}
1995
aliguorif7b4a942009-01-07 17:40:15 +00001996#define SNAPSHOT_LIST 1
1997#define SNAPSHOT_CREATE 2
1998#define SNAPSHOT_APPLY 3
1999#define SNAPSHOT_DELETE 4
2000
Stuart Brady153859b2009-06-07 00:42:17 +01002001static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00002002{
2003 BlockDriverState *bs;
2004 QEMUSnapshotInfo sn;
2005 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002006 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00002007 int action = 0;
2008 qemu_timeval tv;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002009 bool quiet = false;
Wenchao Xiaa89d89d2013-09-11 14:04:33 +08002010 Error *err = NULL;
aliguorif7b4a942009-01-07 17:40:15 +00002011
Kevin Wolf710da702011-01-10 12:33:02 +01002012 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00002013 /* Parse commandline parameters */
2014 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002015 c = getopt(argc, argv, "la:c:d:hq");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002016 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00002017 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002018 }
aliguorif7b4a942009-01-07 17:40:15 +00002019 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002020 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00002021 case 'h':
2022 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002023 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002024 case 'l':
2025 if (action) {
2026 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002027 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002028 }
2029 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02002030 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00002031 break;
2032 case 'a':
2033 if (action) {
2034 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002035 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002036 }
2037 action = SNAPSHOT_APPLY;
2038 snapshot_name = optarg;
2039 break;
2040 case 'c':
2041 if (action) {
2042 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002043 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002044 }
2045 action = SNAPSHOT_CREATE;
2046 snapshot_name = optarg;
2047 break;
2048 case 'd':
2049 if (action) {
2050 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002051 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002052 }
2053 action = SNAPSHOT_DELETE;
2054 snapshot_name = optarg;
2055 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002056 case 'q':
2057 quiet = true;
2058 break;
aliguorif7b4a942009-01-07 17:40:15 +00002059 }
2060 }
2061
Kevin Wolffc11eb22013-08-05 10:53:04 +02002062 if (optind != argc - 1) {
aliguorif7b4a942009-01-07 17:40:15 +00002063 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002064 }
aliguorif7b4a942009-01-07 17:40:15 +00002065 filename = argv[optind++];
2066
2067 /* Open the image */
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002068 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002069 if (!bs) {
2070 return 1;
2071 }
aliguorif7b4a942009-01-07 17:40:15 +00002072
2073 /* Perform the requested action */
2074 switch(action) {
2075 case SNAPSHOT_LIST:
2076 dump_snapshots(bs);
2077 break;
2078
2079 case SNAPSHOT_CREATE:
2080 memset(&sn, 0, sizeof(sn));
2081 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
2082
2083 qemu_gettimeofday(&tv);
2084 sn.date_sec = tv.tv_sec;
2085 sn.date_nsec = tv.tv_usec * 1000;
2086
2087 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002088 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002089 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00002090 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002091 }
aliguorif7b4a942009-01-07 17:40:15 +00002092 break;
2093
2094 case SNAPSHOT_APPLY:
2095 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002096 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002097 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00002098 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002099 }
aliguorif7b4a942009-01-07 17:40:15 +00002100 break;
2101
2102 case SNAPSHOT_DELETE:
Wenchao Xiaa89d89d2013-09-11 14:04:33 +08002103 bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
2104 if (error_is_set(&err)) {
2105 error_report("Could not delete snapshot '%s': (%s)",
2106 snapshot_name, error_get_pretty(err));
2107 error_free(err);
2108 ret = 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002109 }
aliguorif7b4a942009-01-07 17:40:15 +00002110 break;
2111 }
2112
2113 /* Cleanup */
Fam Zheng4f6fd342013-08-23 09:14:47 +08002114 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002115 if (ret) {
2116 return 1;
2117 }
Stuart Brady153859b2009-06-07 00:42:17 +01002118 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002119}
2120
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002121static int img_rebase(int argc, char **argv)
2122{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002123 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01002124 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002125 char *filename;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002126 const char *fmt, *cache, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002127 int c, flags, ret;
2128 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002129 int progress = 0;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002130 bool quiet = false;
Max Reitz34b5d2c2013-09-05 14:45:29 +02002131 Error *local_err = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002132
2133 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01002134 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002135 cache = BDRV_DEFAULT_CACHE;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002136 out_baseimg = NULL;
2137 out_basefmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002138 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002139 c = getopt(argc, argv, "uhf:F:b:pt:q");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002140 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002141 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002142 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002143 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002144 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002145 case 'h':
2146 help();
2147 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01002148 case 'f':
2149 fmt = optarg;
2150 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002151 case 'F':
2152 out_basefmt = optarg;
2153 break;
2154 case 'b':
2155 out_baseimg = optarg;
2156 break;
2157 case 'u':
2158 unsafe = 1;
2159 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002160 case 'p':
2161 progress = 1;
2162 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002163 case 't':
2164 cache = optarg;
2165 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002166 case 'q':
2167 quiet = true;
2168 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002169 }
2170 }
2171
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002172 if (quiet) {
2173 progress = 0;
2174 }
2175
Kevin Wolffc11eb22013-08-05 10:53:04 +02002176 if ((optind != argc - 1) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002177 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002178 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002179 filename = argv[optind++];
2180
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002181 qemu_progress_init(progress, 2.0);
2182 qemu_progress_print(0, 100);
2183
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002184 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01002185 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002186 if (ret < 0) {
2187 error_report("Invalid cache option: %s", cache);
2188 return -1;
2189 }
2190
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002191 /*
2192 * Open the images.
2193 *
2194 * Ignore the old backing file for unsafe rebase in case we want to correct
2195 * the reference to a renamed or moved backing file.
2196 */
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002197 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002198 if (!bs) {
2199 return 1;
2200 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002201
2202 /* Find the right drivers for the backing files */
2203 old_backing_drv = NULL;
2204 new_backing_drv = NULL;
2205
2206 if (!unsafe && bs->backing_format[0] != '\0') {
2207 old_backing_drv = bdrv_find_format(bs->backing_format);
2208 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002209 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002210 ret = -1;
2211 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002212 }
2213 }
2214
2215 if (out_basefmt != NULL) {
2216 new_backing_drv = bdrv_find_format(out_basefmt);
2217 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002218 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002219 ret = -1;
2220 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002221 }
2222 }
2223
2224 /* For safe rebasing we need to compare old and new backing file */
2225 if (unsafe) {
2226 /* Make the compiler happy */
2227 bs_old_backing = NULL;
2228 bs_new_backing = NULL;
2229 } else {
2230 char backing_name[1024];
2231
2232 bs_old_backing = bdrv_new("old_backing");
2233 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01002234 ret = bdrv_open(bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
Max Reitz34b5d2c2013-09-05 14:45:29 +02002235 old_backing_drv, &local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002236 if (ret) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02002237 error_report("Could not open old backing file '%s': %s",
2238 backing_name, error_get_pretty(local_err));
2239 error_free(local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002240 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002241 }
Alex Bligha6166732012-10-16 13:46:18 +01002242 if (out_baseimg[0]) {
2243 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01002244 ret = bdrv_open(bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
Max Reitz34b5d2c2013-09-05 14:45:29 +02002245 new_backing_drv, &local_err);
Alex Bligha6166732012-10-16 13:46:18 +01002246 if (ret) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02002247 error_report("Could not open new backing file '%s': %s",
2248 out_baseimg, error_get_pretty(local_err));
2249 error_free(local_err);
Alex Bligha6166732012-10-16 13:46:18 +01002250 goto out;
2251 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002252 }
2253 }
2254
2255 /*
2256 * Check each unallocated cluster in the COW file. If it is unallocated,
2257 * accesses go to the backing file. We must therefore compare this cluster
2258 * in the old and new backing file, and if they differ we need to copy it
2259 * from the old backing file into the COW file.
2260 *
2261 * If qemu-img crashes during this step, no harm is done. The content of
2262 * the image is the same as the original one at any time.
2263 */
2264 if (!unsafe) {
2265 uint64_t num_sectors;
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002266 uint64_t old_backing_num_sectors;
Alex Bligha6166732012-10-16 13:46:18 +01002267 uint64_t new_backing_num_sectors = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002268 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02002269 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08002270 uint8_t * buf_old;
2271 uint8_t * buf_new;
Kevin Wolf1f710492012-10-12 14:29:18 +02002272 float local_progress = 0;
TeLeMand6771bf2010-02-08 16:20:00 +08002273
Kevin Wolfbb1c0592011-08-08 14:09:12 +02002274 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
2275 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002276
2277 bdrv_get_geometry(bs, &num_sectors);
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002278 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
Alex Bligha6166732012-10-16 13:46:18 +01002279 if (bs_new_backing) {
2280 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
2281 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002282
Kevin Wolf1f710492012-10-12 14:29:18 +02002283 if (num_sectors != 0) {
2284 local_progress = (float)100 /
2285 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2286 }
2287
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002288 for (sector = 0; sector < num_sectors; sector += n) {
2289
2290 /* How many sectors can we handle with the next read? */
2291 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2292 n = (IO_BUF_SIZE / 512);
2293 } else {
2294 n = num_sectors - sector;
2295 }
2296
2297 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02002298 ret = bdrv_is_allocated(bs, sector, n, &n);
Paolo Bonzinid6636402013-09-04 19:00:25 +02002299 if (ret < 0) {
2300 error_report("error while reading image metadata: %s",
2301 strerror(-ret));
2302 goto out;
2303 }
Kevin Wolfcc60e322010-04-29 14:47:48 +02002304 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002305 continue;
2306 }
2307
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002308 /*
2309 * Read old and new backing file and take into consideration that
2310 * backing files may be smaller than the COW image.
2311 */
2312 if (sector >= old_backing_num_sectors) {
2313 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2314 } else {
2315 if (sector + n > old_backing_num_sectors) {
2316 n = old_backing_num_sectors - sector;
2317 }
2318
2319 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
2320 if (ret < 0) {
2321 error_report("error while reading from old backing file");
2322 goto out;
2323 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002324 }
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002325
Alex Bligha6166732012-10-16 13:46:18 +01002326 if (sector >= new_backing_num_sectors || !bs_new_backing) {
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002327 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2328 } else {
2329 if (sector + n > new_backing_num_sectors) {
2330 n = new_backing_num_sectors - sector;
2331 }
2332
2333 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
2334 if (ret < 0) {
2335 error_report("error while reading from new backing file");
2336 goto out;
2337 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002338 }
2339
2340 /* If they differ, we need to write to the COW file */
2341 uint64_t written = 0;
2342
2343 while (written < n) {
2344 int pnum;
2345
2346 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01002347 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002348 {
2349 ret = bdrv_write(bs, sector + written,
2350 buf_old + written * 512, pnum);
2351 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002352 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002353 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002354 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002355 }
2356 }
2357
2358 written += pnum;
2359 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002360 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002361 }
TeLeMand6771bf2010-02-08 16:20:00 +08002362
Kevin Wolfbb1c0592011-08-08 14:09:12 +02002363 qemu_vfree(buf_old);
2364 qemu_vfree(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002365 }
2366
2367 /*
2368 * Change the backing file. All clusters that are different from the old
2369 * backing file are overwritten in the COW file now, so the visible content
2370 * doesn't change when we switch the backing file.
2371 */
Alex Bligha6166732012-10-16 13:46:18 +01002372 if (out_baseimg && *out_baseimg) {
2373 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2374 } else {
2375 ret = bdrv_change_backing_file(bs, NULL, NULL);
2376 }
2377
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002378 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002379 error_report("Could not change the backing file to '%s': No "
2380 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002381 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002382 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002383 out_baseimg, strerror(-ret));
2384 }
2385
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002386 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002387 /*
2388 * TODO At this point it is possible to check if any clusters that are
2389 * allocated in the COW file are the same in the backing file. If so, they
2390 * could be dropped from the COW file. Don't do this before switching the
2391 * backing file, in case of a crash this would lead to corruption.
2392 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002393out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002394 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002395 /* Cleanup */
2396 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002397 if (bs_old_backing != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002398 bdrv_unref(bs_old_backing);
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002399 }
2400 if (bs_new_backing != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002401 bdrv_unref(bs_new_backing);
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002402 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002403 }
2404
Fam Zheng4f6fd342013-08-23 09:14:47 +08002405 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002406 if (ret) {
2407 return 1;
2408 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002409 return 0;
2410}
2411
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002412static int img_resize(int argc, char **argv)
2413{
2414 int c, ret, relative;
2415 const char *filename, *fmt, *size;
2416 int64_t n, total_size;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002417 bool quiet = false;
Jes Sorensen2a819982010-12-06 17:08:31 +01002418 BlockDriverState *bs = NULL;
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002419 QemuOpts *param;
2420 static QemuOptsList resize_options = {
2421 .name = "resize_options",
2422 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2423 .desc = {
2424 {
2425 .name = BLOCK_OPT_SIZE,
2426 .type = QEMU_OPT_SIZE,
2427 .help = "Virtual disk size"
2428 }, {
2429 /* end of list */
2430 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002431 },
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002432 };
2433
Kevin Wolfe80fec72011-04-29 10:58:12 +02002434 /* Remove size from argv manually so that negative numbers are not treated
2435 * as options by getopt. */
2436 if (argc < 3) {
2437 help();
2438 return 1;
2439 }
2440
2441 size = argv[--argc];
2442
2443 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002444 fmt = NULL;
2445 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002446 c = getopt(argc, argv, "f:hq");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002447 if (c == -1) {
2448 break;
2449 }
2450 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002451 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002452 case 'h':
2453 help();
2454 break;
2455 case 'f':
2456 fmt = optarg;
2457 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002458 case 'q':
2459 quiet = true;
2460 break;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002461 }
2462 }
Kevin Wolffc11eb22013-08-05 10:53:04 +02002463 if (optind != argc - 1) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002464 help();
2465 }
2466 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002467
2468 /* Choose grow, shrink, or absolute resize mode */
2469 switch (size[0]) {
2470 case '+':
2471 relative = 1;
2472 size++;
2473 break;
2474 case '-':
2475 relative = -1;
2476 size++;
2477 break;
2478 default:
2479 relative = 0;
2480 break;
2481 }
2482
2483 /* Parse size */
Dong Xu Wange478b442012-12-06 14:47:22 +08002484 param = qemu_opts_create_nofail(&resize_options);
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002485 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002486 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01002487 ret = -1;
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002488 qemu_opts_del(param);
Jes Sorensen2a819982010-12-06 17:08:31 +01002489 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002490 }
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002491 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2492 qemu_opts_del(param);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002493
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002494 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002495 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01002496 ret = -1;
2497 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002498 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002499
2500 if (relative) {
2501 total_size = bdrv_getlength(bs) + n * relative;
2502 } else {
2503 total_size = n;
2504 }
2505 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002506 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002507 ret = -1;
2508 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002509 }
2510
2511 ret = bdrv_truncate(bs, total_size);
2512 switch (ret) {
2513 case 0:
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002514 qprintf(quiet, "Image resized.\n");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002515 break;
2516 case -ENOTSUP:
Kevin Wolf259b2172012-03-06 12:44:45 +01002517 error_report("This image does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002518 break;
2519 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01002520 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002521 break;
2522 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01002523 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002524 break;
2525 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002526out:
Jes Sorensen2a819982010-12-06 17:08:31 +01002527 if (bs) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002528 bdrv_unref(bs);
Jes Sorensen2a819982010-12-06 17:08:31 +01002529 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002530 if (ret) {
2531 return 1;
2532 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002533 return 0;
2534}
2535
Max Reitz6f176b42013-09-03 10:09:50 +02002536static int img_amend(int argc, char **argv)
2537{
2538 int c, ret = 0;
2539 char *options = NULL;
2540 QEMUOptionParameter *create_options = NULL, *options_param = NULL;
2541 const char *fmt = NULL, *filename;
2542 bool quiet = false;
2543 BlockDriverState *bs = NULL;
2544
2545 for (;;) {
2546 c = getopt(argc, argv, "hqf:o:");
2547 if (c == -1) {
2548 break;
2549 }
2550
2551 switch (c) {
2552 case 'h':
2553 case '?':
2554 help();
2555 break;
2556 case 'o':
2557 options = optarg;
2558 break;
2559 case 'f':
2560 fmt = optarg;
2561 break;
2562 case 'q':
2563 quiet = true;
2564 break;
2565 }
2566 }
2567
2568 if (optind != argc - 1) {
2569 help();
2570 }
2571
2572 if (!options) {
2573 help();
2574 }
2575
2576 filename = argv[argc - 1];
2577
2578 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
2579 if (!bs) {
2580 error_report("Could not open image '%s'", filename);
2581 ret = -1;
2582 goto out;
2583 }
2584
2585 fmt = bs->drv->format_name;
2586
2587 if (is_help_option(options)) {
2588 ret = print_block_option_help(filename, fmt);
2589 goto out;
2590 }
2591
2592 create_options = append_option_parameters(create_options,
2593 bs->drv->create_options);
2594 options_param = parse_option_parameters(options, create_options,
2595 options_param);
2596 if (options_param == NULL) {
2597 error_report("Invalid options for file format '%s'", fmt);
2598 ret = -1;
2599 goto out;
2600 }
2601
2602 ret = bdrv_amend_options(bs, options_param);
2603 if (ret < 0) {
2604 error_report("Error while amending options: %s", strerror(-ret));
2605 goto out;
2606 }
2607
2608out:
2609 if (bs) {
2610 bdrv_unref(bs);
2611 }
2612 free_option_parameters(create_options);
2613 free_option_parameters(options_param);
2614 if (ret) {
2615 return 1;
2616 }
2617 return 0;
2618}
2619
Anthony Liguoric227f092009-10-01 16:12:16 -05002620static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01002621#define DEF(option, callback, arg_string) \
2622 { option, callback },
2623#include "qemu-img-cmds.h"
2624#undef DEF
2625#undef GEN_DOCS
2626 { NULL, NULL, },
2627};
2628
bellardea2384d2004-08-01 21:59:26 +00002629int main(int argc, char **argv)
2630{
Anthony Liguoric227f092009-10-01 16:12:16 -05002631 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01002632 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00002633
MORITA Kazutaka526eda12013-07-23 17:30:11 +09002634#ifdef CONFIG_POSIX
2635 signal(SIGPIPE, SIG_IGN);
2636#endif
2637
Kevin Wolf53f76e52010-12-16 15:10:32 +01002638 error_set_progname(argv[0]);
2639
Paolo Bonzini2592c592012-11-03 18:10:17 +01002640 qemu_init_main_loop();
bellardea2384d2004-08-01 21:59:26 +00002641 bdrv_init();
2642 if (argc < 2)
2643 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002644 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00002645 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01002646
2647 /* find the command */
2648 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2649 if (!strcmp(cmdname, cmd->name)) {
2650 return cmd->handler(argc, argv);
2651 }
bellardea2384d2004-08-01 21:59:26 +00002652 }
Stuart Brady153859b2009-06-07 00:42:17 +01002653
2654 /* not found */
2655 help();
bellardea2384d2004-08-01 21:59:26 +00002656 return 0;
2657}