blob: 1a3782856c39276cf574bb63b53227319b3fba52 [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
aurel32137519c2008-11-30 19:12:49 +000043
bellardea2384d2004-08-01 21:59:26 +000044static void format_print(void *opaque, const char *name)
45{
46 printf(" %s", name);
47}
48
blueswir1d2c639d2009-01-24 18:19:25 +000049/* Please keep in synch with qemu-img.texi */
pbrook3f379ab2007-11-11 03:33:13 +000050static void help(void)
bellardea2384d2004-08-01 21:59:26 +000051{
Paolo Bonzinie00291c2010-02-04 16:49:56 +010052 const char *help_msg =
53 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
malc3f020d72010-02-08 12:04:56 +030054 "usage: qemu-img command [command options]\n"
55 "QEMU disk image utility\n"
56 "\n"
57 "Command syntax:\n"
Stuart Brady153859b2009-06-07 00:42:17 +010058#define DEF(option, callback, arg_string) \
59 " " arg_string "\n"
60#include "qemu-img-cmds.h"
61#undef DEF
62#undef GEN_DOCS
malc3f020d72010-02-08 12:04:56 +030063 "\n"
64 "Command parameters:\n"
65 " 'filename' is a disk image filename\n"
66 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
67 " 'size' is the disk image size in bytes. Optional suffixes\n"
68 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
69 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
70 " 'output_filename' is the destination disk image filename\n"
71 " 'output_fmt' is the destination format\n"
72 " 'options' is a comma separated list of format specific options in a\n"
73 " name=value format. Use -o ? for an overview of the options supported by the\n"
74 " used format\n"
75 " '-c' indicates that target image must be compressed (qcow format only)\n"
76 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
77 " match exactly. The image doesn't need a working backing file before\n"
78 " rebasing in this case (useful for renaming the backing file)\n"
79 " '-h' with or without a command shows this help and lists the supported formats\n"
Jes Sorensen6b837bc2011-03-30 14:16:25 +020080 " '-p' show progress of command (only certain commands)\n"
malc3f020d72010-02-08 12:04:56 +030081 "\n"
82 "Parameters to snapshot subcommand:\n"
83 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
84 " '-a' applies a snapshot (revert disk to saved state)\n"
85 " '-c' creates a snapshot\n"
86 " '-d' deletes a snapshot\n"
Paolo Bonzinie00291c2010-02-04 16:49:56 +010087 " '-l' lists all snapshots in the given image\n";
88
89 printf("%s\nSupported formats:", help_msg);
bellardea2384d2004-08-01 21:59:26 +000090 bdrv_iterate_format(format_print, NULL);
91 printf("\n");
92 exit(1);
93}
94
bellardea2384d2004-08-01 21:59:26 +000095#if defined(WIN32)
96/* XXX: put correct support for win32 */
97static int read_password(char *buf, int buf_size)
98{
99 int c, i;
100 printf("Password: ");
101 fflush(stdout);
102 i = 0;
103 for(;;) {
104 c = getchar();
105 if (c == '\n')
106 break;
107 if (i < (buf_size - 1))
108 buf[i++] = c;
109 }
110 buf[i] = '\0';
111 return 0;
112}
113
114#else
115
116#include <termios.h>
117
118static struct termios oldtty;
119
120static void term_exit(void)
121{
122 tcsetattr (0, TCSANOW, &oldtty);
123}
124
125static void term_init(void)
126{
127 struct termios tty;
128
129 tcgetattr (0, &tty);
130 oldtty = tty;
131
132 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
133 |INLCR|IGNCR|ICRNL|IXON);
134 tty.c_oflag |= OPOST;
135 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
136 tty.c_cflag &= ~(CSIZE|PARENB);
137 tty.c_cflag |= CS8;
138 tty.c_cc[VMIN] = 1;
139 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +0000140
bellardea2384d2004-08-01 21:59:26 +0000141 tcsetattr (0, TCSANOW, &tty);
142
143 atexit(term_exit);
144}
145
pbrook3f379ab2007-11-11 03:33:13 +0000146static int read_password(char *buf, int buf_size)
bellardea2384d2004-08-01 21:59:26 +0000147{
148 uint8_t ch;
149 int i, ret;
150
151 printf("password: ");
152 fflush(stdout);
153 term_init();
154 i = 0;
155 for(;;) {
156 ret = read(0, &ch, 1);
157 if (ret == -1) {
158 if (errno == EAGAIN || errno == EINTR) {
159 continue;
160 } else {
161 ret = -1;
162 break;
163 }
164 } else if (ret == 0) {
165 ret = -1;
166 break;
167 } else {
168 if (ch == '\r') {
169 ret = 0;
170 break;
171 }
172 if (i < (buf_size - 1))
173 buf[i++] = ch;
174 }
175 }
176 term_exit();
177 buf[i] = '\0';
178 printf("\n");
179 return ret;
180}
181#endif
182
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100183static int print_block_option_help(const char *filename, const char *fmt)
184{
185 BlockDriver *drv, *proto_drv;
186 QEMUOptionParameter *create_options = NULL;
187
188 /* Find driver and parse its options */
189 drv = bdrv_find_format(fmt);
190 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100191 error_report("Unknown file format '%s'", fmt);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100192 return 1;
193 }
194
195 proto_drv = bdrv_find_protocol(filename);
196 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100197 error_report("Unknown protocol '%s'", filename);
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100198 return 1;
199 }
200
201 create_options = append_option_parameters(create_options,
202 drv->create_options);
203 create_options = append_option_parameters(create_options,
204 proto_drv->create_options);
205 print_option_help(create_options);
206 free_option_parameters(create_options);
207 return 0;
208}
209
bellard75c23802004-08-27 21:28:58 +0000210static BlockDriverState *bdrv_new_open(const char *filename,
Sheng Yang9bc378c2010-01-29 10:15:06 +0800211 const char *fmt,
Stefan Hajnoczif163d072010-04-13 10:29:34 +0100212 int flags)
bellard75c23802004-08-27 21:28:58 +0000213{
214 BlockDriverState *bs;
215 BlockDriver *drv;
216 char password[256];
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100217 int ret;
bellard75c23802004-08-27 21:28:58 +0000218
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100219 bs = bdrv_new("image");
Kevin Wolfad717132010-12-16 15:37:41 +0100220
bellard75c23802004-08-27 21:28:58 +0000221 if (fmt) {
222 drv = bdrv_find_format(fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900223 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100224 error_report("Unknown file format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900225 goto fail;
226 }
bellard75c23802004-08-27 21:28:58 +0000227 } else {
228 drv = NULL;
229 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100230
231 ret = bdrv_open(bs, filename, flags, drv);
232 if (ret < 0) {
233 error_report("Could not open '%s': %s", filename, strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900234 goto fail;
bellard75c23802004-08-27 21:28:58 +0000235 }
Kevin Wolfb9eaf9e2011-02-09 11:25:53 +0100236
bellard75c23802004-08-27 21:28:58 +0000237 if (bdrv_is_encrypted(bs)) {
238 printf("Disk image '%s' is encrypted.\n", filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900239 if (read_password(password, sizeof(password)) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100240 error_report("No password given");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900241 goto fail;
242 }
243 if (bdrv_set_key(bs, password) < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100244 error_report("invalid password");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900245 goto fail;
246 }
bellard75c23802004-08-27 21:28:58 +0000247 }
248 return bs;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900249fail:
250 if (bs) {
251 bdrv_delete(bs);
252 }
253 return NULL;
bellard75c23802004-08-27 21:28:58 +0000254}
255
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900256static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
Jes Sorenseneec77d92010-12-07 17:44:34 +0100257 const char *base_filename,
258 const char *base_fmt)
Kevin Wolfefa84d42009-05-18 16:42:12 +0200259{
Kevin Wolfefa84d42009-05-18 16:42:12 +0200260 if (base_filename) {
261 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100262 error_report("Backing file not supported for file format '%s'",
263 fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900264 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200265 }
266 }
267 if (base_fmt) {
268 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100269 error_report("Backing file format not supported for file "
270 "format '%s'", fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900271 return -1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200272 }
273 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900274 return 0;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200275}
276
bellardea2384d2004-08-01 21:59:26 +0000277static int img_create(int argc, char **argv)
278{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100279 int c, ret = 0;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100280 uint64_t img_size = -1;
bellardea2384d2004-08-01 21:59:26 +0000281 const char *fmt = "raw";
aliguori9230eaf2009-03-28 17:55:19 +0000282 const char *base_fmt = NULL;
bellardea2384d2004-08-01 21:59:26 +0000283 const char *filename;
284 const char *base_filename = NULL;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200285 char *options = NULL;
ths3b46e622007-09-17 08:09:54 +0000286
bellardea2384d2004-08-01 21:59:26 +0000287 for(;;) {
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200288 c = getopt(argc, argv, "F:b:f:he6o:");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100289 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000290 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100291 }
bellardea2384d2004-08-01 21:59:26 +0000292 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100293 case '?':
bellardea2384d2004-08-01 21:59:26 +0000294 case 'h':
295 help();
296 break;
aliguori9230eaf2009-03-28 17:55:19 +0000297 case 'F':
298 base_fmt = optarg;
299 break;
bellardea2384d2004-08-01 21:59:26 +0000300 case 'b':
301 base_filename = optarg;
302 break;
303 case 'f':
304 fmt = optarg;
305 break;
306 case 'e':
Jes Sorensen15654a62010-12-16 14:31:53 +0100307 error_report("qemu-img: option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100308 "encryption\' instead!");
309 return 1;
thsd8871c52007-10-24 16:11:42 +0000310 case '6':
Jes Sorensen15654a62010-12-16 14:31:53 +0100311 error_report("qemu-img: option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100312 "compat6\' instead!");
313 return 1;
Kevin Wolf9ea2ea72009-05-18 16:42:11 +0200314 case 'o':
315 options = optarg;
316 break;
bellardea2384d2004-08-01 21:59:26 +0000317 }
318 }
aliguori9230eaf2009-03-28 17:55:19 +0000319
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900320 /* Get the filename */
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100321 if (optind >= argc) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900322 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100323 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900324 filename = argv[optind++];
325
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100326 /* Get image size, if specified */
327 if (optind < argc) {
Jes Sorensen70b4f4b2011-01-05 11:41:02 +0100328 int64_t sval;
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100329 sval = strtosz_suffix(argv[optind++], NULL, STRTOSZ_DEFSUFFIX_B);
330 if (sval < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100331 error_report("Invalid image size specified! You may use k, M, G or "
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100332 "T suffixes for ");
Jes Sorensen15654a62010-12-16 14:31:53 +0100333 error_report("kilobytes, megabytes, gigabytes and terabytes.");
Jes Sorensen1da7cfb2010-12-09 14:17:25 +0100334 ret = -1;
335 goto out;
336 }
337 img_size = (uint64_t)sval;
338 }
339
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100340 if (options && !strcmp(options, "?")) {
341 ret = print_block_option_help(filename, fmt);
342 goto out;
343 }
344
Jes Sorensenf88e1a42010-12-16 13:52:15 +0100345 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
346 options, img_size, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900347out:
348 if (ret) {
349 return 1;
350 }
bellardea2384d2004-08-01 21:59:26 +0000351 return 0;
352}
353
Kevin Wolfe076f332010-06-29 11:43:13 +0200354/*
355 * Checks an image for consistency. Exit codes:
356 *
357 * 0 - Check completed, image is good
358 * 1 - Check not completed because of internal errors
359 * 2 - Check completed, image is corrupted
360 * 3 - Check completed, image has leaked clusters, but is good otherwise
361 */
aliguori15859692009-04-21 23:11:53 +0000362static int img_check(int argc, char **argv)
363{
364 int c, ret;
365 const char *filename, *fmt;
aliguori15859692009-04-21 23:11:53 +0000366 BlockDriverState *bs;
Kevin Wolfe076f332010-06-29 11:43:13 +0200367 BdrvCheckResult result;
aliguori15859692009-04-21 23:11:53 +0000368
369 fmt = NULL;
370 for(;;) {
371 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100372 if (c == -1) {
aliguori15859692009-04-21 23:11:53 +0000373 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100374 }
aliguori15859692009-04-21 23:11:53 +0000375 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100376 case '?':
aliguori15859692009-04-21 23:11:53 +0000377 case 'h':
378 help();
379 break;
380 case 'f':
381 fmt = optarg;
382 break;
383 }
384 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100385 if (optind >= argc) {
aliguori15859692009-04-21 23:11:53 +0000386 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100387 }
aliguori15859692009-04-21 23:11:53 +0000388 filename = argv[optind++];
389
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100390 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900391 if (!bs) {
392 return 1;
393 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200394 ret = bdrv_check(bs, &result);
395
396 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100397 error_report("This image format does not support checks");
Kevin Wolfe076f332010-06-29 11:43:13 +0200398 bdrv_delete(bs);
399 return 1;
400 }
401
402 if (!(result.corruptions || result.leaks || result.check_errors)) {
403 printf("No errors were found on the image.\n");
404 } else {
405 if (result.corruptions) {
406 printf("\n%d errors were found on the image.\n"
407 "Data may be corrupted, or further writes to the image "
408 "may corrupt it.\n",
409 result.corruptions);
aliguori15859692009-04-21 23:11:53 +0000410 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200411
412 if (result.leaks) {
413 printf("\n%d leaked clusters were found on the image.\n"
414 "This means waste of disk space, but no harm to data.\n",
415 result.leaks);
416 }
417
418 if (result.check_errors) {
419 printf("\n%d internal errors have occurred during the check.\n",
420 result.check_errors);
421 }
aliguori15859692009-04-21 23:11:53 +0000422 }
423
424 bdrv_delete(bs);
Kevin Wolfe076f332010-06-29 11:43:13 +0200425
426 if (ret < 0 || result.check_errors) {
427 printf("\nAn error has occurred during the check: %s\n"
428 "The check is not complete and may have missed error.\n",
429 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900430 return 1;
431 }
Kevin Wolfe076f332010-06-29 11:43:13 +0200432
433 if (result.corruptions) {
434 return 2;
435 } else if (result.leaks) {
436 return 3;
437 } else {
438 return 0;
439 }
aliguori15859692009-04-21 23:11:53 +0000440}
441
bellardea2384d2004-08-01 21:59:26 +0000442static int img_commit(int argc, char **argv)
443{
444 int c, ret;
445 const char *filename, *fmt;
bellardea2384d2004-08-01 21:59:26 +0000446 BlockDriverState *bs;
447
448 fmt = NULL;
449 for(;;) {
450 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100451 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000452 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100453 }
bellardea2384d2004-08-01 21:59:26 +0000454 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100455 case '?':
bellardea2384d2004-08-01 21:59:26 +0000456 case 'h':
457 help();
458 break;
459 case 'f':
460 fmt = optarg;
461 break;
462 }
463 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100464 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +0000465 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100466 }
bellardea2384d2004-08-01 21:59:26 +0000467 filename = argv[optind++];
468
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100469 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900470 if (!bs) {
471 return 1;
472 }
bellardea2384d2004-08-01 21:59:26 +0000473 ret = bdrv_commit(bs);
474 switch(ret) {
475 case 0:
476 printf("Image committed.\n");
477 break;
478 case -ENOENT:
Jes Sorensen15654a62010-12-16 14:31:53 +0100479 error_report("No disk inserted");
bellardea2384d2004-08-01 21:59:26 +0000480 break;
481 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +0100482 error_report("Image is read-only");
bellardea2384d2004-08-01 21:59:26 +0000483 break;
484 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +0100485 error_report("Image is already committed");
bellardea2384d2004-08-01 21:59:26 +0000486 break;
487 default:
Jes Sorensen15654a62010-12-16 14:31:53 +0100488 error_report("Error while committing image");
bellardea2384d2004-08-01 21:59:26 +0000489 break;
490 }
491
492 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900493 if (ret) {
494 return 1;
495 }
bellardea2384d2004-08-01 21:59:26 +0000496 return 0;
497}
498
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400499/*
500 * Checks whether the sector is not a zero sector.
501 *
502 * Attention! The len must be a multiple of 4 * sizeof(long) due to
503 * restriction of optimizations in this function.
504 */
bellardea2384d2004-08-01 21:59:26 +0000505static int is_not_zero(const uint8_t *sector, int len)
506{
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400507 /*
508 * Use long as the biggest available internal data type that fits into the
509 * CPU register and unroll the loop to smooth out the effect of memory
510 * latency.
511 */
512
bellardea2384d2004-08-01 21:59:26 +0000513 int i;
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400514 long d0, d1, d2, d3;
515 const long * const data = (const long *) sector;
516
517 len /= sizeof(long);
518
519 for(i = 0; i < len; i += 4) {
520 d0 = data[i + 0];
521 d1 = data[i + 1];
522 d2 = data[i + 2];
523 d3 = data[i + 3];
524
525 if (d0 || d1 || d2 || d3) {
bellardea2384d2004-08-01 21:59:26 +0000526 return 1;
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400527 }
bellardea2384d2004-08-01 21:59:26 +0000528 }
Dmitry Konishchevf6a00aa2011-05-18 15:03:59 +0400529
bellardea2384d2004-08-01 21:59:26 +0000530 return 0;
531}
532
thsf58c7b32008-06-05 21:53:49 +0000533/*
534 * Returns true iff the first sector pointed to by 'buf' contains at least
535 * a non-NUL byte.
536 *
537 * 'pnum' is set to the number of sectors (including and immediately following
538 * the first one) that are known to be in the same allocated/unallocated state.
539 */
bellardea2384d2004-08-01 21:59:26 +0000540static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
541{
542 int v, i;
543
544 if (n <= 0) {
545 *pnum = 0;
546 return 0;
547 }
548 v = is_not_zero(buf, 512);
549 for(i = 1; i < n; i++) {
550 buf += 512;
551 if (v != is_not_zero(buf, 512))
552 break;
553 }
554 *pnum = i;
555 return v;
556}
557
Kevin Wolf3e85c6f2010-01-12 12:55:18 +0100558/*
559 * Compares two buffers sector by sector. Returns 0 if the first sector of both
560 * buffers matches, non-zero otherwise.
561 *
562 * pnum is set to the number of sectors (including and immediately following
563 * the first one) that are known to have the same comparison result
564 */
565static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
566 int *pnum)
567{
568 int res, i;
569
570 if (n <= 0) {
571 *pnum = 0;
572 return 0;
573 }
574
575 res = !!memcmp(buf1, buf2, 512);
576 for(i = 1; i < n; i++) {
577 buf1 += 512;
578 buf2 += 512;
579
580 if (!!memcmp(buf1, buf2, 512) != res) {
581 break;
582 }
583 }
584
585 *pnum = i;
586 return res;
587}
588
Kevin Wolf80ee15a2009-09-15 12:30:43 +0200589#define IO_BUF_SIZE (2 * 1024 * 1024)
bellardea2384d2004-08-01 21:59:26 +0000590
591static int img_convert(int argc, char **argv)
592{
Jes Sorenseneec77d92010-12-07 17:44:34 +0100593 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200594 int progress = 0;
thsf58c7b32008-06-05 21:53:49 +0000595 const char *fmt, *out_fmt, *out_baseimg, *out_filename;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900596 BlockDriver *drv, *proto_drv;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900597 BlockDriverState **bs = NULL, *out_bs = NULL;
ths96b8f132007-12-17 01:35:20 +0000598 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
599 uint64_t bs_sectors;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900600 uint8_t * buf = NULL;
bellardea2384d2004-08-01 21:59:26 +0000601 const uint8_t *buf1;
bellardfaea38e2006-08-05 21:31:00 +0000602 BlockDriverInfo bdi;
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900603 QEMUOptionParameter *param = NULL, *create_options = NULL;
Kevin Wolfa18953f2010-10-14 15:46:04 +0200604 QEMUOptionParameter *out_baseimg_param;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200605 char *options = NULL;
edison51ef6722010-09-21 19:58:41 -0700606 const char *snapshot_name = NULL;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200607 float local_progress;
bellardea2384d2004-08-01 21:59:26 +0000608
609 fmt = NULL;
610 out_fmt = "raw";
thsf58c7b32008-06-05 21:53:49 +0000611 out_baseimg = NULL;
Jes Sorenseneec77d92010-12-07 17:44:34 +0100612 compress = 0;
bellardea2384d2004-08-01 21:59:26 +0000613 for(;;) {
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200614 c = getopt(argc, argv, "f:O:B:s:hce6o:p");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100615 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +0000616 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100617 }
bellardea2384d2004-08-01 21:59:26 +0000618 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +0100619 case '?':
bellardea2384d2004-08-01 21:59:26 +0000620 case 'h':
621 help();
622 break;
623 case 'f':
624 fmt = optarg;
625 break;
626 case 'O':
627 out_fmt = optarg;
628 break;
thsf58c7b32008-06-05 21:53:49 +0000629 case 'B':
630 out_baseimg = optarg;
631 break;
bellardea2384d2004-08-01 21:59:26 +0000632 case 'c':
Jes Sorenseneec77d92010-12-07 17:44:34 +0100633 compress = 1;
bellardea2384d2004-08-01 21:59:26 +0000634 break;
635 case 'e':
Jes Sorensen15654a62010-12-16 14:31:53 +0100636 error_report("qemu-img: option -e is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100637 "encryption\' instead!");
638 return 1;
thsec36ba12007-09-16 21:59:02 +0000639 case '6':
Jes Sorensen15654a62010-12-16 14:31:53 +0100640 error_report("qemu-img: option -6 is deprecated, please use \'-o "
Jes Sorenseneec77d92010-12-07 17:44:34 +0100641 "compat6\' instead!");
642 return 1;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200643 case 'o':
644 options = optarg;
645 break;
edison51ef6722010-09-21 19:58:41 -0700646 case 's':
647 snapshot_name = optarg;
648 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200649 case 'p':
650 progress = 1;
651 break;
bellardea2384d2004-08-01 21:59:26 +0000652 }
653 }
ths3b46e622007-09-17 08:09:54 +0000654
balrog926c2d22007-10-31 01:11:44 +0000655 bs_n = argc - optind - 1;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100656 if (bs_n < 1) {
657 help();
658 }
balrog926c2d22007-10-31 01:11:44 +0000659
660 out_filename = argv[argc - 1];
thsf58c7b32008-06-05 21:53:49 +0000661
Jes Sorensen4ac8aac2010-12-06 15:25:38 +0100662 if (options && !strcmp(options, "?")) {
663 ret = print_block_option_help(out_filename, out_fmt);
664 goto out;
665 }
666
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900667 if (bs_n > 1 && out_baseimg) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100668 error_report("-B makes no sense when concatenating multiple input "
669 "images");
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100670 ret = -1;
671 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900672 }
balrog926c2d22007-10-31 01:11:44 +0000673
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200674 qemu_progress_init(progress, 2.0);
675 qemu_progress_print(0, 100);
676
Jes Sorensen5bdf61f2010-12-06 15:25:35 +0100677 bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
balrog926c2d22007-10-31 01:11:44 +0000678
679 total_sectors = 0;
680 for (bs_i = 0; bs_i < bs_n; bs_i++) {
Stefan Hajnocziadfe0782010-04-13 10:29:35 +0100681 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900682 if (!bs[bs_i]) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100683 error_report("Could not open '%s'", argv[optind + bs_i]);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900684 ret = -1;
685 goto out;
686 }
balrog926c2d22007-10-31 01:11:44 +0000687 bdrv_get_geometry(bs[bs_i], &bs_sectors);
688 total_sectors += bs_sectors;
689 }
bellardea2384d2004-08-01 21:59:26 +0000690
edison51ef6722010-09-21 19:58:41 -0700691 if (snapshot_name != NULL) {
692 if (bs_n > 1) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200693 error_report("No support for concatenating multiple snapshot");
edison51ef6722010-09-21 19:58:41 -0700694 ret = -1;
695 goto out;
696 }
697 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
Markus Armbruster6daf1942011-06-22 14:03:54 +0200698 error_report("Failed to load snapshot");
edison51ef6722010-09-21 19:58:41 -0700699 ret = -1;
700 goto out;
701 }
702 }
703
Kevin Wolfefa84d42009-05-18 16:42:12 +0200704 /* Find driver and parse its options */
bellardea2384d2004-08-01 21:59:26 +0000705 drv = bdrv_find_format(out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900706 if (!drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100707 error_report("Unknown file format '%s'", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900708 ret = -1;
709 goto out;
710 }
balrog926c2d22007-10-31 01:11:44 +0000711
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900712 proto_drv = bdrv_find_protocol(out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900713 if (!proto_drv) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100714 error_report("Unknown protocol '%s'", out_filename);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900715 ret = -1;
716 goto out;
717 }
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900718
719 create_options = append_option_parameters(create_options,
720 drv->create_options);
721 create_options = append_option_parameters(create_options,
722 proto_drv->create_options);
Kevin Wolfdb08adf2009-06-04 15:39:38 +0200723
Kevin Wolfefa84d42009-05-18 16:42:12 +0200724 if (options) {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900725 param = parse_option_parameters(options, create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200726 if (param == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100727 error_report("Invalid options for file format '%s'.", out_fmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900728 ret = -1;
729 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200730 }
731 } else {
MORITA Kazutakab50cbab2010-05-26 11:35:36 +0900732 param = parse_option_parameters("", create_options, param);
Kevin Wolfefa84d42009-05-18 16:42:12 +0200733 }
734
735 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
Jes Sorenseneec77d92010-12-07 17:44:34 +0100736 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900737 if (ret < 0) {
738 goto out;
739 }
Kevin Wolfefa84d42009-05-18 16:42:12 +0200740
Kevin Wolfa18953f2010-10-14 15:46:04 +0200741 /* Get backing file name if -o backing_file was used */
742 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
743 if (out_baseimg_param) {
744 out_baseimg = out_baseimg_param->value.s;
745 }
746
Kevin Wolfefa84d42009-05-18 16:42:12 +0200747 /* Check if compression is supported */
Jes Sorenseneec77d92010-12-07 17:44:34 +0100748 if (compress) {
Kevin Wolfefa84d42009-05-18 16:42:12 +0200749 QEMUOptionParameter *encryption =
750 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
751
752 if (!drv->bdrv_write_compressed) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100753 error_report("Compression not supported for this file format");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900754 ret = -1;
755 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200756 }
757
758 if (encryption && encryption->value.n) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100759 error_report("Compression and encryption not supported at "
760 "the same time");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900761 ret = -1;
762 goto out;
Kevin Wolfefa84d42009-05-18 16:42:12 +0200763 }
764 }
765
766 /* Create the new image */
767 ret = bdrv_create(drv, out_filename, param);
bellardea2384d2004-08-01 21:59:26 +0000768 if (ret < 0) {
769 if (ret == -ENOTSUP) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100770 error_report("Formatting not supported for file format '%s'",
771 out_fmt);
aurel326e9ea0c2009-04-15 14:42:46 +0000772 } else if (ret == -EFBIG) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100773 error_report("The image size is too large for file format '%s'",
774 out_fmt);
bellardea2384d2004-08-01 21:59:26 +0000775 } else {
Jes Sorensen15654a62010-12-16 14:31:53 +0100776 error_report("%s: error while converting %s: %s",
777 out_filename, out_fmt, strerror(-ret));
bellardea2384d2004-08-01 21:59:26 +0000778 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900779 goto out;
bellardea2384d2004-08-01 21:59:26 +0000780 }
ths3b46e622007-09-17 08:09:54 +0000781
Kevin Wolf1bd8e172010-08-31 13:44:25 +0200782 out_bs = bdrv_new_open(out_filename, out_fmt,
783 BDRV_O_FLAGS | BDRV_O_RDWR | BDRV_O_NO_FLUSH);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900784 if (!out_bs) {
785 ret = -1;
786 goto out;
787 }
bellardea2384d2004-08-01 21:59:26 +0000788
balrog926c2d22007-10-31 01:11:44 +0000789 bs_i = 0;
790 bs_offset = 0;
791 bdrv_get_geometry(bs[0], &bs_sectors);
TeLeMand6771bf2010-02-08 16:20:00 +0800792 buf = qemu_malloc(IO_BUF_SIZE);
balrog926c2d22007-10-31 01:11:44 +0000793
Jes Sorenseneec77d92010-12-07 17:44:34 +0100794 if (compress) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900795 ret = bdrv_get_info(out_bs, &bdi);
796 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100797 error_report("could not get block driver info");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900798 goto out;
799 }
bellardfaea38e2006-08-05 21:31:00 +0000800 cluster_size = bdi.cluster_size;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900801 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100802 error_report("invalid cluster size");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900803 ret = -1;
804 goto out;
805 }
bellardea2384d2004-08-01 21:59:26 +0000806 cluster_sectors = cluster_size >> 9;
807 sector_num = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200808
809 nb_sectors = total_sectors;
810 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200811 (nb_sectors / MIN(nb_sectors, cluster_sectors));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200812
bellardea2384d2004-08-01 21:59:26 +0000813 for(;;) {
balrog926c2d22007-10-31 01:11:44 +0000814 int64_t bs_num;
815 int remainder;
816 uint8_t *buf2;
817
bellardea2384d2004-08-01 21:59:26 +0000818 nb_sectors = total_sectors - sector_num;
819 if (nb_sectors <= 0)
820 break;
821 if (nb_sectors >= cluster_sectors)
822 n = cluster_sectors;
823 else
824 n = nb_sectors;
balrog926c2d22007-10-31 01:11:44 +0000825
826 bs_num = sector_num - bs_offset;
827 assert (bs_num >= 0);
828 remainder = n;
829 buf2 = buf;
830 while (remainder > 0) {
831 int nlow;
832 while (bs_num == bs_sectors) {
833 bs_i++;
834 assert (bs_i < bs_n);
835 bs_offset += bs_sectors;
836 bdrv_get_geometry(bs[bs_i], &bs_sectors);
837 bs_num = 0;
Blue Swirl0bfcd592010-05-22 08:02:12 +0000838 /* printf("changing part: sector_num=%" PRId64 ", "
839 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
840 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
balrog926c2d22007-10-31 01:11:44 +0000841 }
842 assert (bs_num < bs_sectors);
843
844 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
845
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900846 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
847 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100848 error_report("error while reading");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900849 goto out;
850 }
balrog926c2d22007-10-31 01:11:44 +0000851
852 buf2 += nlow * 512;
853 bs_num += nlow;
854
855 remainder -= nlow;
856 }
857 assert (remainder == 0);
858
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100859 if (n < cluster_sectors) {
bellardea2384d2004-08-01 21:59:26 +0000860 memset(buf + n * 512, 0, cluster_size - n * 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100861 }
bellardea2384d2004-08-01 21:59:26 +0000862 if (is_not_zero(buf, cluster_size)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900863 ret = bdrv_write_compressed(out_bs, sector_num, buf,
864 cluster_sectors);
865 if (ret != 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100866 error_report("error while compressing sector %" PRId64,
bellardec3757d2006-06-14 15:50:07 +0000867 sector_num);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900868 goto out;
869 }
bellardea2384d2004-08-01 21:59:26 +0000870 }
871 sector_num += n;
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200872 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +0000873 }
bellardfaea38e2006-08-05 21:31:00 +0000874 /* signal EOF to align */
875 bdrv_write_compressed(out_bs, 0, NULL, 0);
bellardea2384d2004-08-01 21:59:26 +0000876 } else {
Kevin Wolff2feebb2010-04-14 17:30:35 +0200877 int has_zero_init = bdrv_has_zero_init(out_bs);
878
thsf58c7b32008-06-05 21:53:49 +0000879 sector_num = 0; // total number of sectors converted so far
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200880 nb_sectors = total_sectors - sector_num;
881 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +0200882 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200883
bellardea2384d2004-08-01 21:59:26 +0000884 for(;;) {
885 nb_sectors = total_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100886 if (nb_sectors <= 0) {
bellardea2384d2004-08-01 21:59:26 +0000887 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100888 }
889 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
bellardea2384d2004-08-01 21:59:26 +0000890 n = (IO_BUF_SIZE / 512);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100891 } else {
bellardea2384d2004-08-01 21:59:26 +0000892 n = nb_sectors;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100893 }
balrog926c2d22007-10-31 01:11:44 +0000894
895 while (sector_num - bs_offset >= bs_sectors) {
896 bs_i ++;
897 assert (bs_i < bs_n);
898 bs_offset += bs_sectors;
899 bdrv_get_geometry(bs[bs_i], &bs_sectors);
Blue Swirl0bfcd592010-05-22 08:02:12 +0000900 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
901 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
balrog926c2d22007-10-31 01:11:44 +0000902 sector_num, bs_i, bs_offset, bs_sectors); */
903 }
904
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100905 if (n > bs_offset + bs_sectors - sector_num) {
balrog926c2d22007-10-31 01:11:44 +0000906 n = bs_offset + bs_sectors - sector_num;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +0100907 }
balrog926c2d22007-10-31 01:11:44 +0000908
Kevin Wolff2feebb2010-04-14 17:30:35 +0200909 if (has_zero_init) {
Akkarit Sangpetchd0320442009-07-17 10:02:15 +0200910 /* If the output image is being created as a copy on write image,
911 assume that sectors which are unallocated in the input image
912 are present in both the output's and input's base images (no
913 need to copy them). */
914 if (out_baseimg) {
915 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
916 n, &n1)) {
917 sector_num += n1;
918 continue;
919 }
920 /* The next 'n1' sectors are allocated in the input image. Copy
921 only those as they may be followed by unallocated sectors. */
922 n = n1;
aliguori93c65b42009-04-05 17:40:43 +0000923 }
aliguori93c65b42009-04-05 17:40:43 +0000924 } else {
925 n1 = n;
thsf58c7b32008-06-05 21:53:49 +0000926 }
927
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900928 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
929 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100930 error_report("error while reading");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900931 goto out;
932 }
bellardea2384d2004-08-01 21:59:26 +0000933 /* NOTE: at the same time we convert, we do not write zero
934 sectors to have a chance to compress the image. Ideally, we
935 should add a specific call to have the info to go faster */
936 buf1 = buf;
937 while (n > 0) {
thsf58c7b32008-06-05 21:53:49 +0000938 /* If the output image is being created as a copy on write image,
939 copy all sectors even the ones containing only NUL bytes,
aliguori93c65b42009-04-05 17:40:43 +0000940 because they may differ from the sectors in the base image.
941
942 If the output is to a host device, we also write out
943 sectors that are entirely 0, since whatever data was
944 already there is garbage, not 0s. */
Kevin Wolff2feebb2010-04-14 17:30:35 +0200945 if (!has_zero_init || out_baseimg ||
aliguori93c65b42009-04-05 17:40:43 +0000946 is_allocated_sectors(buf1, n, &n1)) {
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900947 ret = bdrv_write(out_bs, sector_num, buf1, n1);
948 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +0100949 error_report("error while writing");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900950 goto out;
951 }
bellardea2384d2004-08-01 21:59:26 +0000952 }
953 sector_num += n1;
954 n -= n1;
955 buf1 += n1 * 512;
956 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200957 qemu_progress_print(local_progress, 100);
bellardea2384d2004-08-01 21:59:26 +0000958 }
959 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900960out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +0200961 qemu_progress_end();
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900962 free_option_parameters(create_options);
963 free_option_parameters(param);
TeLeMand6771bf2010-02-08 16:20:00 +0800964 qemu_free(buf);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900965 if (out_bs) {
966 bdrv_delete(out_bs);
967 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100968 if (bs) {
969 for (bs_i = 0; bs_i < bs_n; bs_i++) {
970 if (bs[bs_i]) {
971 bdrv_delete(bs[bs_i]);
972 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900973 }
Jes Sorensen31ca34b2010-12-06 15:25:36 +0100974 qemu_free(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900975 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +0900976 if (ret) {
977 return 1;
978 }
bellardea2384d2004-08-01 21:59:26 +0000979 return 0;
980}
981
bellard57d1a2b2004-08-03 21:15:11 +0000982#ifdef _WIN32
983static int64_t get_allocated_file_size(const char *filename)
984{
bellarde8445332006-06-14 15:32:10 +0000985 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
986 get_compressed_t get_compressed;
bellard57d1a2b2004-08-03 21:15:11 +0000987 struct _stati64 st;
bellarde8445332006-06-14 15:32:10 +0000988
989 /* WinNT support GetCompressedFileSize to determine allocate size */
990 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
991 if (get_compressed) {
992 DWORD high, low;
993 low = get_compressed(filename, &high);
994 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
995 return (((int64_t) high) << 32) + low;
996 }
997
ths5fafdf22007-09-16 21:08:06 +0000998 if (_stati64(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +0000999 return -1;
1000 return st.st_size;
1001}
1002#else
1003static int64_t get_allocated_file_size(const char *filename)
1004{
1005 struct stat st;
ths5fafdf22007-09-16 21:08:06 +00001006 if (stat(filename, &st) < 0)
bellard57d1a2b2004-08-03 21:15:11 +00001007 return -1;
1008 return (int64_t)st.st_blocks * 512;
1009}
1010#endif
1011
bellardfaea38e2006-08-05 21:31:00 +00001012static void dump_snapshots(BlockDriverState *bs)
1013{
1014 QEMUSnapshotInfo *sn_tab, *sn;
1015 int nb_sns, i;
1016 char buf[256];
1017
1018 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1019 if (nb_sns <= 0)
1020 return;
1021 printf("Snapshot list:\n");
1022 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1023 for(i = 0; i < nb_sns; i++) {
1024 sn = &sn_tab[i];
1025 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1026 }
1027 qemu_free(sn_tab);
1028}
1029
bellardea2384d2004-08-01 21:59:26 +00001030static int img_info(int argc, char **argv)
1031{
1032 int c;
1033 const char *filename, *fmt;
bellardea2384d2004-08-01 21:59:26 +00001034 BlockDriverState *bs;
1035 char fmt_name[128], size_buf[128], dsize_buf[128];
ths96b8f132007-12-17 01:35:20 +00001036 uint64_t total_sectors;
1037 int64_t allocated_size;
bellard93b6b2a2006-08-01 15:51:11 +00001038 char backing_filename[1024];
1039 char backing_filename2[1024];
bellardfaea38e2006-08-05 21:31:00 +00001040 BlockDriverInfo bdi;
bellardea2384d2004-08-01 21:59:26 +00001041
1042 fmt = NULL;
1043 for(;;) {
1044 c = getopt(argc, argv, "f:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001045 if (c == -1) {
bellardea2384d2004-08-01 21:59:26 +00001046 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001047 }
bellardea2384d2004-08-01 21:59:26 +00001048 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001049 case '?':
bellardea2384d2004-08-01 21:59:26 +00001050 case 'h':
1051 help();
1052 break;
1053 case 'f':
1054 fmt = optarg;
1055 break;
1056 }
1057 }
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001058 if (optind >= argc) {
bellardea2384d2004-08-01 21:59:26 +00001059 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001060 }
bellardea2384d2004-08-01 21:59:26 +00001061 filename = argv[optind++];
1062
Stefan Hajnocziadfe0782010-04-13 10:29:35 +01001063 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001064 if (!bs) {
1065 return 1;
1066 }
bellardea2384d2004-08-01 21:59:26 +00001067 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1068 bdrv_get_geometry(bs, &total_sectors);
1069 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
bellard57d1a2b2004-08-03 21:15:11 +00001070 allocated_size = get_allocated_file_size(filename);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001071 if (allocated_size < 0) {
blueswir1a10ea302008-08-24 10:30:33 +00001072 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001073 } else {
ths5fafdf22007-09-16 21:08:06 +00001074 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
bellardde167e42005-04-28 21:15:08 +00001075 allocated_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001076 }
bellardea2384d2004-08-01 21:59:26 +00001077 printf("image: %s\n"
1078 "file format: %s\n"
bellardec3757d2006-06-14 15:50:07 +00001079 "virtual size: %s (%" PRId64 " bytes)\n"
bellardea2384d2004-08-01 21:59:26 +00001080 "disk size: %s\n",
ths5fafdf22007-09-16 21:08:06 +00001081 filename, fmt_name, size_buf,
bellardec3757d2006-06-14 15:50:07 +00001082 (total_sectors * 512),
bellardea2384d2004-08-01 21:59:26 +00001083 dsize_buf);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001084 if (bdrv_is_encrypted(bs)) {
bellardea2384d2004-08-01 21:59:26 +00001085 printf("encrypted: yes\n");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001086 }
bellardfaea38e2006-08-05 21:31:00 +00001087 if (bdrv_get_info(bs, &bdi) >= 0) {
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001088 if (bdi.cluster_size != 0) {
bellardfaea38e2006-08-05 21:31:00 +00001089 printf("cluster_size: %d\n", bdi.cluster_size);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001090 }
bellardfaea38e2006-08-05 21:31:00 +00001091 }
bellard93b6b2a2006-08-01 15:51:11 +00001092 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
bellardfaea38e2006-08-05 21:31:00 +00001093 if (backing_filename[0] != '\0') {
bellard93b6b2a2006-08-01 15:51:11 +00001094 path_combine(backing_filename2, sizeof(backing_filename2),
1095 filename, backing_filename);
ths5fafdf22007-09-16 21:08:06 +00001096 printf("backing file: %s (actual path: %s)\n",
bellard93b6b2a2006-08-01 15:51:11 +00001097 backing_filename,
1098 backing_filename2);
bellardfaea38e2006-08-05 21:31:00 +00001099 }
1100 dump_snapshots(bs);
bellardea2384d2004-08-01 21:59:26 +00001101 bdrv_delete(bs);
1102 return 0;
1103}
1104
aliguorif7b4a942009-01-07 17:40:15 +00001105#define SNAPSHOT_LIST 1
1106#define SNAPSHOT_CREATE 2
1107#define SNAPSHOT_APPLY 3
1108#define SNAPSHOT_DELETE 4
1109
Stuart Brady153859b2009-06-07 00:42:17 +01001110static int img_snapshot(int argc, char **argv)
aliguorif7b4a942009-01-07 17:40:15 +00001111{
1112 BlockDriverState *bs;
1113 QEMUSnapshotInfo sn;
1114 char *filename, *snapshot_name = NULL;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001115 int c, ret = 0, bdrv_oflags;
aliguorif7b4a942009-01-07 17:40:15 +00001116 int action = 0;
1117 qemu_timeval tv;
1118
Kevin Wolf710da702011-01-10 12:33:02 +01001119 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
aliguorif7b4a942009-01-07 17:40:15 +00001120 /* Parse commandline parameters */
1121 for(;;) {
1122 c = getopt(argc, argv, "la:c:d:h");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001123 if (c == -1) {
aliguorif7b4a942009-01-07 17:40:15 +00001124 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001125 }
aliguorif7b4a942009-01-07 17:40:15 +00001126 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001127 case '?':
aliguorif7b4a942009-01-07 17:40:15 +00001128 case 'h':
1129 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001130 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001131 case 'l':
1132 if (action) {
1133 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001134 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001135 }
1136 action = SNAPSHOT_LIST;
Naphtali Spreif5edb012010-01-17 16:48:13 +02001137 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
aliguorif7b4a942009-01-07 17:40:15 +00001138 break;
1139 case 'a':
1140 if (action) {
1141 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001142 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001143 }
1144 action = SNAPSHOT_APPLY;
1145 snapshot_name = optarg;
1146 break;
1147 case 'c':
1148 if (action) {
1149 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001150 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001151 }
1152 action = SNAPSHOT_CREATE;
1153 snapshot_name = optarg;
1154 break;
1155 case 'd':
1156 if (action) {
1157 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001158 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001159 }
1160 action = SNAPSHOT_DELETE;
1161 snapshot_name = optarg;
1162 break;
1163 }
1164 }
1165
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001166 if (optind >= argc) {
aliguorif7b4a942009-01-07 17:40:15 +00001167 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001168 }
aliguorif7b4a942009-01-07 17:40:15 +00001169 filename = argv[optind++];
1170
1171 /* Open the image */
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001172 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001173 if (!bs) {
1174 return 1;
1175 }
aliguorif7b4a942009-01-07 17:40:15 +00001176
1177 /* Perform the requested action */
1178 switch(action) {
1179 case SNAPSHOT_LIST:
1180 dump_snapshots(bs);
1181 break;
1182
1183 case SNAPSHOT_CREATE:
1184 memset(&sn, 0, sizeof(sn));
1185 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1186
1187 qemu_gettimeofday(&tv);
1188 sn.date_sec = tv.tv_sec;
1189 sn.date_nsec = tv.tv_usec * 1000;
1190
1191 ret = bdrv_snapshot_create(bs, &sn);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001192 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001193 error_report("Could not create snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001194 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001195 }
aliguorif7b4a942009-01-07 17:40:15 +00001196 break;
1197
1198 case SNAPSHOT_APPLY:
1199 ret = bdrv_snapshot_goto(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001200 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001201 error_report("Could not apply snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001202 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001203 }
aliguorif7b4a942009-01-07 17:40:15 +00001204 break;
1205
1206 case SNAPSHOT_DELETE:
1207 ret = bdrv_snapshot_delete(bs, snapshot_name);
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001208 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001209 error_report("Could not delete snapshot '%s': %d (%s)",
aliguorif7b4a942009-01-07 17:40:15 +00001210 snapshot_name, ret, strerror(-ret));
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001211 }
aliguorif7b4a942009-01-07 17:40:15 +00001212 break;
1213 }
1214
1215 /* Cleanup */
1216 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001217 if (ret) {
1218 return 1;
1219 }
Stuart Brady153859b2009-06-07 00:42:17 +01001220 return 0;
aliguorif7b4a942009-01-07 17:40:15 +00001221}
1222
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001223static int img_rebase(int argc, char **argv)
1224{
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001225 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001226 BlockDriver *old_backing_drv, *new_backing_drv;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001227 char *filename;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001228 const char *fmt, *out_basefmt, *out_baseimg;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001229 int c, flags, ret;
1230 int unsafe = 0;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001231 int progress = 0;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001232
1233 /* Parse commandline parameters */
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001234 fmt = NULL;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001235 out_baseimg = NULL;
1236 out_basefmt = NULL;
1237
1238 for(;;) {
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001239 c = getopt(argc, argv, "uhf:F:b:p");
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001240 if (c == -1) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001241 break;
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001242 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001243 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001244 case '?':
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001245 case 'h':
1246 help();
1247 return 0;
Kevin Wolfe53dbee2010-03-02 12:14:31 +01001248 case 'f':
1249 fmt = optarg;
1250 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001251 case 'F':
1252 out_basefmt = optarg;
1253 break;
1254 case 'b':
1255 out_baseimg = optarg;
1256 break;
1257 case 'u':
1258 unsafe = 1;
1259 break;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001260 case 'p':
1261 progress = 1;
1262 break;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001263 }
1264 }
1265
Anthony Liguori9a9d9db2011-04-13 15:51:47 +01001266 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001267 help();
Jes Sorensenb8fb60d2010-12-06 15:25:39 +01001268 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001269 filename = argv[optind++];
1270
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001271 qemu_progress_init(progress, 2.0);
1272 qemu_progress_print(0, 100);
1273
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001274 /*
1275 * Open the images.
1276 *
1277 * Ignore the old backing file for unsafe rebase in case we want to correct
1278 * the reference to a renamed or moved backing file.
1279 */
Stefan Hajnocziadfe0782010-04-13 10:29:35 +01001280 flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
Stefan Hajnoczif163d072010-04-13 10:29:34 +01001281 bs = bdrv_new_open(filename, fmt, flags);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001282 if (!bs) {
1283 return 1;
1284 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001285
1286 /* Find the right drivers for the backing files */
1287 old_backing_drv = NULL;
1288 new_backing_drv = NULL;
1289
1290 if (!unsafe && bs->backing_format[0] != '\0') {
1291 old_backing_drv = bdrv_find_format(bs->backing_format);
1292 if (old_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001293 error_report("Invalid format name: '%s'", bs->backing_format);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001294 ret = -1;
1295 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001296 }
1297 }
1298
1299 if (out_basefmt != NULL) {
1300 new_backing_drv = bdrv_find_format(out_basefmt);
1301 if (new_backing_drv == NULL) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001302 error_report("Invalid format name: '%s'", out_basefmt);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001303 ret = -1;
1304 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001305 }
1306 }
1307
1308 /* For safe rebasing we need to compare old and new backing file */
1309 if (unsafe) {
1310 /* Make the compiler happy */
1311 bs_old_backing = NULL;
1312 bs_new_backing = NULL;
1313 } else {
1314 char backing_name[1024];
1315
1316 bs_old_backing = bdrv_new("old_backing");
1317 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001318 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1319 old_backing_drv);
1320 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001321 error_report("Could not open old backing file '%s'", backing_name);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001322 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001323 }
1324
1325 bs_new_backing = bdrv_new("new_backing");
Kevin Wolfcdbae852010-08-17 18:58:55 +02001326 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001327 new_backing_drv);
1328 if (ret) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001329 error_report("Could not open new backing file '%s'", out_baseimg);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001330 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001331 }
1332 }
1333
1334 /*
1335 * Check each unallocated cluster in the COW file. If it is unallocated,
1336 * accesses go to the backing file. We must therefore compare this cluster
1337 * in the old and new backing file, and if they differ we need to copy it
1338 * from the old backing file into the COW file.
1339 *
1340 * If qemu-img crashes during this step, no harm is done. The content of
1341 * the image is the same as the original one at any time.
1342 */
1343 if (!unsafe) {
1344 uint64_t num_sectors;
1345 uint64_t sector;
Kevin Wolfcc60e322010-04-29 14:47:48 +02001346 int n;
TeLeMand6771bf2010-02-08 16:20:00 +08001347 uint8_t * buf_old;
1348 uint8_t * buf_new;
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001349 float local_progress;
TeLeMand6771bf2010-02-08 16:20:00 +08001350
1351 buf_old = qemu_malloc(IO_BUF_SIZE);
1352 buf_new = qemu_malloc(IO_BUF_SIZE);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001353
1354 bdrv_get_geometry(bs, &num_sectors);
1355
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001356 local_progress = (float)100 /
Jes Sorensen4ee96412011-05-06 11:39:11 +02001357 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001358 for (sector = 0; sector < num_sectors; sector += n) {
1359
1360 /* How many sectors can we handle with the next read? */
1361 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1362 n = (IO_BUF_SIZE / 512);
1363 } else {
1364 n = num_sectors - sector;
1365 }
1366
1367 /* If the cluster is allocated, we don't need to take action */
Kevin Wolfcc60e322010-04-29 14:47:48 +02001368 ret = bdrv_is_allocated(bs, sector, n, &n);
1369 if (ret) {
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001370 continue;
1371 }
1372
1373 /* Read old and new backing file */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001374 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1375 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001376 error_report("error while reading from old backing file");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001377 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001378 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001379 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1380 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001381 error_report("error while reading from new backing file");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001382 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001383 }
1384
1385 /* If they differ, we need to write to the COW file */
1386 uint64_t written = 0;
1387
1388 while (written < n) {
1389 int pnum;
1390
1391 if (compare_sectors(buf_old + written * 512,
Kevin Wolf60b1bd42010-02-17 12:32:59 +01001392 buf_new + written * 512, n - written, &pnum))
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001393 {
1394 ret = bdrv_write(bs, sector + written,
1395 buf_old + written * 512, pnum);
1396 if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001397 error_report("Error while writing to COW image: %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001398 strerror(-ret));
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001399 goto out;
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001400 }
1401 }
1402
1403 written += pnum;
1404 }
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001405 qemu_progress_print(local_progress, 100);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001406 }
TeLeMand6771bf2010-02-08 16:20:00 +08001407
1408 qemu_free(buf_old);
1409 qemu_free(buf_new);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001410 }
1411
1412 /*
1413 * Change the backing file. All clusters that are different from the old
1414 * backing file are overwritten in the COW file now, so the visible content
1415 * doesn't change when we switch the backing file.
1416 */
1417 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1418 if (ret == -ENOSPC) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001419 error_report("Could not change the backing file to '%s': No "
1420 "space left in the file header", out_baseimg);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001421 } else if (ret < 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001422 error_report("Could not change the backing file to '%s': %s",
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001423 out_baseimg, strerror(-ret));
1424 }
1425
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001426 qemu_progress_print(100, 0);
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001427 /*
1428 * TODO At this point it is possible to check if any clusters that are
1429 * allocated in the COW file are the same in the backing file. If so, they
1430 * could be dropped from the COW file. Don't do this before switching the
1431 * backing file, in case of a crash this would lead to corruption.
1432 */
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001433out:
Jes Sorensen6b837bc2011-03-30 14:16:25 +02001434 qemu_progress_end();
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001435 /* Cleanup */
1436 if (!unsafe) {
Kevin Wolfeb863ad2011-03-31 12:39:51 +02001437 if (bs_old_backing != NULL) {
1438 bdrv_delete(bs_old_backing);
1439 }
1440 if (bs_new_backing != NULL) {
1441 bdrv_delete(bs_new_backing);
1442 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001443 }
1444
1445 bdrv_delete(bs);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001446 if (ret) {
1447 return 1;
1448 }
Kevin Wolf3e85c6f2010-01-12 12:55:18 +01001449 return 0;
1450}
1451
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001452static int img_resize(int argc, char **argv)
1453{
1454 int c, ret, relative;
1455 const char *filename, *fmt, *size;
1456 int64_t n, total_size;
Jes Sorensen2a819982010-12-06 17:08:31 +01001457 BlockDriverState *bs = NULL;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001458 QEMUOptionParameter *param;
1459 QEMUOptionParameter resize_options[] = {
1460 {
1461 .name = BLOCK_OPT_SIZE,
1462 .type = OPT_SIZE,
1463 .help = "Virtual disk size"
1464 },
1465 { NULL }
1466 };
1467
Kevin Wolfe80fec72011-04-29 10:58:12 +02001468 /* Remove size from argv manually so that negative numbers are not treated
1469 * as options by getopt. */
1470 if (argc < 3) {
1471 help();
1472 return 1;
1473 }
1474
1475 size = argv[--argc];
1476
1477 /* Parse getopt arguments */
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001478 fmt = NULL;
1479 for(;;) {
1480 c = getopt(argc, argv, "f:h");
1481 if (c == -1) {
1482 break;
1483 }
1484 switch(c) {
Jes Sorensenef873942010-12-06 15:25:40 +01001485 case '?':
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001486 case 'h':
1487 help();
1488 break;
1489 case 'f':
1490 fmt = optarg;
1491 break;
1492 }
1493 }
Kevin Wolfe80fec72011-04-29 10:58:12 +02001494 if (optind >= argc) {
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001495 help();
1496 }
1497 filename = argv[optind++];
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001498
1499 /* Choose grow, shrink, or absolute resize mode */
1500 switch (size[0]) {
1501 case '+':
1502 relative = 1;
1503 size++;
1504 break;
1505 case '-':
1506 relative = -1;
1507 size++;
1508 break;
1509 default:
1510 relative = 0;
1511 break;
1512 }
1513
1514 /* Parse size */
1515 param = parse_option_parameters("", resize_options, NULL);
1516 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1517 /* Error message already printed when size parsing fails */
Jes Sorensen2a819982010-12-06 17:08:31 +01001518 ret = -1;
1519 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001520 }
1521 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1522 free_option_parameters(param);
1523
1524 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001525 if (!bs) {
Jes Sorensen2a819982010-12-06 17:08:31 +01001526 ret = -1;
1527 goto out;
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001528 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001529
1530 if (relative) {
1531 total_size = bdrv_getlength(bs) + n * relative;
1532 } else {
1533 total_size = n;
1534 }
1535 if (total_size <= 0) {
Jes Sorensen15654a62010-12-16 14:31:53 +01001536 error_report("New image size must be positive");
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001537 ret = -1;
1538 goto out;
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001539 }
1540
1541 ret = bdrv_truncate(bs, total_size);
1542 switch (ret) {
1543 case 0:
1544 printf("Image resized.\n");
1545 break;
1546 case -ENOTSUP:
Jes Sorensen15654a62010-12-16 14:31:53 +01001547 error_report("This image format does not support resize");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001548 break;
1549 case -EACCES:
Jes Sorensen15654a62010-12-16 14:31:53 +01001550 error_report("Image is read-only");
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001551 break;
1552 default:
Jes Sorensen15654a62010-12-16 14:31:53 +01001553 error_report("Error resizing image (%d)", -ret);
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001554 break;
1555 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001556out:
Jes Sorensen2a819982010-12-06 17:08:31 +01001557 if (bs) {
1558 bdrv_delete(bs);
1559 }
MORITA Kazutakac2abcce2010-06-21 04:26:35 +09001560 if (ret) {
1561 return 1;
1562 }
Stefan Hajnocziae6b0ed2010-04-24 09:12:12 +01001563 return 0;
1564}
1565
Anthony Liguoric227f092009-10-01 16:12:16 -05001566static const img_cmd_t img_cmds[] = {
Stuart Brady153859b2009-06-07 00:42:17 +01001567#define DEF(option, callback, arg_string) \
1568 { option, callback },
1569#include "qemu-img-cmds.h"
1570#undef DEF
1571#undef GEN_DOCS
1572 { NULL, NULL, },
1573};
1574
bellardea2384d2004-08-01 21:59:26 +00001575int main(int argc, char **argv)
1576{
Anthony Liguoric227f092009-10-01 16:12:16 -05001577 const img_cmd_t *cmd;
Stuart Brady153859b2009-06-07 00:42:17 +01001578 const char *cmdname;
bellardea2384d2004-08-01 21:59:26 +00001579
Kevin Wolf53f76e52010-12-16 15:10:32 +01001580 error_set_progname(argv[0]);
1581
bellardea2384d2004-08-01 21:59:26 +00001582 bdrv_init();
1583 if (argc < 2)
1584 help();
Stuart Brady153859b2009-06-07 00:42:17 +01001585 cmdname = argv[1];
aurel328f9b1572009-02-09 18:14:31 +00001586 argc--; argv++;
Stuart Brady153859b2009-06-07 00:42:17 +01001587
1588 /* find the command */
1589 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1590 if (!strcmp(cmdname, cmd->name)) {
1591 return cmd->handler(argc, argv);
1592 }
bellardea2384d2004-08-01 21:59:26 +00001593 }
Stuart Brady153859b2009-06-07 00:42:17 +01001594
1595 /* not found */
1596 help();
bellardea2384d2004-08-01 21:59:26 +00001597 return 0;
1598}