blob: 54137a4e922aed1e7d63540da105d1ef1776a9dd [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 */
pbrookfaf07962007-11-11 02:51:17 +000024#include "qemu-common.h"
Kevin Wolf9ea2ea72009-05-18 16:42:11 +020025#include "qemu-option.h"
Kevin Wolf53f76e52010-12-16 15:10:32 +010026#include "qemu-error.h"
aliguorif7b4a942009-01-07 17:40:15 +000027#include "osdep.h"
Jes Sorensendc786bc2010-10-26 10:39:23 +020028#include "sysemu.h"
thsec36ba12007-09-16 21:59:02 +000029#include "block_int.h"
aliguori9230eaf2009-03-28 17:55:19 +000030#include <stdio.h>
bellardea2384d2004-08-01 21:59:26 +000031
bellarde8445332006-06-14 15:32:10 +000032#ifdef _WIN32
33#include <windows.h>
34#endif
35
Anthony Liguoric227f092009-10-01 16:12:16 -050036typedef struct img_cmd_t {
Stuart Brady153859b2009-06-07 00:42:17 +010037 const char *name;
38 int (*handler)(int argc, char **argv);
Anthony Liguoric227f092009-10-01 16:12:16 -050039} img_cmd_t;
Stuart Brady153859b2009-06-07 00:42:17 +010040
aurel32137519c2008-11-30 19:12:49 +000041/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
Stefan Hajnocziadfe0782010-04-13 10:29:35 +010042#define BDRV_O_FLAGS BDRV_O_CACHE_WB
Federico Simoncelli661a0f72011-06-20 12:48:19 -040043#define BDRV_DEFAULT_CACHE "writeback"
aurel32137519c2008-11-30 19:12:49 +000044
bellardea2384d2004-08-01 21:59:26 +000045static void format_print(void *opaque, const char *name)
46{
47 printf(" %s", name);
48}
49
blueswir1d2c639d2009-01-24 18:19:25 +000050/* Please keep in synch with qemu-img.texi */
pbrook3f379ab2007-11-11 03:33:13 +000051static void help(void)
bellardea2384d2004-08-01 21:59:26 +000052{
Paolo Bonzinie00291c2010-02-04 16:49:56 +010053 const char *help_msg =
54 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
malc3f020d72010-02-08 12:04:56 +030055 "usage: qemu-img command [command options]\n"
56 "QEMU disk image utility\n"
57 "\n"
58 "Command syntax:\n"
Stuart Brady153859b2009-06-07 00:42:17 +010059#define DEF(option, callback, arg_string) \
60 " " arg_string "\n"
61#include "qemu-img-cmds.h"
62#undef DEF
63#undef GEN_DOCS
malc3f020d72010-02-08 12:04:56 +030064 "\n"
65 "Command parameters:\n"
66 " 'filename' is a disk image filename\n"
67 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
Federico Simoncelli661a0f72011-06-20 12:48:19 -040068 " 'cache' is the cache mode used to write the output disk image, the valid\n"
69 " options are: 'none', 'writeback' (default), 'writethrough' and 'unsafe'\n"
malc3f020d72010-02-08 12:04:56 +030070 " 'size' is the disk image size in bytes. Optional suffixes\n"
71 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
72 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
73 " 'output_filename' is the destination disk image filename\n"
74 " 'output_fmt' is the destination format\n"
75 " 'options' is a comma separated list of format specific options in a\n"
76 " name=value format. Use -o ? for an overview of the options supported by the\n"
77 " used format\n"
78 " '-c' indicates that target image must be compressed (qcow format only)\n"
79 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
80 " match exactly. The image doesn't need a working backing file before\n"
81 " rebasing in this case (useful for renaming the backing file)\n"
82 " '-h' with or without a command shows this help and lists the supported formats\n"
Jes Sorensen6b837bc2011-03-30 14:16:25 +020083 " '-p' show progress of command (only certain commands)\n"
malc3f020d72010-02-08 12:04:56 +030084 "\n"
85 "Parameters to snapshot subcommand:\n"
86 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
87 " '-a' applies a snapshot (revert disk to saved state)\n"
88 " '-c' creates a snapshot\n"
89 " '-d' deletes a snapshot\n"
Paolo Bonzinie00291c2010-02-04 16:49:56 +010090 " '-l' lists all snapshots in the given image\n";
91
92 printf("%s\nSupported formats:", help_msg);
bellardea2384d2004-08-01 21:59:26 +000093 bdrv_iterate_format(format_print, NULL);
94 printf("\n");
95 exit(1);
96}
97
bellardea2384d2004-08-01 21:59:26 +000098#if defined(WIN32)
99/* XXX: put correct support for win32 */
100static int read_password(char *buf, int buf_size)
101{
102 int c, i;
103 printf("Password: ");
104 fflush(stdout);
105 i = 0;
106 for(;;) {
107 c = getchar();
108 if (c == '\n')
109 break;
110 if (i < (buf_size - 1))
111 buf[i++] = c;
112 }
113 buf[i] = '\0';
114 return 0;
115}
116
117#else
118
119#include <termios.h>
120
121static struct termios oldtty;
122
123static void term_exit(void)
124{
125 tcsetattr (0, TCSANOW, &oldtty);
126}
127
128static void term_init(void)
129{
130 struct termios tty;
131
132 tcgetattr (0, &tty);
133 oldtty = tty;
134
135 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
136 |INLCR|IGNCR|ICRNL|IXON);
137 tty.c_oflag |= OPOST;
138 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
139 tty.c_cflag &= ~(CSIZE|PARENB);
140 tty.c_cflag |= CS8;
141 tty.c_cc[VMIN] = 1;
142 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +0000143
bellardea2384d2004-08-01 21:59:26 +0000144 tcsetattr (0, TCSANOW, &tty);
145
146 atexit(term_exit);
147}
148
pbrook3f379ab2007-11-11 03:33:13 +0000149static int read_password(char *buf, int buf_size)
bellardea2384d2004-08-01 21:59:26 +0000150{
151 uint8_t ch;
152 int i, ret;
153
154 printf("password: ");
155 fflush(stdout);
156 term_init();
157 i = 0;
158 for(;;) {
159 ret = read(0, &ch, 1);
160 if (ret == -1) {
161 if (errno == EAGAIN || errno == EINTR) {
162 continue;
163 } else {
164 ret = -1;
165 break;
166 }
167 } else if (ret == 0) {
168 ret = -1;
169 break;
170 } else {
171 if (ch == '\r') {
172 ret = 0;
173 break;
174 }
175 if (i < (buf_size - 1))
176 buf[i++] = ch;
177 }
178 }
179 term_exit();
180 buf[i] = '\0';
181 printf("\n");
182 return ret;
183}
184#endif
185
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400186static int set_cache_flag(const char *mode, int *flags)
187{
188 *flags &= ~BDRV_O_CACHE_MASK;
189
190 if (!strcmp(mode, "none") || !strcmp(mode, "off")) {
191 *flags |= BDRV_O_CACHE_WB;
192 *flags |= BDRV_O_NOCACHE;
193 } else if (!strcmp(mode, "writeback")) {
194 *flags |= BDRV_O_CACHE_WB;
195 } else if (!strcmp(mode, "unsafe")) {
196 *flags |= BDRV_O_CACHE_WB;
197 *flags |= BDRV_O_NO_FLUSH;
198 } else if (!strcmp(mode, "writethrough")) {
199 /* this is the default */
200 } else {
201 return -1;
202 }
203
204 return 0;
205}
206
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100207static int print_block_option_help(const char *filename, const char *fmt)
208{
209 BlockDriver *drv, *proto_drv;
210 QEMUOptionParameter *create_options = NULL;
211
212 /* Find driver and parse its options */
213 drv = bdrv_find_format(fmt);
214 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100215 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100216 return 1;
217 }
218
219 proto_drv = bdrv_find_protocol(filename);
220 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100221 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100222 return 1;
223 }
224
225 create_options = append_option_parameters(create_options,
226 drv->create_options);
227 create_options = append_option_parameters(create_options,
228 proto_drv->create_options);
229 print_option_help(create_options);
230 free_option_parameters(create_options);
231 return 0;
232}
233
bellard75c23802004-08-27 21:28:58 +0000234static BlockDriverState *bdrv_new_open(const char *filename,
Sheng Yang9bc378c2010-01-29 10:15:06 +0800235 const char *fmt,
Stefan Hajnoczif163d072010-04-13 10:29:34 +0100236 int flags)
bellard75c23802004-08-27 21:28:58 +0000237{
238 BlockDriverState *bs;
239 BlockDriver *drv;
240 char password[256];
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100241 int ret;
bellard75c23802004-08-27 21:28:58 +0000242
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100243 bs = bdrv_new("image");
Kevin Wolfad717132010-12-16 15:37:41 +0100244
bellard75c23802004-08-27 21:28:58 +0000245 if (fmt) {
246 drv = bdrv_find_format(fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900247 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100248 error_report("Unknown file format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900249 goto fail;
250 }
bellard75c23802004-08-27 21:28:58 +0000251 } else {
252 drv = NULL;
253 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100254
255 ret = bdrv_open(bs, filename, flags, drv);
256 if (ret < 0) {
257 error_report("Could not open '%s': %s", filename, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900258 goto fail;
bellard75c23802004-08-27 21:28:58 +0000259 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100260
bellard75c23802004-08-27 21:28:58 +0000261 if (bdrv_is_encrypted(bs)) {
262 printf("Disk image '%s' is encrypted.\n", filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900263 if (read_password(password, sizeof(password)) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100264 error_report("No password given");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900265 goto fail;
266 }
267 if (bdrv_set_key(bs, password) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100268 error_report("invalid password");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900269 goto fail;
270 }
bellard75c23802004-08-27 21:28:58 +0000271 }
272 return bs;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900273fail:
274 if (bs) {
275 bdrv_delete(bs);
276 }
277 return NULL;
bellard75c23802004-08-27 21:28:58 +0000278}
279
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900280static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
Jes Sorenseneec77d92010-12-07 17:44:34 +0100281 const char *base_filename,
282 const char *base_fmt)
Kevin Wolfefa84d42009-05-18 16:42:12 +0200283{
Kevin Wolfefa84d42009-05-18 16:42:12 +0200284 if (base_filename) {
285 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100286 error_report("Backing file not supported for file format '%s'",
287 fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900288 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200289 }
290 }
291 if (base_fmt) {
292 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100293 error_report("Backing file format not supported for file "
294 "format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900295 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200296 }
297 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900298 return 0;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200299}
300
bellardea2384d2004-08-01 21:59:26 +0000301static int img_create(int argc, char **argv)
302{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100303 int c, ret = 0;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100304 uint64_t img_size = -1;
bellardea2384d2004-08-01 21:59:26 +0000305 const char *fmt = "raw";
aliguori9230eaf2009-03-28 17:55:19 +0000306 const char *base_fmt = NULL;
bellardea2384d2004-08-01 21:59:26 +0000307 const char *filename;
308 const char *base_filename = NULL;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200309 char *options = NULL;
ths3b46e622007-09-17 08:09:54 +0000310
bellardea2384d2004-08-01 21:59:26 +0000311 for(;;) {
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200312 c = getopt(argc, argv, "F:b:f:he6o:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100313 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000314 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100315 }
bellardea2384d2004-08-01 21:59:26 +0000316 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100317 case '?':
bellardea2384d2004-08-01 21:59:26 +0000318 case 'h':
319 help();
320 break;
aliguori9230eaf2009-03-28 17:55:19 +0000321 case 'F':
322 base_fmt = optarg;
323 break;
bellardea2384d2004-08-01 21:59:26 +0000324 case 'b':
325 base_filename = optarg;
326 break;
327 case 'f':
328 fmt = optarg;
329 break;
330 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200331 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100332 "encryption\' instead!");
333 return 1;
thsd8871c52007-10-24 16:11:42 +0000334 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200335 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100336 "compat6\' instead!");
337 return 1;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200338 case 'o':
339 options = optarg;
340 break;
bellardea2384d2004-08-01 21:59:26 +0000341 }
342 }
aliguori9230eaf2009-03-28 17:55:19 +0000343
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900344 /* Get the filename */
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100345 if (optind >= argc) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900346 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100347 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900348 filename = argv[optind++];
349
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100350 /* Get image size, if specified */
351 if (optind < argc) {
Jes Sorensen70b4f4b2011-01-05 11:41:02 +0100352 int64_t sval;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100353 sval = strtosz_suffix(argv[optind++], NULL, STRTOSZ_DEFSUFFIX_B);
354 if (sval < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100355 error_report("Invalid image size specified! You may use k, M, G or "
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100356 "T suffixes for ");
Jes Sorensen15654a62010-12-16 14:31:53 +0100357 error_report("kilobytes, megabytes, gigabytes and terabytes.");
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100358 ret = -1;
359 goto out;
360 }
361 img_size = (uint64_t)sval;
362 }
363
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100364 if (options && !strcmp(options, "?")) {
365 ret = print_block_option_help(filename, fmt);
366 goto out;
367 }
368
Jes Sorensenf88e1a42010-12-16 13:52:15 +0100369 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
370 options, img_size, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900371out:
372 if (ret) {
373 return 1;
374 }
bellardea2384d2004-08-01 21:59:26 +0000375 return 0;
376}
377
Kevin Wolfe076f332010-06-29 11:43:13 +0200378/*
379 * Checks an image for consistency. Exit codes:
380 *
381 * 0 - Check completed, image is good
382 * 1 - Check not completed because of internal errors
383 * 2 - Check completed, image is corrupted
384 * 3 - Check completed, image has leaked clusters, but is good otherwise
385 */
aliguori15859692009-04-21 23:11:53 +0000386static int img_check(int argc, char **argv)
387{
388 int c, ret;
389 const char *filename, *fmt;
aliguori15859692009-04-21 23:11:53 +0000390 BlockDriverState *bs;
Kevin Wolfe076f332010-06-29 11:43:13 +0200391 BdrvCheckResult result;
aliguori15859692009-04-21 23:11:53 +0000392
393 fmt = NULL;
394 for(;;) {
395 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100396 if (c == -1) {
aliguori15859692009-04-21 23:11:53 +0000397 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100398 }
aliguori15859692009-04-21 23:11:53 +0000399 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100400 case '?':
aliguori15859692009-04-21 23:11:53 +0000401 case 'h':
402 help();
403 break;
404 case 'f':
405 fmt = optarg;
406 break;
407 }
408 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100409 if (optind >= argc) {
aliguori15859692009-04-21 23:11:53 +0000410 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100411 }
aliguori15859692009-04-21 23:11:53 +0000412 filename = argv[optind++];
413
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100414 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900415 if (!bs) {
416 return 1;
417 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200418 ret = bdrv_check(bs, &result);
419
420 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100421 error_report("This image format does not support checks");
Kevin Wolfe076f332010-06-29 11:43:13 +0200422 bdrv_delete(bs);
423 return 1;
424 }
425
426 if (!(result.corruptions || result.leaks || result.check_errors)) {
427 printf("No errors were found on the image.\n");
428 } else {
429 if (result.corruptions) {
430 printf("\n%d errors were found on the image.\n"
431 "Data may be corrupted, or further writes to the image "
432 "may corrupt it.\n",
433 result.corruptions);
aliguori15859692009-04-21 23:11:53 +0000434 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200435
436 if (result.leaks) {
437 printf("\n%d leaked clusters were found on the image.\n"
438 "This means waste of disk space, but no harm to data.\n",
439 result.leaks);
440 }
441
442 if (result.check_errors) {
443 printf("\n%d internal errors have occurred during the check.\n",
444 result.check_errors);
445 }
aliguori15859692009-04-21 23:11:53 +0000446 }
447
448 bdrv_delete(bs);
Kevin Wolfe076f332010-06-29 11:43:13 +0200449
450 if (ret < 0 || result.check_errors) {
451 printf("\nAn error has occurred during the check: %s\n"
452 "The check is not complete and may have missed error.\n",
453 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900454 return 1;
455 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200456
457 if (result.corruptions) {
458 return 2;
459 } else if (result.leaks) {
460 return 3;
461 } else {
462 return 0;
463 }
aliguori15859692009-04-21 23:11:53 +0000464}
465
bellardea2384d2004-08-01 21:59:26 +0000466static int img_commit(int argc, char **argv)
467{
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400468 int c, ret, flags;
469 const char *filename, *fmt, *cache;
bellardea2384d2004-08-01 21:59:26 +0000470 BlockDriverState *bs;
471
472 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400473 cache = BDRV_DEFAULT_CACHE;
bellardea2384d2004-08-01 21:59:26 +0000474 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400475 c = getopt(argc, argv, "f:ht:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100476 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000477 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100478 }
bellardea2384d2004-08-01 21:59:26 +0000479 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100480 case '?':
bellardea2384d2004-08-01 21:59:26 +0000481 case 'h':
482 help();
483 break;
484 case 'f':
485 fmt = optarg;
486 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400487 case 't':
488 cache = optarg;
489 break;
bellardea2384d2004-08-01 21:59:26 +0000490 }
491 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100492 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +0000493 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100494 }
bellardea2384d2004-08-01 21:59:26 +0000495 filename = argv[optind++];
496
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400497 flags = BDRV_O_RDWR;
498 ret = set_cache_flag(cache, &flags);
499 if (ret < 0) {
500 error_report("Invalid cache option: %s", cache);
501 return -1;
502 }
503
504 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900505 if (!bs) {
506 return 1;
507 }
bellardea2384d2004-08-01 21:59:26 +0000508 ret = bdrv_commit(bs);
509 switch(ret) {
510 case 0:
511 printf("Image committed.\n");
512 break;
513 case -ENOENT:
Jes Sorensen15654a62010-12-16 14:31:53 +0100514 error_report("No disk inserted");
bellardea2384d2004-08-01 21:59:26 +0000515 break;
516 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +0100517 error_report("Image is read-only");
bellardea2384d2004-08-01 21:59:26 +0000518 break;
519 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +0100520 error_report("Image is already committed");
bellardea2384d2004-08-01 21:59:26 +0000521 break;
522 default:
Jes Sorensen15654a62010-12-16 14:31:53 +0100523 error_report("Error while committing image");
bellardea2384d2004-08-01 21:59:26 +0000524 break;
525 }
526
527 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900528 if (ret) {
529 return 1;
530 }
bellardea2384d2004-08-01 21:59:26 +0000531 return 0;
532}
533
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400534/*
535 * Checks whether the sector is not a zero sector.
536 *
537 * Attention! The len must be a multiple of 4 * sizeof(long) due to
538 * restriction of optimizations in this function.
539 */
bellardea2384d2004-08-01 21:59:26 +0000540static int is_not_zero(const uint8_t *sector, int len)
541{
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400542 /*
543 * Use long as the biggest available internal data type that fits into the
544 * CPU register and unroll the loop to smooth out the effect of memory
545 * latency.
546 */
547
bellardea2384d2004-08-01 21:59:26 +0000548 int i;
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400549 long d0, d1, d2, d3;
550 const long * const data = (const long *) sector;
551
552 len /= sizeof(long);
553
554 for(i = 0; i < len; i += 4) {
555 d0 = data[i + 0];
556 d1 = data[i + 1];
557 d2 = data[i + 2];
558 d3 = data[i + 3];
559
560 if (d0 || d1 || d2 || d3) {
bellardea2384d2004-08-01 21:59:26 +0000561 return 1;
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400562 }
bellardea2384d2004-08-01 21:59:26 +0000563 }
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400564
bellardea2384d2004-08-01 21:59:26 +0000565 return 0;
566}
567
thsf58c7b32008-06-05 21:53:49 +0000568/*
569 * Returns true iff the first sector pointed to by 'buf' contains at least
570 * a non-NUL byte.
571 *
572 * 'pnum' is set to the number of sectors (including and immediately following
573 * the first one) that are known to be in the same allocated/unallocated state.
574 */
bellardea2384d2004-08-01 21:59:26 +0000575static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
576{
577 int v, i;
578
579 if (n <= 0) {
580 *pnum = 0;
581 return 0;
582 }
583 v = is_not_zero(buf, 512);
584 for(i = 1; i < n; i++) {
585 buf += 512;
586 if (v != is_not_zero(buf, 512))
587 break;
588 }
589 *pnum = i;
590 return v;
591}
592
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100593/*
594 * Compares two buffers sector by sector. Returns 0 if the first sector of both
595 * buffers matches, non-zero otherwise.
596 *
597 * pnum is set to the number of sectors (including and immediately following
598 * the first one) that are known to have the same comparison result
599 */
600static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
601 int *pnum)
602{
603 int res, i;
604
605 if (n <= 0) {
606 *pnum = 0;
607 return 0;
608 }
609
610 res = !!memcmp(buf1, buf2, 512);
611 for(i = 1; i < n; i++) {
612 buf1 += 512;
613 buf2 += 512;
614
615 if (!!memcmp(buf1, buf2, 512) != res) {
616 break;
617 }
618 }
619
620 *pnum = i;
621 return res;
622}
623
Kevin Wolf80ee15a2009-09-15 12:30:43 +0200624#define IO_BUF_SIZE (2 * 1024 * 1024)
bellardea2384d2004-08-01 21:59:26 +0000625
626static int img_convert(int argc, char **argv)
627{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100628 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400629 int progress = 0, flags;
630 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900631 BlockDriver *drv, *proto_drv;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900632 BlockDriverState **bs = NULL, *out_bs = NULL;
ths96b8f132007-12-17 01:35:20 +0000633 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
634 uint64_t bs_sectors;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900635 uint8_t * buf = NULL;
bellardea2384d2004-08-01 21:59:26 +0000636 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +0000637 BlockDriverInfo bdi;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900638 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfa18953f2010-10-14 15:46:04 +0200639 QEMUOptionParameter *out_baseimg_param;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200640 char *options = NULL;
edison51ef6722010-09-21 19:58:41 -0700641 const char *snapshot_name = NULL;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200642 float local_progress;
bellardea2384d2004-08-01 21:59:26 +0000643
644 fmt = NULL;
645 out_fmt = "raw";
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400646 cache = "unsafe";
thsf58c7b32008-06-05 21:53:49 +0000647 out_baseimg = NULL;
Jes Sorenseneec77d92010-12-07 17:44:34 +0100648 compress = 0;
bellardea2384d2004-08-01 21:59:26 +0000649 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400650 c = getopt(argc, argv, "f:O:B:s:hce6o:pt:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100651 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000652 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100653 }
bellardea2384d2004-08-01 21:59:26 +0000654 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100655 case '?':
bellardea2384d2004-08-01 21:59:26 +0000656 case 'h':
657 help();
658 break;
659 case 'f':
660 fmt = optarg;
661 break;
662 case 'O':
663 out_fmt = optarg;
664 break;
thsf58c7b32008-06-05 21:53:49 +0000665 case 'B':
666 out_baseimg = optarg;
667 break;
bellardea2384d2004-08-01 21:59:26 +0000668 case 'c':
Jes Sorenseneec77d92010-12-07 17:44:34 +0100669 compress = 1;
bellardea2384d2004-08-01 21:59:26 +0000670 break;
671 case 'e':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200672 error_report("option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100673 "encryption\' instead!");
674 return 1;
thsec36ba12007-09-16 21:59:02 +0000675 case '6':
Markus Armbruster9d42e152011-06-22 14:03:55 +0200676 error_report("option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100677 "compat6\' instead!");
678 return 1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200679 case 'o':
680 options = optarg;
681 break;
edison51ef6722010-09-21 19:58:41 -0700682 case 's':
683 snapshot_name = optarg;
684 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200685 case 'p':
686 progress = 1;
687 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400688 case 't':
689 cache = optarg;
690 break;
bellardea2384d2004-08-01 21:59:26 +0000691 }
692 }
ths3b46e622007-09-17 08:09:54 +0000693
balrog926c2d22007-10-31 01:11:44 +0000694 bs_n = argc - optind - 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100695 if (bs_n < 1) {
696 help();
697 }
balrog926c2d22007-10-31 01:11:44 +0000698
699 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +0000700
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100701 if (options && !strcmp(options, "?")) {
702 ret = print_block_option_help(out_filename, out_fmt);
703 goto out;
704 }
705
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900706 if (bs_n > 1 && out_baseimg) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100707 error_report("-B makes no sense when concatenating multiple input "
708 "images");
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100709 ret = -1;
710 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900711 }
balrog926c2d22007-10-31 01:11:44 +0000712
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200713 qemu_progress_init(progress, 2.0);
714 qemu_progress_print(0, 100);
715
Jes Sorensen5bdf61f2010-12-06 15:25:35 +0100716 bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
balrog926c2d22007-10-31 01:11:44 +0000717
718 total_sectors = 0;
719 for (bs_i = 0; bs_i < bs_n; bs_i++) {
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100720 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900721 if (!bs[bs_i]) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100722 error_report("Could not open '%s'", argv[optind + bs_i]);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900723 ret = -1;
724 goto out;
725 }
balrog926c2d22007-10-31 01:11:44 +0000726 bdrv_get_geometry(bs[bs_i], &bs_sectors);
727 total_sectors += bs_sectors;
728 }
bellardea2384d2004-08-01 21:59:26 +0000729
edison51ef6722010-09-21 19:58:41 -0700730 if (snapshot_name != NULL) {
731 if (bs_n > 1) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200732 error_report("No support for concatenating multiple snapshot");
edison51ef6722010-09-21 19:58:41 -0700733 ret = -1;
734 goto out;
735 }
736 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200737 error_report("Failed to load snapshot");
edison51ef6722010-09-21 19:58:41 -0700738 ret = -1;
739 goto out;
740 }
741 }
742
Kevin Wolfefa84d42009-05-18 16:42:12 +0200743 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000744 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900745 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100746 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900747 ret = -1;
748 goto out;
749 }
balrog926c2d22007-10-31 01:11:44 +0000750
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900751 proto_drv = bdrv_find_protocol(out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900752 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100753 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900754 ret = -1;
755 goto out;
756 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900757
758 create_options = append_option_parameters(create_options,
759 drv->create_options);
760 create_options = append_option_parameters(create_options,
761 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200762
Kevin Wolfefa84d42009-05-18 16:42:12 +0200763 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900764 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200765 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100766 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900767 ret = -1;
768 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200769 }
770 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900771 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200772 }
773
774 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +0100775 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900776 if (ret < 0) {
777 goto out;
778 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200779
Kevin Wolfa18953f2010-10-14 15:46:04 +0200780 /* Get backing file name if -o backing_file was used */
781 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
782 if (out_baseimg_param) {
783 out_baseimg = out_baseimg_param->value.s;
784 }
785
Kevin Wolfefa84d42009-05-18 16:42:12 +0200786 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +0100787 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +0200788 QEMUOptionParameter *encryption =
789 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
790
791 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100792 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900793 ret = -1;
794 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200795 }
796
797 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100798 error_report("Compression and encryption not supported at "
799 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900800 ret = -1;
801 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200802 }
803 }
804
805 /* Create the new image */
806 ret = bdrv_create(drv, out_filename, param);
bellardea2384d2004-08-01 21:59:26 +0000807 if (ret < 0) {
808 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100809 error_report("Formatting not supported for file format '%s'",
810 out_fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000811 } else if (ret == -EFBIG) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100812 error_report("The image size is too large for file format '%s'",
813 out_fmt);
bellardea2384d2004-08-01 21:59:26 +0000814 } else {
Jes Sorensen15654a62010-12-16 14:31:53 +0100815 error_report("%s: error while converting %s: %s",
816 out_filename, out_fmt, strerror(-ret));
bellardea2384d2004-08-01 21:59:26 +0000817 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900818 goto out;
bellardea2384d2004-08-01 21:59:26 +0000819 }
ths3b46e622007-09-17 08:09:54 +0000820
Federico Simoncelli661a0f72011-06-20 12:48:19 -0400821 flags = BDRV_O_RDWR;
822 ret = set_cache_flag(cache, &flags);
823 if (ret < 0) {
824 error_report("Invalid cache option: %s", cache);
825 return -1;
826 }
827
828 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900829 if (!out_bs) {
830 ret = -1;
831 goto out;
832 }
bellardea2384d2004-08-01 21:59:26 +0000833
balrog926c2d22007-10-31 01:11:44 +0000834 bs_i = 0;
835 bs_offset = 0;
836 bdrv_get_geometry(bs[0], &bs_sectors);
TeLeMand6771bf2010-02-08 16:20:00 +0800837 buf = qemu_malloc(IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +0000838
Jes Sorenseneec77d92010-12-07 17:44:34 +0100839 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900840 ret = bdrv_get_info(out_bs, &bdi);
841 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100842 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900843 goto out;
844 }
bellardfaea38e2006-08-05 21:31:00 +0000845 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900846 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100847 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900848 ret = -1;
849 goto out;
850 }
bellardea2384d2004-08-01 21:59:26 +0000851 cluster_sectors = cluster_size >> 9;
852 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200853
854 nb_sectors = total_sectors;
855 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200856 (nb_sectors / MIN(nb_sectors, cluster_sectors));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200857
bellardea2384d2004-08-01 21:59:26 +0000858 for(;;) {
balrog926c2d22007-10-31 01:11:44 +0000859 int64_t bs_num;
860 int remainder;
861 uint8_t *buf2;
862
bellardea2384d2004-08-01 21:59:26 +0000863 nb_sectors = total_sectors - sector_num;
864 if (nb_sectors <= 0)
865 break;
866 if (nb_sectors >= cluster_sectors)
867 n = cluster_sectors;
868 else
869 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000870
871 bs_num = sector_num - bs_offset;
872 assert (bs_num >= 0);
873 remainder = n;
874 buf2 = buf;
875 while (remainder > 0) {
876 int nlow;
877 while (bs_num == bs_sectors) {
878 bs_i++;
879 assert (bs_i < bs_n);
880 bs_offset += bs_sectors;
881 bdrv_get_geometry(bs[bs_i], &bs_sectors);
882 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +0000883 /* printf("changing part: sector_num=%" PRId64 ", "
884 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
885 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +0000886 }
887 assert (bs_num < bs_sectors);
888
889 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
890
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900891 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
892 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100893 error_report("error while reading");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900894 goto out;
895 }
balrog926c2d22007-10-31 01:11:44 +0000896
897 buf2 += nlow * 512;
898 bs_num += nlow;
899
900 remainder -= nlow;
901 }
902 assert (remainder == 0);
903
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100904 if (n < cluster_sectors) {
bellardea2384d2004-08-01 21:59:26 +0000905 memset(buf + n * 512, 0, cluster_size - n * 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100906 }
bellardea2384d2004-08-01 21:59:26 +0000907 if (is_not_zero(buf, cluster_size)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900908 ret = bdrv_write_compressed(out_bs, sector_num, buf,
909 cluster_sectors);
910 if (ret != 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100911 error_report("error while compressing sector %" PRId64,
bellardec3757d2006-06-14 15:50:07 +0000912 sector_num);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900913 goto out;
914 }
bellardea2384d2004-08-01 21:59:26 +0000915 }
916 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200917 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +0000918 }
bellardfaea38e2006-08-05 21:31:00 +0000919 /* signal EOF to align */
920 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +0000921 } else {
Kevin Wolff2feebb2010-04-14 17:30:35 +0200922 int has_zero_init = bdrv_has_zero_init(out_bs);
923
thsf58c7b32008-06-05 21:53:49 +0000924 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200925 nb_sectors = total_sectors - sector_num;
926 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200927 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200928
bellardea2384d2004-08-01 21:59:26 +0000929 for(;;) {
930 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100931 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +0000932 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100933 }
934 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +0000935 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100936 } else {
bellardea2384d2004-08-01 21:59:26 +0000937 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100938 }
balrog926c2d22007-10-31 01:11:44 +0000939
940 while (sector_num - bs_offset >= bs_sectors) {
941 bs_i ++;
942 assert (bs_i < bs_n);
943 bs_offset += bs_sectors;
944 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +0000945 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
946 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +0000947 sector_num, bs_i, bs_offset, bs_sectors); */
948 }
949
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100950 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +0000951 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100952 }
balrog926c2d22007-10-31 01:11:44 +0000953
Kevin Wolff2feebb2010-04-14 17:30:35 +0200954 if (has_zero_init) {
Akkarit Sangpetchd0320442009-07-17 10:02:15 +0200955 /* If the output image is being created as a copy on write image,
956 assume that sectors which are unallocated in the input image
957 are present in both the output's and input's base images (no
958 need to copy them). */
959 if (out_baseimg) {
960 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
961 n, &n1)) {
962 sector_num += n1;
963 continue;
964 }
965 /* The next 'n1' sectors are allocated in the input image. Copy
966 only those as they may be followed by unallocated sectors. */
967 n = n1;
aliguori93c65b42009-04-05 17:40:43 +0000968 }
aliguori93c65b42009-04-05 17:40:43 +0000969 } else {
970 n1 = n;
thsf58c7b32008-06-05 21:53:49 +0000971 }
972
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900973 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
974 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100975 error_report("error while reading");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900976 goto out;
977 }
bellardea2384d2004-08-01 21:59:26 +0000978 /* NOTE: at the same time we convert, we do not write zero
979 sectors to have a chance to compress the image. Ideally, we
980 should add a specific call to have the info to go faster */
981 buf1 = buf;
982 while (n > 0) {
thsf58c7b32008-06-05 21:53:49 +0000983 /* If the output image is being created as a copy on write image,
984 copy all sectors even the ones containing only NUL bytes,
aliguori93c65b42009-04-05 17:40:43 +0000985 because they may differ from the sectors in the base image.
986
987 If the output is to a host device, we also write out
988 sectors that are entirely 0, since whatever data was
989 already there is garbage, not 0s. */
Kevin Wolff2feebb2010-04-14 17:30:35 +0200990 if (!has_zero_init || out_baseimg ||
aliguori93c65b42009-04-05 17:40:43 +0000991 is_allocated_sectors(buf1, n, &n1)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900992 ret = bdrv_write(out_bs, sector_num, buf1, n1);
993 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100994 error_report("error while writing");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900995 goto out;
996 }
bellardea2384d2004-08-01 21:59:26 +0000997 }
998 sector_num += n1;
999 n -= n1;
1000 buf1 += n1 * 512;
1001 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001002 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +00001003 }
1004 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001005out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001006 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001007 free_option_parameters(create_options);
1008 free_option_parameters(param);
TeLeMand6771bf2010-02-08 16:20:00 +08001009 qemu_free(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001010 if (out_bs) {
1011 bdrv_delete(out_bs);
1012 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001013 if (bs) {
1014 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1015 if (bs[bs_i]) {
1016 bdrv_delete(bs[bs_i]);
1017 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001018 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +01001019 qemu_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001020 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001021 if (ret) {
1022 return 1;
1023 }
bellardea2384d2004-08-01 21:59:26 +00001024 return 0;
1025}
1026
bellard57d1a2b2004-08-03 21:15:11 +00001027#ifdef _WIN32
1028static int64_t get_allocated_file_size(const char *filename)
1029{
bellarde8445332006-06-14 15:32:10 +00001030 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
1031 get_compressed_t get_compressed;
bellard57d1a2b2004-08-03 21:15:11 +00001032 struct _stati64 st;
bellarde8445332006-06-14 15:32:10 +00001033
1034 /* WinNT support GetCompressedFileSize to determine allocate size */
1035 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
1036 if (get_compressed) {
1037 DWORD high, low;
1038 low = get_compressed(filename, &high);
1039 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
1040 return (((int64_t) high) << 32) + low;
1041 }
1042
ths5fafdf22007-09-16 21:08:06 +00001043 if (_stati64(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +00001044 return -1;
1045 return st.st_size;
1046}
1047#else
1048static int64_t get_allocated_file_size(const char *filename)
1049{
1050 struct stat st;
ths5fafdf22007-09-16 21:08:06 +00001051 if (stat(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +00001052 return -1;
1053 return (int64_t)st.st_blocks * 512;
1054}
1055#endif
1056
bellardfaea38e2006-08-05 21:31:00 +00001057static void dump_snapshots(BlockDriverState *bs)
1058{
1059 QEMUSnapshotInfo *sn_tab, *sn;
1060 int nb_sns, i;
1061 char buf[256];
1062
1063 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1064 if (nb_sns <= 0)
1065 return;
1066 printf("Snapshot list:\n");
1067 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1068 for(i = 0; i < nb_sns; i++) {
1069 sn = &sn_tab[i];
1070 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1071 }
1072 qemu_free(sn_tab);
1073}
1074
bellardea2384d2004-08-01 21:59:26 +00001075static int img_info(int argc, char **argv)
1076{
1077 int c;
1078 const char *filename, *fmt;
bellardea2384d2004-08-01 21:59:26 +00001079 BlockDriverState *bs;
1080 char fmt_name[128], size_buf[128], dsize_buf[128];
ths96b8f132007-12-17 01:35:20 +00001081 uint64_t total_sectors;
1082 int64_t allocated_size;
bellard93b6b2a2006-08-01 15:51:11 +00001083 char backing_filename[1024];
1084 char backing_filename2[1024];
bellardfaea38e2006-08-05 21:31:00 +00001085 BlockDriverInfo bdi;
bellardea2384d2004-08-01 21:59:26 +00001086
1087 fmt = NULL;
1088 for(;;) {
1089 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001090 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001091 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001092 }
bellardea2384d2004-08-01 21:59:26 +00001093 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001094 case '?':
bellardea2384d2004-08-01 21:59:26 +00001095 case 'h':
1096 help();
1097 break;
1098 case 'f':
1099 fmt = optarg;
1100 break;
1101 }
1102 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001103 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +00001104 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001105 }
bellardea2384d2004-08-01 21:59:26 +00001106 filename = argv[optind++];
1107
Stefan Hajnocziadfe0782010-04-13 10:29:35 +01001108 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001109 if (!bs) {
1110 return 1;
1111 }
bellardea2384d2004-08-01 21:59:26 +00001112 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1113 bdrv_get_geometry(bs, &total_sectors);
1114 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
bellard57d1a2b2004-08-03 21:15:11 +00001115 allocated_size = get_allocated_file_size(filename);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001116 if (allocated_size < 0) {
blueswir1a10ea302008-08-24 10:30:33 +00001117 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001118 } else {
ths5fafdf22007-09-16 21:08:06 +00001119 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
bellardde167e42005-04-28 21:15:08 +00001120 allocated_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001121 }
bellardea2384d2004-08-01 21:59:26 +00001122 printf("image: %s\n"
1123 "file format: %s\n"
bellardec3757d2006-06-14 15:50:07 +00001124 "virtual size: %s (%" PRId64 " bytes)\n"
bellardea2384d2004-08-01 21:59:26 +00001125 "disk size: %s\n",
ths5fafdf22007-09-16 21:08:06 +00001126 filename, fmt_name, size_buf,
bellardec3757d2006-06-14 15:50:07 +00001127 (total_sectors * 512),
bellardea2384d2004-08-01 21:59:26 +00001128 dsize_buf);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001129 if (bdrv_is_encrypted(bs)) {
bellardea2384d2004-08-01 21:59:26 +00001130 printf("encrypted: yes\n");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001131 }
bellardfaea38e2006-08-05 21:31:00 +00001132 if (bdrv_get_info(bs, &bdi) >= 0) {
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001133 if (bdi.cluster_size != 0) {
bellardfaea38e2006-08-05 21:31:00 +00001134 printf("cluster_size: %d\n", bdi.cluster_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001135 }
bellardfaea38e2006-08-05 21:31:00 +00001136 }
bellard93b6b2a2006-08-01 15:51:11 +00001137 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
bellardfaea38e2006-08-05 21:31:00 +00001138 if (backing_filename[0] != '\0') {
bellard93b6b2a2006-08-01 15:51:11 +00001139 path_combine(backing_filename2, sizeof(backing_filename2),
1140 filename, backing_filename);
ths5fafdf22007-09-16 21:08:06 +00001141 printf("backing file: %s (actual path: %s)\n",
bellard93b6b2a2006-08-01 15:51:11 +00001142 backing_filename,
1143 backing_filename2);
bellardfaea38e2006-08-05 21:31:00 +00001144 }
1145 dump_snapshots(bs);
bellardea2384d2004-08-01 21:59:26 +00001146 bdrv_delete(bs);
1147 return 0;
1148}
1149
aliguorif7b4a942009-01-07 17:40:15 +00001150#define SNAPSHOT_LIST 1
1151#define SNAPSHOT_CREATE 2
1152#define SNAPSHOT_APPLY 3
1153#define SNAPSHOT_DELETE 4
1154
Stuart Brady153859b2009-06-07 00:42:17 +01001155static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00001156{
1157 BlockDriverState *bs;
1158 QEMUSnapshotInfo sn;
1159 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001160 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00001161 int action = 0;
1162 qemu_timeval tv;
1163
Kevin Wolf710da702011-01-10 12:33:02 +01001164 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00001165 /* Parse commandline parameters */
1166 for(;;) {
1167 c = getopt(argc, argv, "la:c:d:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001168 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00001169 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001170 }
aliguorif7b4a942009-01-07 17:40:15 +00001171 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001172 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00001173 case 'h':
1174 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001175 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001176 case 'l':
1177 if (action) {
1178 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001179 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001180 }
1181 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02001182 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00001183 break;
1184 case 'a':
1185 if (action) {
1186 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001187 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001188 }
1189 action = SNAPSHOT_APPLY;
1190 snapshot_name = optarg;
1191 break;
1192 case 'c':
1193 if (action) {
1194 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001195 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001196 }
1197 action = SNAPSHOT_CREATE;
1198 snapshot_name = optarg;
1199 break;
1200 case 'd':
1201 if (action) {
1202 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001203 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001204 }
1205 action = SNAPSHOT_DELETE;
1206 snapshot_name = optarg;
1207 break;
1208 }
1209 }
1210
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001211 if (optind >= argc) {
aliguorif7b4a942009-01-07 17:40:15 +00001212 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001213 }
aliguorif7b4a942009-01-07 17:40:15 +00001214 filename = argv[optind++];
1215
1216 /* Open the image */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001217 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001218 if (!bs) {
1219 return 1;
1220 }
aliguorif7b4a942009-01-07 17:40:15 +00001221
1222 /* Perform the requested action */
1223 switch(action) {
1224 case SNAPSHOT_LIST:
1225 dump_snapshots(bs);
1226 break;
1227
1228 case SNAPSHOT_CREATE:
1229 memset(&sn, 0, sizeof(sn));
1230 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1231
1232 qemu_gettimeofday(&tv);
1233 sn.date_sec = tv.tv_sec;
1234 sn.date_nsec = tv.tv_usec * 1000;
1235
1236 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001237 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001238 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001239 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001240 }
aliguorif7b4a942009-01-07 17:40:15 +00001241 break;
1242
1243 case SNAPSHOT_APPLY:
1244 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001245 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001246 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001247 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001248 }
aliguorif7b4a942009-01-07 17:40:15 +00001249 break;
1250
1251 case SNAPSHOT_DELETE:
1252 ret = bdrv_snapshot_delete(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001253 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001254 error_report("Could not delete snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001255 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001256 }
aliguorif7b4a942009-01-07 17:40:15 +00001257 break;
1258 }
1259
1260 /* Cleanup */
1261 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001262 if (ret) {
1263 return 1;
1264 }
Stuart Brady153859b2009-06-07 00:42:17 +01001265 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001266}
1267
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001268static int img_rebase(int argc, char **argv)
1269{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001270 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001271 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001272 char *filename;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001273 const char *fmt, *cache, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001274 int c, flags, ret;
1275 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001276 int progress = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001277
1278 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001279 fmt = NULL;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001280 cache = BDRV_DEFAULT_CACHE;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001281 out_baseimg = NULL;
1282 out_basefmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001283 for(;;) {
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001284 c = getopt(argc, argv, "uhf:F:b:pt:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001285 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001286 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001287 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001288 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001289 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001290 case 'h':
1291 help();
1292 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001293 case 'f':
1294 fmt = optarg;
1295 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001296 case 'F':
1297 out_basefmt = optarg;
1298 break;
1299 case 'b':
1300 out_baseimg = optarg;
1301 break;
1302 case 'u':
1303 unsafe = 1;
1304 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001305 case 'p':
1306 progress = 1;
1307 break;
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001308 case 't':
1309 cache = optarg;
1310 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001311 }
1312 }
1313
Anthony Liguori9a9d9db2011-04-13 15:51:47 +01001314 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001315 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001316 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001317 filename = argv[optind++];
1318
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001319 qemu_progress_init(progress, 2.0);
1320 qemu_progress_print(0, 100);
1321
Federico Simoncelli661a0f72011-06-20 12:48:19 -04001322 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1323 ret = set_cache_flag(cache, &flags);
1324 if (ret < 0) {
1325 error_report("Invalid cache option: %s", cache);
1326 return -1;
1327 }
1328
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001329 /*
1330 * Open the images.
1331 *
1332 * Ignore the old backing file for unsafe rebase in case we want to correct
1333 * the reference to a renamed or moved backing file.
1334 */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001335 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001336 if (!bs) {
1337 return 1;
1338 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001339
1340 /* Find the right drivers for the backing files */
1341 old_backing_drv = NULL;
1342 new_backing_drv = NULL;
1343
1344 if (!unsafe && bs->backing_format[0] != '\0') {
1345 old_backing_drv = bdrv_find_format(bs->backing_format);
1346 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001347 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001348 ret = -1;
1349 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001350 }
1351 }
1352
1353 if (out_basefmt != NULL) {
1354 new_backing_drv = bdrv_find_format(out_basefmt);
1355 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001356 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001357 ret = -1;
1358 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001359 }
1360 }
1361
1362 /* For safe rebasing we need to compare old and new backing file */
1363 if (unsafe) {
1364 /* Make the compiler happy */
1365 bs_old_backing = NULL;
1366 bs_new_backing = NULL;
1367 } else {
1368 char backing_name[1024];
1369
1370 bs_old_backing = bdrv_new("old_backing");
1371 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001372 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1373 old_backing_drv);
1374 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001375 error_report("Could not open old backing file '%s'", backing_name);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001376 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001377 }
1378
1379 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfcdbae852010-08-17 18:58:55 +02001380 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001381 new_backing_drv);
1382 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001383 error_report("Could not open new backing file '%s'", out_baseimg);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001384 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001385 }
1386 }
1387
1388 /*
1389 * Check each unallocated cluster in the COW file. If it is unallocated,
1390 * accesses go to the backing file. We must therefore compare this cluster
1391 * in the old and new backing file, and if they differ we need to copy it
1392 * from the old backing file into the COW file.
1393 *
1394 * If qemu-img crashes during this step, no harm is done. The content of
1395 * the image is the same as the original one at any time.
1396 */
1397 if (!unsafe) {
1398 uint64_t num_sectors;
1399 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02001400 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08001401 uint8_t * buf_old;
1402 uint8_t * buf_new;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001403 float local_progress;
TeLeMand6771bf2010-02-08 16:20:00 +08001404
1405 buf_old = qemu_malloc(IO_BUF_SIZE);
1406 buf_new = qemu_malloc(IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001407
1408 bdrv_get_geometry(bs, &num_sectors);
1409
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001410 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +02001411 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001412 for (sector = 0; sector < num_sectors; sector += n) {
1413
1414 /* How many sectors can we handle with the next read? */
1415 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1416 n = (IO_BUF_SIZE / 512);
1417 } else {
1418 n = num_sectors - sector;
1419 }
1420
1421 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02001422 ret = bdrv_is_allocated(bs, sector, n, &n);
1423 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001424 continue;
1425 }
1426
1427 /* Read old and new backing file */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001428 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1429 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001430 error_report("error while reading from old backing file");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001431 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001432 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001433 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1434 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001435 error_report("error while reading from new backing file");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001436 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001437 }
1438
1439 /* If they differ, we need to write to the COW file */
1440 uint64_t written = 0;
1441
1442 while (written < n) {
1443 int pnum;
1444
1445 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01001446 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001447 {
1448 ret = bdrv_write(bs, sector + written,
1449 buf_old + written * 512, pnum);
1450 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001451 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001452 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001453 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001454 }
1455 }
1456
1457 written += pnum;
1458 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001459 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001460 }
TeLeMand6771bf2010-02-08 16:20:00 +08001461
1462 qemu_free(buf_old);
1463 qemu_free(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001464 }
1465
1466 /*
1467 * Change the backing file. All clusters that are different from the old
1468 * backing file are overwritten in the COW file now, so the visible content
1469 * doesn't change when we switch the backing file.
1470 */
1471 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1472 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001473 error_report("Could not change the backing file to '%s': No "
1474 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001475 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001476 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001477 out_baseimg, strerror(-ret));
1478 }
1479
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001480 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001481 /*
1482 * TODO At this point it is possible to check if any clusters that are
1483 * allocated in the COW file are the same in the backing file. If so, they
1484 * could be dropped from the COW file. Don't do this before switching the
1485 * backing file, in case of a crash this would lead to corruption.
1486 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001487out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001488 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001489 /* Cleanup */
1490 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02001491 if (bs_old_backing != NULL) {
1492 bdrv_delete(bs_old_backing);
1493 }
1494 if (bs_new_backing != NULL) {
1495 bdrv_delete(bs_new_backing);
1496 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001497 }
1498
1499 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001500 if (ret) {
1501 return 1;
1502 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001503 return 0;
1504}
1505
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001506static int img_resize(int argc, char **argv)
1507{
1508 int c, ret, relative;
1509 const char *filename, *fmt, *size;
1510 int64_t n, total_size;
Jes Sorensen2a819982010-12-06 17:08:31 +01001511 BlockDriverState *bs = NULL;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001512 QEMUOptionParameter *param;
1513 QEMUOptionParameter resize_options[] = {
1514 {
1515 .name = BLOCK_OPT_SIZE,
1516 .type = OPT_SIZE,
1517 .help = "Virtual disk size"
1518 },
1519 { NULL }
1520 };
1521
Kevin Wolfe80fec72011-04-29 10:58:12 +02001522 /* Remove size from argv manually so that negative numbers are not treated
1523 * as options by getopt. */
1524 if (argc < 3) {
1525 help();
1526 return 1;
1527 }
1528
1529 size = argv[--argc];
1530
1531 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001532 fmt = NULL;
1533 for(;;) {
1534 c = getopt(argc, argv, "f:h");
1535 if (c == -1) {
1536 break;
1537 }
1538 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001539 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001540 case 'h':
1541 help();
1542 break;
1543 case 'f':
1544 fmt = optarg;
1545 break;
1546 }
1547 }
Kevin Wolfe80fec72011-04-29 10:58:12 +02001548 if (optind >= argc) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001549 help();
1550 }
1551 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001552
1553 /* Choose grow, shrink, or absolute resize mode */
1554 switch (size[0]) {
1555 case '+':
1556 relative = 1;
1557 size++;
1558 break;
1559 case '-':
1560 relative = -1;
1561 size++;
1562 break;
1563 default:
1564 relative = 0;
1565 break;
1566 }
1567
1568 /* Parse size */
1569 param = parse_option_parameters("", resize_options, NULL);
1570 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1571 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01001572 ret = -1;
1573 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001574 }
1575 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1576 free_option_parameters(param);
1577
1578 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001579 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01001580 ret = -1;
1581 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001582 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001583
1584 if (relative) {
1585 total_size = bdrv_getlength(bs) + n * relative;
1586 } else {
1587 total_size = n;
1588 }
1589 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001590 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001591 ret = -1;
1592 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001593 }
1594
1595 ret = bdrv_truncate(bs, total_size);
1596 switch (ret) {
1597 case 0:
1598 printf("Image resized.\n");
1599 break;
1600 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +01001601 error_report("This image format does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001602 break;
1603 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01001604 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001605 break;
1606 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01001607 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001608 break;
1609 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001610out:
Jes Sorensen2a819982010-12-06 17:08:31 +01001611 if (bs) {
1612 bdrv_delete(bs);
1613 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001614 if (ret) {
1615 return 1;
1616 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001617 return 0;
1618}
1619
Anthony Liguoric227f092009-10-01 16:12:16 -05001620static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01001621#define DEF(option, callback, arg_string) \
1622 { option, callback },
1623#include "qemu-img-cmds.h"
1624#undef DEF
1625#undef GEN_DOCS
1626 { NULL, NULL, },
1627};
1628
bellardea2384d2004-08-01 21:59:26 +00001629int main(int argc, char **argv)
1630{
Anthony Liguoric227f092009-10-01 16:12:16 -05001631 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01001632 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00001633
Kevin Wolf53f76e52010-12-16 15:10:32 +01001634 error_set_progname(argv[0]);
1635
bellardea2384d2004-08-01 21:59:26 +00001636 bdrv_init();
1637 if (argc < 2)
1638 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001639 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00001640 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01001641
1642 /* find the command */
1643 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1644 if (!strcmp(cmdname, cmd->name)) {
1645 return cmd->handler(argc, argv);
1646 }
bellardea2384d2004-08-01 21:59:26 +00001647 }
Stuart Brady153859b2009-06-07 00:42:17 +01001648
1649 /* not found */
1650 help();
bellardea2384d2004-08-01 21:59:26 +00001651 return 0;
1652}