blob: 685c566d223c6c61281495a7debbefa0705642a3 [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 }
Wenchao Xia7b4c4782013-12-04 17:10:54 +08001267
1268 bdrv_snapshot_load_tmp_by_id_or_name(bs[0], snapshot_name, &local_err);
1269 if (error_is_set(&local_err)) {
1270 error_report("Failed to load snapshot: %s",
1271 error_get_pretty(local_err));
1272 error_free(local_err);
edison51ef6722010-09-21 19:58:41 -07001273 ret = -1;
1274 goto out;
1275 }
1276 }
1277
Kevin Wolfefa84d42009-05-18 16:42:12 +02001278 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +00001279 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001280 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001281 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001282 ret = -1;
1283 goto out;
1284 }
balrog926c2d22007-10-31 01:11:44 +00001285
Kevin Wolf98289622013-07-10 15:47:39 +02001286 proto_drv = bdrv_find_protocol(out_filename, true);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001287 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001288 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001289 ret = -1;
1290 goto out;
1291 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001292
1293 create_options = append_option_parameters(create_options,
1294 drv->create_options);
1295 create_options = append_option_parameters(create_options,
1296 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +02001297
Kevin Wolfefa84d42009-05-18 16:42:12 +02001298 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001299 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001300 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001301 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001302 ret = -1;
1303 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001304 }
1305 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +09001306 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001307 }
1308
1309 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +01001310 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001311 if (ret < 0) {
1312 goto out;
1313 }
Kevin Wolfefa84d42009-05-18 16:42:12 +02001314
Kevin Wolfa18953f2010-10-14 15:46:04 +02001315 /* Get backing file name if -o backing_file was used */
1316 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
1317 if (out_baseimg_param) {
1318 out_baseimg = out_baseimg_param->value.s;
1319 }
1320
Kevin Wolfefa84d42009-05-18 16:42:12 +02001321 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +01001322 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +02001323 QEMUOptionParameter *encryption =
1324 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
Kevin Wolf41521fa2011-10-18 16:19:42 +02001325 QEMUOptionParameter *preallocation =
1326 get_option_parameter(param, BLOCK_OPT_PREALLOC);
Kevin Wolfefa84d42009-05-18 16:42:12 +02001327
1328 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001329 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001330 ret = -1;
1331 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001332 }
1333
1334 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001335 error_report("Compression and encryption not supported at "
1336 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001337 ret = -1;
1338 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +02001339 }
Kevin Wolf41521fa2011-10-18 16:19:42 +02001340
1341 if (preallocation && preallocation->value.s
1342 && strcmp(preallocation->value.s, "off"))
1343 {
1344 error_report("Compression and preallocation not supported at "
1345 "the same time");
1346 ret = -1;
1347 goto out;
1348 }
Kevin Wolfefa84d42009-05-18 16:42:12 +02001349 }
1350
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001351 if (!skip_create) {
1352 /* Create the new image */
Max Reitzcc84d902013-09-06 17:14:26 +02001353 ret = bdrv_create(drv, out_filename, param, &local_err);
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001354 if (ret < 0) {
Max Reitzcc84d902013-09-06 17:14:26 +02001355 error_report("%s: error while converting %s: %s",
1356 out_filename, out_fmt, error_get_pretty(local_err));
1357 error_free(local_err);
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001358 goto out;
bellardea2384d2004-08-01 21:59:26 +00001359 }
1360 }
ths3b46e622007-09-17 08:09:54 +00001361
Peter Lieven5a37b602013-10-24 12:07:06 +02001362 flags = min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01001363 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001364 if (ret < 0) {
1365 error_report("Invalid cache option: %s", cache);
1366 return -1;
1367 }
1368
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001369 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001370 if (!out_bs) {
1371 ret = -1;
1372 goto out;
1373 }
bellardea2384d2004-08-01 21:59:26 +00001374
balrog926c2d22007-10-31 01:11:44 +00001375 bs_i = 0;
1376 bs_offset = 0;
1377 bdrv_get_geometry(bs[0], &bs_sectors);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001378 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +00001379
Alexandre Derumierb2e10492013-09-02 19:07:24 +01001380 if (skip_create) {
1381 int64_t output_length = bdrv_getlength(out_bs);
1382 if (output_length < 0) {
1383 error_report("unable to get output image length: %s\n",
1384 strerror(-output_length));
1385 ret = -1;
1386 goto out;
1387 } else if (output_length < total_sectors << BDRV_SECTOR_BITS) {
1388 error_report("output file is smaller than input file");
1389 ret = -1;
1390 goto out;
1391 }
1392 }
1393
Jes Sorenseneec77d92010-12-07 17:44:34 +01001394 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001395 ret = bdrv_get_info(out_bs, &bdi);
1396 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001397 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001398 goto out;
1399 }
bellardfaea38e2006-08-05 21:31:00 +00001400 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001401 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001402 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001403 ret = -1;
1404 goto out;
1405 }
bellardea2384d2004-08-01 21:59:26 +00001406 cluster_sectors = cluster_size >> 9;
1407 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001408
1409 nb_sectors = total_sectors;
Kevin Wolf1f710492012-10-12 14:29:18 +02001410 if (nb_sectors != 0) {
1411 local_progress = (float)100 /
1412 (nb_sectors / MIN(nb_sectors, cluster_sectors));
1413 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001414
bellardea2384d2004-08-01 21:59:26 +00001415 for(;;) {
balrog926c2d22007-10-31 01:11:44 +00001416 int64_t bs_num;
1417 int remainder;
1418 uint8_t *buf2;
1419
bellardea2384d2004-08-01 21:59:26 +00001420 nb_sectors = total_sectors - sector_num;
1421 if (nb_sectors <= 0)
1422 break;
1423 if (nb_sectors >= cluster_sectors)
1424 n = cluster_sectors;
1425 else
1426 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +00001427
1428 bs_num = sector_num - bs_offset;
1429 assert (bs_num >= 0);
1430 remainder = n;
1431 buf2 = buf;
1432 while (remainder > 0) {
1433 int nlow;
1434 while (bs_num == bs_sectors) {
1435 bs_i++;
1436 assert (bs_i < bs_n);
1437 bs_offset += bs_sectors;
1438 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1439 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +00001440 /* printf("changing part: sector_num=%" PRId64 ", "
1441 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
1442 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +00001443 }
1444 assert (bs_num < bs_sectors);
1445
1446 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
1447
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001448 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
1449 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001450 error_report("error while reading sector %" PRId64 ": %s",
1451 bs_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001452 goto out;
1453 }
balrog926c2d22007-10-31 01:11:44 +00001454
1455 buf2 += nlow * 512;
1456 bs_num += nlow;
1457
1458 remainder -= nlow;
1459 }
1460 assert (remainder == 0);
1461
Stefan Hajnoczi54f106d2013-04-15 17:17:33 +02001462 if (!buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)) {
1463 ret = bdrv_write_compressed(out_bs, sector_num, buf, n);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001464 if (ret != 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001465 error_report("error while compressing sector %" PRId64
1466 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001467 goto out;
1468 }
bellardea2384d2004-08-01 21:59:26 +00001469 }
1470 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001471 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001472 }
bellardfaea38e2006-08-05 21:31:00 +00001473 /* signal EOF to align */
1474 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +00001475 } else {
Peter Lieven11b66992013-10-24 12:07:05 +02001476 int has_zero_init = min_sparse ? bdrv_has_zero_init(out_bs) : 0;
Kevin Wolff2feebb2010-04-14 17:30:35 +02001477
Peter Lieven5a37b602013-10-24 12:07:06 +02001478 if (!has_zero_init && bdrv_can_write_zeroes_with_unmap(out_bs)) {
1479 ret = bdrv_make_zero(out_bs, BDRV_REQ_MAY_UNMAP);
1480 if (ret < 0) {
1481 goto out;
1482 }
1483 has_zero_init = 1;
1484 }
1485
thsf58c7b32008-06-05 21:53:49 +00001486 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001487 nb_sectors = total_sectors - sector_num;
Kevin Wolf1f710492012-10-12 14:29:18 +02001488 if (nb_sectors != 0) {
1489 local_progress = (float)100 /
1490 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
1491 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001492
bellardea2384d2004-08-01 21:59:26 +00001493 for(;;) {
1494 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001495 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +00001496 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001497 }
1498 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +00001499 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001500 } else {
bellardea2384d2004-08-01 21:59:26 +00001501 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001502 }
balrog926c2d22007-10-31 01:11:44 +00001503
1504 while (sector_num - bs_offset >= bs_sectors) {
1505 bs_i ++;
1506 assert (bs_i < bs_n);
1507 bs_offset += bs_sectors;
1508 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +00001509 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1510 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +00001511 sector_num, bs_i, bs_offset, bs_sectors); */
1512 }
1513
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001514 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +00001515 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001516 }
balrog926c2d22007-10-31 01:11:44 +00001517
Paolo Bonzinie4a86f82013-09-04 19:00:26 +02001518 /* If the output image is being created as a copy on write image,
1519 assume that sectors which are unallocated in the input image
1520 are present in both the output's and input's base images (no
1521 need to copy them). */
1522 if (out_baseimg) {
1523 ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1524 n, &n1);
1525 if (ret < 0) {
1526 error_report("error while reading metadata for sector "
1527 "%" PRId64 ": %s",
1528 sector_num - bs_offset, strerror(-ret));
1529 goto out;
aliguori93c65b42009-04-05 17:40:43 +00001530 }
Paolo Bonzinie4a86f82013-09-04 19:00:26 +02001531 if (!ret) {
1532 sector_num += n1;
1533 continue;
1534 }
1535 /* The next 'n1' sectors are allocated in the input image. Copy
1536 only those as they may be followed by unallocated sectors. */
1537 n = n1;
aliguori93c65b42009-04-05 17:40:43 +00001538 } else {
1539 n1 = n;
thsf58c7b32008-06-05 21:53:49 +00001540 }
1541
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001542 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1543 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001544 error_report("error while reading sector %" PRId64 ": %s",
1545 sector_num - bs_offset, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001546 goto out;
1547 }
bellardea2384d2004-08-01 21:59:26 +00001548 /* NOTE: at the same time we convert, we do not write zero
1549 sectors to have a chance to compress the image. Ideally, we
1550 should add a specific call to have the info to go faster */
1551 buf1 = buf;
1552 while (n > 0) {
Paolo Bonzini11212d82013-09-04 19:00:27 +02001553 if (!has_zero_init ||
Kevin Wolfa22f1232011-08-26 15:27:13 +02001554 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001555 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1556 if (ret < 0) {
Stefan Hajnoczi3fba9d82011-08-17 17:41:09 +01001557 error_report("error while writing sector %" PRId64
1558 ": %s", sector_num, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001559 goto out;
1560 }
bellardea2384d2004-08-01 21:59:26 +00001561 }
1562 sector_num += n1;
1563 n -= n1;
1564 buf1 += n1 * 512;
1565 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001566 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001567 }
1568 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001569out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001570 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001571 free_option_parameters(create_options);
1572 free_option_parameters(param);
Kevin Wolfbb1c0592011-08-08 14:09:12 +02001573 qemu_vfree(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001574 if (out_bs) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001575 bdrv_unref(out_bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001576 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001577 if (bs) {
1578 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1579 if (bs[bs_i]) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08001580 bdrv_unref(bs[bs_i]);
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001581 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001582 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001583 g_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001584 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001585 if (ret) {
1586 return 1;
1587 }
bellardea2384d2004-08-01 21:59:26 +00001588 return 0;
1589}
1590
bellard57d1a2b2004-08-03 21:15:11 +00001591
bellardfaea38e2006-08-05 21:31:00 +00001592static void dump_snapshots(BlockDriverState *bs)
1593{
1594 QEMUSnapshotInfo *sn_tab, *sn;
1595 int nb_sns, i;
bellardfaea38e2006-08-05 21:31:00 +00001596
1597 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1598 if (nb_sns <= 0)
1599 return;
1600 printf("Snapshot list:\n");
Wenchao Xia5b917042013-05-25 11:09:45 +08001601 bdrv_snapshot_dump(fprintf, stdout, NULL);
1602 printf("\n");
bellardfaea38e2006-08-05 21:31:00 +00001603 for(i = 0; i < nb_sns; i++) {
1604 sn = &sn_tab[i];
Wenchao Xia5b917042013-05-25 11:09:45 +08001605 bdrv_snapshot_dump(fprintf, stdout, sn);
1606 printf("\n");
bellardfaea38e2006-08-05 21:31:00 +00001607 }
Anthony Liguori7267c092011-08-20 22:09:37 -05001608 g_free(sn_tab);
bellardfaea38e2006-08-05 21:31:00 +00001609}
1610
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001611static void dump_json_image_info_list(ImageInfoList *list)
1612{
1613 Error *errp = NULL;
1614 QString *str;
1615 QmpOutputVisitor *ov = qmp_output_visitor_new();
1616 QObject *obj;
1617 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1618 &list, NULL, &errp);
1619 obj = qmp_output_get_qobject(ov);
1620 str = qobject_to_json_pretty(obj);
1621 assert(str != NULL);
1622 printf("%s\n", qstring_get_str(str));
1623 qobject_decref(obj);
1624 qmp_output_visitor_cleanup(ov);
1625 QDECREF(str);
1626}
1627
Benoît Canetc054b3f2012-09-05 13:09:02 +02001628static void dump_json_image_info(ImageInfo *info)
1629{
1630 Error *errp = NULL;
1631 QString *str;
1632 QmpOutputVisitor *ov = qmp_output_visitor_new();
1633 QObject *obj;
1634 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1635 &info, NULL, &errp);
1636 obj = qmp_output_get_qobject(ov);
1637 str = qobject_to_json_pretty(obj);
1638 assert(str != NULL);
1639 printf("%s\n", qstring_get_str(str));
1640 qobject_decref(obj);
1641 qmp_output_visitor_cleanup(ov);
1642 QDECREF(str);
1643}
1644
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001645static void dump_human_image_info_list(ImageInfoList *list)
1646{
1647 ImageInfoList *elem;
1648 bool delim = false;
1649
1650 for (elem = list; elem; elem = elem->next) {
1651 if (delim) {
1652 printf("\n");
1653 }
1654 delim = true;
1655
Wenchao Xia5b917042013-05-25 11:09:45 +08001656 bdrv_image_info_dump(fprintf, stdout, elem->value);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001657 }
1658}
1659
1660static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1661{
1662 return strcmp(a, b) == 0;
1663}
1664
1665/**
1666 * Open an image file chain and return an ImageInfoList
1667 *
1668 * @filename: topmost image filename
1669 * @fmt: topmost image format (may be NULL to autodetect)
1670 * @chain: true - enumerate entire backing file chain
1671 * false - only topmost image file
1672 *
1673 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1674 * image file. If there was an error a message will have been printed to
1675 * stderr.
1676 */
1677static ImageInfoList *collect_image_info_list(const char *filename,
1678 const char *fmt,
1679 bool chain)
1680{
1681 ImageInfoList *head = NULL;
1682 ImageInfoList **last = &head;
1683 GHashTable *filenames;
Wenchao Xia43526ec2013-06-06 12:27:58 +08001684 Error *err = NULL;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001685
1686 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1687
1688 while (filename) {
1689 BlockDriverState *bs;
1690 ImageInfo *info;
1691 ImageInfoList *elem;
1692
1693 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1694 error_report("Backing file '%s' creates an infinite loop.",
1695 filename);
1696 goto err;
1697 }
1698 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1699
1700 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01001701 false, false);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001702 if (!bs) {
1703 goto err;
1704 }
1705
Wenchao Xia43526ec2013-06-06 12:27:58 +08001706 bdrv_query_image_info(bs, &info, &err);
1707 if (error_is_set(&err)) {
1708 error_report("%s", error_get_pretty(err));
1709 error_free(err);
1710 goto err;
Wenchao Xiafb0ed452013-06-06 12:27:57 +08001711 }
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001712
1713 elem = g_new0(ImageInfoList, 1);
1714 elem->value = info;
1715 *last = elem;
1716 last = &elem->next;
1717
Fam Zheng4f6fd342013-08-23 09:14:47 +08001718 bdrv_unref(bs);
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001719
1720 filename = fmt = NULL;
1721 if (chain) {
1722 if (info->has_full_backing_filename) {
1723 filename = info->full_backing_filename;
1724 } else if (info->has_backing_filename) {
1725 filename = info->backing_filename;
1726 }
1727 if (info->has_backing_filename_format) {
1728 fmt = info->backing_filename_format;
1729 }
1730 }
1731 }
1732 g_hash_table_destroy(filenames);
1733 return head;
1734
1735err:
1736 qapi_free_ImageInfoList(head);
1737 g_hash_table_destroy(filenames);
1738 return NULL;
1739}
1740
Benoît Canetc054b3f2012-09-05 13:09:02 +02001741static int img_info(int argc, char **argv)
1742{
1743 int c;
1744 OutputFormat output_format = OFORMAT_HUMAN;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001745 bool chain = false;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001746 const char *filename, *fmt, *output;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001747 ImageInfoList *list;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001748
bellardea2384d2004-08-01 21:59:26 +00001749 fmt = NULL;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001750 output = NULL;
bellardea2384d2004-08-01 21:59:26 +00001751 for(;;) {
Benoît Canetc054b3f2012-09-05 13:09:02 +02001752 int option_index = 0;
1753 static const struct option long_options[] = {
1754 {"help", no_argument, 0, 'h'},
1755 {"format", required_argument, 0, 'f'},
1756 {"output", required_argument, 0, OPTION_OUTPUT},
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001757 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
Benoît Canetc054b3f2012-09-05 13:09:02 +02001758 {0, 0, 0, 0}
1759 };
1760 c = getopt_long(argc, argv, "f:h",
1761 long_options, &option_index);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001762 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001763 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001764 }
bellardea2384d2004-08-01 21:59:26 +00001765 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001766 case '?':
bellardea2384d2004-08-01 21:59:26 +00001767 case 'h':
1768 help();
1769 break;
1770 case 'f':
1771 fmt = optarg;
1772 break;
Benoît Canetc054b3f2012-09-05 13:09:02 +02001773 case OPTION_OUTPUT:
1774 output = optarg;
1775 break;
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001776 case OPTION_BACKING_CHAIN:
1777 chain = true;
1778 break;
bellardea2384d2004-08-01 21:59:26 +00001779 }
1780 }
Kevin Wolffc11eb22013-08-05 10:53:04 +02001781 if (optind != argc - 1) {
bellardea2384d2004-08-01 21:59:26 +00001782 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001783 }
bellardea2384d2004-08-01 21:59:26 +00001784 filename = argv[optind++];
1785
Benoît Canetc054b3f2012-09-05 13:09:02 +02001786 if (output && !strcmp(output, "json")) {
1787 output_format = OFORMAT_JSON;
1788 } else if (output && !strcmp(output, "human")) {
1789 output_format = OFORMAT_HUMAN;
1790 } else if (output) {
1791 error_report("--output must be used with human or json as argument.");
1792 return 1;
1793 }
1794
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001795 list = collect_image_info_list(filename, fmt, chain);
1796 if (!list) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001797 return 1;
1798 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001799
Benoît Canetc054b3f2012-09-05 13:09:02 +02001800 switch (output_format) {
1801 case OFORMAT_HUMAN:
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001802 dump_human_image_info_list(list);
Benoît Canetc054b3f2012-09-05 13:09:02 +02001803 break;
1804 case OFORMAT_JSON:
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001805 if (chain) {
1806 dump_json_image_info_list(list);
1807 } else {
1808 dump_json_image_info(list->value);
1809 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001810 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001811 }
Benoît Canetc054b3f2012-09-05 13:09:02 +02001812
Stefan Hajnoczi9699bf02012-10-17 14:02:31 +02001813 qapi_free_ImageInfoList(list);
bellardea2384d2004-08-01 21:59:26 +00001814 return 0;
1815}
1816
Paolo Bonzini4c93a13b2013-09-04 19:00:33 +02001817
1818typedef struct MapEntry {
1819 int flags;
1820 int depth;
1821 int64_t start;
1822 int64_t length;
1823 int64_t offset;
1824 BlockDriverState *bs;
1825} MapEntry;
1826
1827static void dump_map_entry(OutputFormat output_format, MapEntry *e,
1828 MapEntry *next)
1829{
1830 switch (output_format) {
1831 case OFORMAT_HUMAN:
1832 if ((e->flags & BDRV_BLOCK_DATA) &&
1833 !(e->flags & BDRV_BLOCK_OFFSET_VALID)) {
1834 error_report("File contains external, encrypted or compressed clusters.");
1835 exit(1);
1836 }
1837 if ((e->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) == BDRV_BLOCK_DATA) {
1838 printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
1839 e->start, e->length, e->offset, e->bs->filename);
1840 }
1841 /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
1842 * Modify the flags here to allow more coalescing.
1843 */
1844 if (next &&
1845 (next->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) != BDRV_BLOCK_DATA) {
1846 next->flags &= ~BDRV_BLOCK_DATA;
1847 next->flags |= BDRV_BLOCK_ZERO;
1848 }
1849 break;
1850 case OFORMAT_JSON:
1851 printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": %d,"
1852 " \"zero\": %s, \"data\": %s",
1853 (e->start == 0 ? "[" : ",\n"),
1854 e->start, e->length, e->depth,
1855 (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false",
1856 (e->flags & BDRV_BLOCK_DATA) ? "true" : "false");
1857 if (e->flags & BDRV_BLOCK_OFFSET_VALID) {
Paolo Bonzinic745bfb2013-09-11 18:47:52 +02001858 printf(", \"offset\": %"PRId64"", e->offset);
Paolo Bonzini4c93a13b2013-09-04 19:00:33 +02001859 }
1860 putchar('}');
1861
1862 if (!next) {
1863 printf("]\n");
1864 }
1865 break;
1866 }
1867}
1868
1869static int get_block_status(BlockDriverState *bs, int64_t sector_num,
1870 int nb_sectors, MapEntry *e)
1871{
1872 int64_t ret;
1873 int depth;
1874
1875 /* As an optimization, we could cache the current range of unallocated
1876 * clusters in each file of the chain, and avoid querying the same
1877 * range repeatedly.
1878 */
1879
1880 depth = 0;
1881 for (;;) {
1882 ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors);
1883 if (ret < 0) {
1884 return ret;
1885 }
1886 assert(nb_sectors);
1887 if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
1888 break;
1889 }
1890 bs = bs->backing_hd;
1891 if (bs == NULL) {
1892 ret = 0;
1893 break;
1894 }
1895
1896 depth++;
1897 }
1898
1899 e->start = sector_num * BDRV_SECTOR_SIZE;
1900 e->length = nb_sectors * BDRV_SECTOR_SIZE;
1901 e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK;
1902 e->offset = ret & BDRV_BLOCK_OFFSET_MASK;
1903 e->depth = depth;
1904 e->bs = bs;
1905 return 0;
1906}
1907
1908static int img_map(int argc, char **argv)
1909{
1910 int c;
1911 OutputFormat output_format = OFORMAT_HUMAN;
1912 BlockDriverState *bs;
1913 const char *filename, *fmt, *output;
1914 int64_t length;
1915 MapEntry curr = { .length = 0 }, next;
1916 int ret = 0;
1917
1918 fmt = NULL;
1919 output = NULL;
1920 for (;;) {
1921 int option_index = 0;
1922 static const struct option long_options[] = {
1923 {"help", no_argument, 0, 'h'},
1924 {"format", required_argument, 0, 'f'},
1925 {"output", required_argument, 0, OPTION_OUTPUT},
1926 {0, 0, 0, 0}
1927 };
1928 c = getopt_long(argc, argv, "f:h",
1929 long_options, &option_index);
1930 if (c == -1) {
1931 break;
1932 }
1933 switch (c) {
1934 case '?':
1935 case 'h':
1936 help();
1937 break;
1938 case 'f':
1939 fmt = optarg;
1940 break;
1941 case OPTION_OUTPUT:
1942 output = optarg;
1943 break;
1944 }
1945 }
1946 if (optind >= argc) {
1947 help();
1948 }
1949 filename = argv[optind++];
1950
1951 if (output && !strcmp(output, "json")) {
1952 output_format = OFORMAT_JSON;
1953 } else if (output && !strcmp(output, "human")) {
1954 output_format = OFORMAT_HUMAN;
1955 } else if (output) {
1956 error_report("--output must be used with human or json as argument.");
1957 return 1;
1958 }
1959
1960 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS, true, false);
1961 if (!bs) {
1962 return 1;
1963 }
1964
1965 if (output_format == OFORMAT_HUMAN) {
1966 printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
1967 }
1968
1969 length = bdrv_getlength(bs);
1970 while (curr.start + curr.length < length) {
1971 int64_t nsectors_left;
1972 int64_t sector_num;
1973 int n;
1974
1975 sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
1976
1977 /* Probe up to 1 GiB at a time. */
1978 nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
1979 n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
1980 ret = get_block_status(bs, sector_num, n, &next);
1981
1982 if (ret < 0) {
1983 error_report("Could not read file metadata: %s", strerror(-ret));
1984 goto out;
1985 }
1986
1987 if (curr.length != 0 && curr.flags == next.flags &&
1988 curr.depth == next.depth &&
1989 ((curr.flags & BDRV_BLOCK_OFFSET_VALID) == 0 ||
1990 curr.offset + curr.length == next.offset)) {
1991 curr.length += next.length;
1992 continue;
1993 }
1994
1995 if (curr.length > 0) {
1996 dump_map_entry(output_format, &curr, &next);
1997 }
1998 curr = next;
1999 }
2000
2001 dump_map_entry(output_format, &curr, NULL);
2002
2003out:
2004 bdrv_unref(bs);
2005 return ret < 0;
2006}
2007
aliguorif7b4a942009-01-07 17:40:15 +00002008#define SNAPSHOT_LIST 1
2009#define SNAPSHOT_CREATE 2
2010#define SNAPSHOT_APPLY 3
2011#define SNAPSHOT_DELETE 4
2012
Stuart Brady153859b2009-06-07 00:42:17 +01002013static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00002014{
2015 BlockDriverState *bs;
2016 QEMUSnapshotInfo sn;
2017 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002018 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00002019 int action = 0;
2020 qemu_timeval tv;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002021 bool quiet = false;
Wenchao Xiaa89d89d2013-09-11 14:04:33 +08002022 Error *err = NULL;
aliguorif7b4a942009-01-07 17:40:15 +00002023
Kevin Wolf710da702011-01-10 12:33:02 +01002024 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00002025 /* Parse commandline parameters */
2026 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002027 c = getopt(argc, argv, "la:c:d:hq");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002028 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00002029 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002030 }
aliguorif7b4a942009-01-07 17:40:15 +00002031 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002032 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00002033 case 'h':
2034 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002035 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002036 case 'l':
2037 if (action) {
2038 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002039 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002040 }
2041 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02002042 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00002043 break;
2044 case 'a':
2045 if (action) {
2046 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002047 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002048 }
2049 action = SNAPSHOT_APPLY;
2050 snapshot_name = optarg;
2051 break;
2052 case 'c':
2053 if (action) {
2054 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002055 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002056 }
2057 action = SNAPSHOT_CREATE;
2058 snapshot_name = optarg;
2059 break;
2060 case 'd':
2061 if (action) {
2062 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002063 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002064 }
2065 action = SNAPSHOT_DELETE;
2066 snapshot_name = optarg;
2067 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002068 case 'q':
2069 quiet = true;
2070 break;
aliguorif7b4a942009-01-07 17:40:15 +00002071 }
2072 }
2073
Kevin Wolffc11eb22013-08-05 10:53:04 +02002074 if (optind != argc - 1) {
aliguorif7b4a942009-01-07 17:40:15 +00002075 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002076 }
aliguorif7b4a942009-01-07 17:40:15 +00002077 filename = argv[optind++];
2078
2079 /* Open the image */
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002080 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002081 if (!bs) {
2082 return 1;
2083 }
aliguorif7b4a942009-01-07 17:40:15 +00002084
2085 /* Perform the requested action */
2086 switch(action) {
2087 case SNAPSHOT_LIST:
2088 dump_snapshots(bs);
2089 break;
2090
2091 case SNAPSHOT_CREATE:
2092 memset(&sn, 0, sizeof(sn));
2093 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
2094
2095 qemu_gettimeofday(&tv);
2096 sn.date_sec = tv.tv_sec;
2097 sn.date_nsec = tv.tv_usec * 1000;
2098
2099 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002100 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002101 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00002102 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002103 }
aliguorif7b4a942009-01-07 17:40:15 +00002104 break;
2105
2106 case SNAPSHOT_APPLY:
2107 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002108 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002109 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00002110 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002111 }
aliguorif7b4a942009-01-07 17:40:15 +00002112 break;
2113
2114 case SNAPSHOT_DELETE:
Wenchao Xiaa89d89d2013-09-11 14:04:33 +08002115 bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
2116 if (error_is_set(&err)) {
2117 error_report("Could not delete snapshot '%s': (%s)",
2118 snapshot_name, error_get_pretty(err));
2119 error_free(err);
2120 ret = 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002121 }
aliguorif7b4a942009-01-07 17:40:15 +00002122 break;
2123 }
2124
2125 /* Cleanup */
Fam Zheng4f6fd342013-08-23 09:14:47 +08002126 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002127 if (ret) {
2128 return 1;
2129 }
Stuart Brady153859b2009-06-07 00:42:17 +01002130 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00002131}
2132
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002133static int img_rebase(int argc, char **argv)
2134{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002135 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01002136 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002137 char *filename;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002138 const char *fmt, *cache, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002139 int c, flags, ret;
2140 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002141 int progress = 0;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002142 bool quiet = false;
Max Reitz34b5d2c2013-09-05 14:45:29 +02002143 Error *local_err = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002144
2145 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01002146 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002147 cache = BDRV_DEFAULT_CACHE;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002148 out_baseimg = NULL;
2149 out_basefmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002150 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002151 c = getopt(argc, argv, "uhf:F:b:pt:q");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002152 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002153 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002154 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002155 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002156 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002157 case 'h':
2158 help();
2159 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01002160 case 'f':
2161 fmt = optarg;
2162 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002163 case 'F':
2164 out_basefmt = optarg;
2165 break;
2166 case 'b':
2167 out_baseimg = optarg;
2168 break;
2169 case 'u':
2170 unsafe = 1;
2171 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002172 case 'p':
2173 progress = 1;
2174 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002175 case 't':
2176 cache = optarg;
2177 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002178 case 'q':
2179 quiet = true;
2180 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002181 }
2182 }
2183
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002184 if (quiet) {
2185 progress = 0;
2186 }
2187
Kevin Wolffc11eb22013-08-05 10:53:04 +02002188 if ((optind != argc - 1) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002189 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01002190 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002191 filename = argv[optind++];
2192
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002193 qemu_progress_init(progress, 2.0);
2194 qemu_progress_print(0, 100);
2195
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002196 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
Stefan Hajnoczic3993cd2011-08-04 12:26:51 +01002197 ret = bdrv_parse_cache_flags(cache, &flags);
Federico Simoncelli661a0f72011-06-20 12:48:19 -04002198 if (ret < 0) {
2199 error_report("Invalid cache option: %s", cache);
2200 return -1;
2201 }
2202
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002203 /*
2204 * Open the images.
2205 *
2206 * Ignore the old backing file for unsafe rebase in case we want to correct
2207 * the reference to a renamed or moved backing file.
2208 */
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002209 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002210 if (!bs) {
2211 return 1;
2212 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002213
2214 /* Find the right drivers for the backing files */
2215 old_backing_drv = NULL;
2216 new_backing_drv = NULL;
2217
2218 if (!unsafe && bs->backing_format[0] != '\0') {
2219 old_backing_drv = bdrv_find_format(bs->backing_format);
2220 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002221 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002222 ret = -1;
2223 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002224 }
2225 }
2226
2227 if (out_basefmt != NULL) {
2228 new_backing_drv = bdrv_find_format(out_basefmt);
2229 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002230 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002231 ret = -1;
2232 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002233 }
2234 }
2235
2236 /* For safe rebasing we need to compare old and new backing file */
2237 if (unsafe) {
2238 /* Make the compiler happy */
2239 bs_old_backing = NULL;
2240 bs_new_backing = NULL;
2241 } else {
2242 char backing_name[1024];
2243
2244 bs_old_backing = bdrv_new("old_backing");
2245 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01002246 ret = bdrv_open(bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
Max Reitz34b5d2c2013-09-05 14:45:29 +02002247 old_backing_drv, &local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002248 if (ret) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02002249 error_report("Could not open old backing file '%s': %s",
2250 backing_name, error_get_pretty(local_err));
2251 error_free(local_err);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002252 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002253 }
Alex Bligha6166732012-10-16 13:46:18 +01002254 if (out_baseimg[0]) {
2255 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfde9c0ce2013-03-15 10:35:02 +01002256 ret = bdrv_open(bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
Max Reitz34b5d2c2013-09-05 14:45:29 +02002257 new_backing_drv, &local_err);
Alex Bligha6166732012-10-16 13:46:18 +01002258 if (ret) {
Max Reitz34b5d2c2013-09-05 14:45:29 +02002259 error_report("Could not open new backing file '%s': %s",
2260 out_baseimg, error_get_pretty(local_err));
2261 error_free(local_err);
Alex Bligha6166732012-10-16 13:46:18 +01002262 goto out;
2263 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002264 }
2265 }
2266
2267 /*
2268 * Check each unallocated cluster in the COW file. If it is unallocated,
2269 * accesses go to the backing file. We must therefore compare this cluster
2270 * in the old and new backing file, and if they differ we need to copy it
2271 * from the old backing file into the COW file.
2272 *
2273 * If qemu-img crashes during this step, no harm is done. The content of
2274 * the image is the same as the original one at any time.
2275 */
2276 if (!unsafe) {
2277 uint64_t num_sectors;
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002278 uint64_t old_backing_num_sectors;
Alex Bligha6166732012-10-16 13:46:18 +01002279 uint64_t new_backing_num_sectors = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002280 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02002281 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08002282 uint8_t * buf_old;
2283 uint8_t * buf_new;
Kevin Wolf1f710492012-10-12 14:29:18 +02002284 float local_progress = 0;
TeLeMand6771bf2010-02-08 16:20:00 +08002285
Kevin Wolfbb1c0592011-08-08 14:09:12 +02002286 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
2287 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002288
2289 bdrv_get_geometry(bs, &num_sectors);
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002290 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
Alex Bligha6166732012-10-16 13:46:18 +01002291 if (bs_new_backing) {
2292 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
2293 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002294
Kevin Wolf1f710492012-10-12 14:29:18 +02002295 if (num_sectors != 0) {
2296 local_progress = (float)100 /
2297 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2298 }
2299
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002300 for (sector = 0; sector < num_sectors; sector += n) {
2301
2302 /* How many sectors can we handle with the next read? */
2303 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2304 n = (IO_BUF_SIZE / 512);
2305 } else {
2306 n = num_sectors - sector;
2307 }
2308
2309 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02002310 ret = bdrv_is_allocated(bs, sector, n, &n);
Paolo Bonzinid6636402013-09-04 19:00:25 +02002311 if (ret < 0) {
2312 error_report("error while reading image metadata: %s",
2313 strerror(-ret));
2314 goto out;
2315 }
Kevin Wolfcc60e322010-04-29 14:47:48 +02002316 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002317 continue;
2318 }
2319
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002320 /*
2321 * Read old and new backing file and take into consideration that
2322 * backing files may be smaller than the COW image.
2323 */
2324 if (sector >= old_backing_num_sectors) {
2325 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2326 } else {
2327 if (sector + n > old_backing_num_sectors) {
2328 n = old_backing_num_sectors - sector;
2329 }
2330
2331 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
2332 if (ret < 0) {
2333 error_report("error while reading from old backing file");
2334 goto out;
2335 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002336 }
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002337
Alex Bligha6166732012-10-16 13:46:18 +01002338 if (sector >= new_backing_num_sectors || !bs_new_backing) {
Kevin Wolf87a1b3e2011-12-07 12:42:10 +01002339 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2340 } else {
2341 if (sector + n > new_backing_num_sectors) {
2342 n = new_backing_num_sectors - sector;
2343 }
2344
2345 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
2346 if (ret < 0) {
2347 error_report("error while reading from new backing file");
2348 goto out;
2349 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002350 }
2351
2352 /* If they differ, we need to write to the COW file */
2353 uint64_t written = 0;
2354
2355 while (written < n) {
2356 int pnum;
2357
2358 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01002359 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002360 {
2361 ret = bdrv_write(bs, sector + written,
2362 buf_old + written * 512, pnum);
2363 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002364 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002365 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002366 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002367 }
2368 }
2369
2370 written += pnum;
2371 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002372 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002373 }
TeLeMand6771bf2010-02-08 16:20:00 +08002374
Kevin Wolfbb1c0592011-08-08 14:09:12 +02002375 qemu_vfree(buf_old);
2376 qemu_vfree(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002377 }
2378
2379 /*
2380 * Change the backing file. All clusters that are different from the old
2381 * backing file are overwritten in the COW file now, so the visible content
2382 * doesn't change when we switch the backing file.
2383 */
Alex Bligha6166732012-10-16 13:46:18 +01002384 if (out_baseimg && *out_baseimg) {
2385 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2386 } else {
2387 ret = bdrv_change_backing_file(bs, NULL, NULL);
2388 }
2389
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002390 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002391 error_report("Could not change the backing file to '%s': No "
2392 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002393 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002394 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002395 out_baseimg, strerror(-ret));
2396 }
2397
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002398 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002399 /*
2400 * TODO At this point it is possible to check if any clusters that are
2401 * allocated in the COW file are the same in the backing file. If so, they
2402 * could be dropped from the COW file. Don't do this before switching the
2403 * backing file, in case of a crash this would lead to corruption.
2404 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002405out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02002406 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002407 /* Cleanup */
2408 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002409 if (bs_old_backing != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002410 bdrv_unref(bs_old_backing);
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002411 }
2412 if (bs_new_backing != NULL) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002413 bdrv_unref(bs_new_backing);
Kevin Wolfeb863ad2011-03-31 12:39:51 +02002414 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002415 }
2416
Fam Zheng4f6fd342013-08-23 09:14:47 +08002417 bdrv_unref(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002418 if (ret) {
2419 return 1;
2420 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01002421 return 0;
2422}
2423
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002424static int img_resize(int argc, char **argv)
2425{
2426 int c, ret, relative;
2427 const char *filename, *fmt, *size;
2428 int64_t n, total_size;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002429 bool quiet = false;
Jes Sorensen2a819982010-12-06 17:08:31 +01002430 BlockDriverState *bs = NULL;
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002431 QemuOpts *param;
2432 static QemuOptsList resize_options = {
2433 .name = "resize_options",
2434 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2435 .desc = {
2436 {
2437 .name = BLOCK_OPT_SIZE,
2438 .type = QEMU_OPT_SIZE,
2439 .help = "Virtual disk size"
2440 }, {
2441 /* end of list */
2442 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002443 },
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002444 };
2445
Kevin Wolfe80fec72011-04-29 10:58:12 +02002446 /* Remove size from argv manually so that negative numbers are not treated
2447 * as options by getopt. */
2448 if (argc < 3) {
2449 help();
2450 return 1;
2451 }
2452
2453 size = argv[--argc];
2454
2455 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002456 fmt = NULL;
2457 for(;;) {
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002458 c = getopt(argc, argv, "f:hq");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002459 if (c == -1) {
2460 break;
2461 }
2462 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01002463 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002464 case 'h':
2465 help();
2466 break;
2467 case 'f':
2468 fmt = optarg;
2469 break;
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002470 case 'q':
2471 quiet = true;
2472 break;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002473 }
2474 }
Kevin Wolffc11eb22013-08-05 10:53:04 +02002475 if (optind != argc - 1) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002476 help();
2477 }
2478 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002479
2480 /* Choose grow, shrink, or absolute resize mode */
2481 switch (size[0]) {
2482 case '+':
2483 relative = 1;
2484 size++;
2485 break;
2486 case '-':
2487 relative = -1;
2488 size++;
2489 break;
2490 default:
2491 relative = 0;
2492 break;
2493 }
2494
2495 /* Parse size */
Dong Xu Wange478b442012-12-06 14:47:22 +08002496 param = qemu_opts_create_nofail(&resize_options);
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002497 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002498 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01002499 ret = -1;
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002500 qemu_opts_del(param);
Jes Sorensen2a819982010-12-06 17:08:31 +01002501 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002502 }
Dong Xu Wang20caf0f2012-08-06 10:18:42 +08002503 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2504 qemu_opts_del(param);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002505
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002506 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002507 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01002508 ret = -1;
2509 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002510 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002511
2512 if (relative) {
2513 total_size = bdrv_getlength(bs) + n * relative;
2514 } else {
2515 total_size = n;
2516 }
2517 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01002518 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002519 ret = -1;
2520 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002521 }
2522
2523 ret = bdrv_truncate(bs, total_size);
2524 switch (ret) {
2525 case 0:
Miroslav Rezaninaf382d432013-02-13 09:09:40 +01002526 qprintf(quiet, "Image resized.\n");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002527 break;
2528 case -ENOTSUP:
Kevin Wolf259b2172012-03-06 12:44:45 +01002529 error_report("This image does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002530 break;
2531 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01002532 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002533 break;
2534 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01002535 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002536 break;
2537 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002538out:
Jes Sorensen2a819982010-12-06 17:08:31 +01002539 if (bs) {
Fam Zheng4f6fd342013-08-23 09:14:47 +08002540 bdrv_unref(bs);
Jes Sorensen2a819982010-12-06 17:08:31 +01002541 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09002542 if (ret) {
2543 return 1;
2544 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01002545 return 0;
2546}
2547
Max Reitz6f176b42013-09-03 10:09:50 +02002548static int img_amend(int argc, char **argv)
2549{
2550 int c, ret = 0;
2551 char *options = NULL;
2552 QEMUOptionParameter *create_options = NULL, *options_param = NULL;
2553 const char *fmt = NULL, *filename;
2554 bool quiet = false;
2555 BlockDriverState *bs = NULL;
2556
2557 for (;;) {
2558 c = getopt(argc, argv, "hqf:o:");
2559 if (c == -1) {
2560 break;
2561 }
2562
2563 switch (c) {
2564 case 'h':
2565 case '?':
2566 help();
2567 break;
2568 case 'o':
2569 options = optarg;
2570 break;
2571 case 'f':
2572 fmt = optarg;
2573 break;
2574 case 'q':
2575 quiet = true;
2576 break;
2577 }
2578 }
2579
2580 if (optind != argc - 1) {
2581 help();
2582 }
2583
2584 if (!options) {
2585 help();
2586 }
2587
2588 filename = argv[argc - 1];
2589
2590 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
2591 if (!bs) {
2592 error_report("Could not open image '%s'", filename);
2593 ret = -1;
2594 goto out;
2595 }
2596
2597 fmt = bs->drv->format_name;
2598
2599 if (is_help_option(options)) {
2600 ret = print_block_option_help(filename, fmt);
2601 goto out;
2602 }
2603
2604 create_options = append_option_parameters(create_options,
2605 bs->drv->create_options);
2606 options_param = parse_option_parameters(options, create_options,
2607 options_param);
2608 if (options_param == NULL) {
2609 error_report("Invalid options for file format '%s'", fmt);
2610 ret = -1;
2611 goto out;
2612 }
2613
2614 ret = bdrv_amend_options(bs, options_param);
2615 if (ret < 0) {
2616 error_report("Error while amending options: %s", strerror(-ret));
2617 goto out;
2618 }
2619
2620out:
2621 if (bs) {
2622 bdrv_unref(bs);
2623 }
2624 free_option_parameters(create_options);
2625 free_option_parameters(options_param);
2626 if (ret) {
2627 return 1;
2628 }
2629 return 0;
2630}
2631
Anthony Liguoric227f092009-10-01 16:12:16 -05002632static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01002633#define DEF(option, callback, arg_string) \
2634 { option, callback },
2635#include "qemu-img-cmds.h"
2636#undef DEF
2637#undef GEN_DOCS
2638 { NULL, NULL, },
2639};
2640
bellardea2384d2004-08-01 21:59:26 +00002641int main(int argc, char **argv)
2642{
Anthony Liguoric227f092009-10-01 16:12:16 -05002643 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01002644 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00002645
MORITA Kazutaka526eda12013-07-23 17:30:11 +09002646#ifdef CONFIG_POSIX
2647 signal(SIGPIPE, SIG_IGN);
2648#endif
2649
Kevin Wolf53f76e52010-12-16 15:10:32 +01002650 error_set_progname(argv[0]);
2651
Paolo Bonzini2592c592012-11-03 18:10:17 +01002652 qemu_init_main_loop();
bellardea2384d2004-08-01 21:59:26 +00002653 bdrv_init();
2654 if (argc < 2)
2655 help();
Stuart Brady153859b2009-06-07 00:42:17 +01002656 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00002657 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01002658
2659 /* find the command */
2660 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2661 if (!strcmp(cmdname, cmd->name)) {
2662 return cmd->handler(argc, argv);
2663 }
bellardea2384d2004-08-01 21:59:26 +00002664 }
Stuart Brady153859b2009-06-07 00:42:17 +01002665
2666 /* not found */
2667 help();
bellardea2384d2004-08-01 21:59:26 +00002668 return 0;
2669}