]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
x86: Properly reset PAT MSR
[qemu.git] / qemu-img.c
CommitLineData
ea2384d3 1/*
fb43f4dd 2 * QEMU disk image utility
5fafdf24 3 *
68d0f70e 4 * Copyright (c) 2003-2008 Fabrice Bellard
5fafdf24 5 *
ea2384d3
FB
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
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 */
faf07963 24#include "qemu-common.h"
9ea2ea71 25#include "qemu-option.h"
53f76e58 26#include "qemu-error.h"
f7b4a940 27#include "osdep.h"
dc786bc9 28#include "sysemu.h"
ec36ba14 29#include "block_int.h"
9230eaf6 30#include <stdio.h>
ea2384d3 31
e8445331
FB
32#ifdef _WIN32
33#include <windows.h>
34#endif
35
c227f099 36typedef struct img_cmd_t {
153859be
SB
37 const char *name;
38 int (*handler)(int argc, char **argv);
c227f099 39} img_cmd_t;
153859be 40
137519ce 41/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
adfe078e 42#define BDRV_O_FLAGS BDRV_O_CACHE_WB
137519ce 43
ea2384d3
FB
44static void format_print(void *opaque, const char *name)
45{
46 printf(" %s", name);
47}
48
d2c639d6 49/* Please keep in synch with qemu-img.texi */
3f379ab1 50static void help(void)
ea2384d3 51{
e00291c0
PB
52 const char *help_msg =
53 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
3f020d70 54 "usage: qemu-img command [command options]\n"
55 "QEMU disk image utility\n"
56 "\n"
57 "Command syntax:\n"
153859be
SB
58#define DEF(option, callback, arg_string) \
59 " " arg_string "\n"
60#include "qemu-img-cmds.h"
61#undef DEF
62#undef GEN_DOCS
3f020d70 63 "\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"
80 "\n"
81 "Parameters to snapshot subcommand:\n"
82 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
83 " '-a' applies a snapshot (revert disk to saved state)\n"
84 " '-c' creates a snapshot\n"
85 " '-d' deletes a snapshot\n"
e00291c0
PB
86 " '-l' lists all snapshots in the given image\n";
87
88 printf("%s\nSupported formats:", help_msg);
ea2384d3
FB
89 bdrv_iterate_format(format_print, NULL);
90 printf("\n");
91 exit(1);
92}
93
ea2384d3
FB
94#if defined(WIN32)
95/* XXX: put correct support for win32 */
96static int read_password(char *buf, int buf_size)
97{
98 int c, i;
99 printf("Password: ");
100 fflush(stdout);
101 i = 0;
102 for(;;) {
103 c = getchar();
104 if (c == '\n')
105 break;
106 if (i < (buf_size - 1))
107 buf[i++] = c;
108 }
109 buf[i] = '\0';
110 return 0;
111}
112
113#else
114
115#include <termios.h>
116
117static struct termios oldtty;
118
119static void term_exit(void)
120{
121 tcsetattr (0, TCSANOW, &oldtty);
122}
123
124static void term_init(void)
125{
126 struct termios tty;
127
128 tcgetattr (0, &tty);
129 oldtty = tty;
130
131 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
132 |INLCR|IGNCR|ICRNL|IXON);
133 tty.c_oflag |= OPOST;
134 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
135 tty.c_cflag &= ~(CSIZE|PARENB);
136 tty.c_cflag |= CS8;
137 tty.c_cc[VMIN] = 1;
138 tty.c_cc[VTIME] = 0;
3b46e624 139
ea2384d3
FB
140 tcsetattr (0, TCSANOW, &tty);
141
142 atexit(term_exit);
143}
144
3f379ab1 145static int read_password(char *buf, int buf_size)
ea2384d3
FB
146{
147 uint8_t ch;
148 int i, ret;
149
150 printf("password: ");
151 fflush(stdout);
152 term_init();
153 i = 0;
154 for(;;) {
155 ret = read(0, &ch, 1);
156 if (ret == -1) {
157 if (errno == EAGAIN || errno == EINTR) {
158 continue;
159 } else {
160 ret = -1;
161 break;
162 }
163 } else if (ret == 0) {
164 ret = -1;
165 break;
166 } else {
167 if (ch == '\r') {
168 ret = 0;
169 break;
170 }
171 if (i < (buf_size - 1))
172 buf[i++] = ch;
173 }
174 }
175 term_exit();
176 buf[i] = '\0';
177 printf("\n");
178 return ret;
179}
180#endif
181
4ac8aacd
JS
182static int print_block_option_help(const char *filename, const char *fmt)
183{
184 BlockDriver *drv, *proto_drv;
185 QEMUOptionParameter *create_options = NULL;
186
187 /* Find driver and parse its options */
188 drv = bdrv_find_format(fmt);
189 if (!drv) {
15654a6d 190 error_report("Unknown file format '%s'", fmt);
4ac8aacd
JS
191 return 1;
192 }
193
194 proto_drv = bdrv_find_protocol(filename);
195 if (!proto_drv) {
15654a6d 196 error_report("Unknown protocol '%s'", filename);
4ac8aacd
JS
197 return 1;
198 }
199
200 create_options = append_option_parameters(create_options,
201 drv->create_options);
202 create_options = append_option_parameters(create_options,
203 proto_drv->create_options);
204 print_option_help(create_options);
205 free_option_parameters(create_options);
206 return 0;
207}
208
75c23805 209static BlockDriverState *bdrv_new_open(const char *filename,
9bc378c1 210 const char *fmt,
f163d073 211 int flags)
75c23805
FB
212{
213 BlockDriverState *bs;
214 BlockDriver *drv;
215 char password[256];
b9eaf9ec 216 int ret;
75c23805 217
b9eaf9ec 218 bs = bdrv_new("image");
ad717139 219
75c23805
FB
220 if (fmt) {
221 drv = bdrv_find_format(fmt);
c2abccec 222 if (!drv) {
15654a6d 223 error_report("Unknown file format '%s'", fmt);
c2abccec
MK
224 goto fail;
225 }
75c23805
FB
226 } else {
227 drv = NULL;
228 }
b9eaf9ec
KW
229
230 ret = bdrv_open(bs, filename, flags, drv);
231 if (ret < 0) {
232 error_report("Could not open '%s': %s", filename, strerror(-ret));
c2abccec 233 goto fail;
75c23805 234 }
b9eaf9ec 235
75c23805
FB
236 if (bdrv_is_encrypted(bs)) {
237 printf("Disk image '%s' is encrypted.\n", filename);
c2abccec 238 if (read_password(password, sizeof(password)) < 0) {
15654a6d 239 error_report("No password given");
c2abccec
MK
240 goto fail;
241 }
242 if (bdrv_set_key(bs, password) < 0) {
15654a6d 243 error_report("invalid password");
c2abccec
MK
244 goto fail;
245 }
75c23805
FB
246 }
247 return bs;
c2abccec
MK
248fail:
249 if (bs) {
250 bdrv_delete(bs);
251 }
252 return NULL;
75c23805
FB
253}
254
c2abccec 255static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
256 const char *base_filename,
257 const char *base_fmt)
efa84d43 258{
efa84d43
KW
259 if (base_filename) {
260 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
15654a6d
JS
261 error_report("Backing file not supported for file format '%s'",
262 fmt);
c2abccec 263 return -1;
efa84d43
KW
264 }
265 }
266 if (base_fmt) {
267 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
15654a6d
JS
268 error_report("Backing file format not supported for file "
269 "format '%s'", fmt);
c2abccec 270 return -1;
efa84d43
KW
271 }
272 }
c2abccec 273 return 0;
efa84d43
KW
274}
275
ea2384d3
FB
276static int img_create(int argc, char **argv)
277{
eec77d9e 278 int c, ret = 0;
1da7cfbd 279 uint64_t img_size = -1;
ea2384d3 280 const char *fmt = "raw";
9230eaf6 281 const char *base_fmt = NULL;
ea2384d3
FB
282 const char *filename;
283 const char *base_filename = NULL;
9ea2ea71 284 char *options = NULL;
3b46e624 285
ea2384d3 286 for(;;) {
9ea2ea71 287 c = getopt(argc, argv, "F:b:f:he6o:");
b8fb60da 288 if (c == -1) {
ea2384d3 289 break;
b8fb60da 290 }
ea2384d3 291 switch(c) {
ef87394c 292 case '?':
ea2384d3
FB
293 case 'h':
294 help();
295 break;
9230eaf6
AL
296 case 'F':
297 base_fmt = optarg;
298 break;
ea2384d3
FB
299 case 'b':
300 base_filename = optarg;
301 break;
302 case 'f':
303 fmt = optarg;
304 break;
305 case 'e':
15654a6d 306 error_report("qemu-img: option -e is deprecated, please use \'-o "
eec77d9e
JS
307 "encryption\' instead!");
308 return 1;
d8871c5a 309 case '6':
15654a6d 310 error_report("qemu-img: option -6 is deprecated, please use \'-o "
eec77d9e
JS
311 "compat6\' instead!");
312 return 1;
9ea2ea71
KW
313 case 'o':
314 options = optarg;
315 break;
ea2384d3
FB
316 }
317 }
9230eaf6 318
b50cbabc 319 /* Get the filename */
b8fb60da 320 if (optind >= argc) {
b50cbabc 321 help();
b8fb60da 322 }
b50cbabc
MK
323 filename = argv[optind++];
324
1da7cfbd
JS
325 /* Get image size, if specified */
326 if (optind < argc) {
70b4f4bb 327 int64_t sval;
1da7cfbd
JS
328 sval = strtosz_suffix(argv[optind++], NULL, STRTOSZ_DEFSUFFIX_B);
329 if (sval < 0) {
15654a6d 330 error_report("Invalid image size specified! You may use k, M, G or "
1da7cfbd 331 "T suffixes for ");
15654a6d 332 error_report("kilobytes, megabytes, gigabytes and terabytes.");
1da7cfbd
JS
333 ret = -1;
334 goto out;
335 }
336 img_size = (uint64_t)sval;
337 }
338
4ac8aacd
JS
339 if (options && !strcmp(options, "?")) {
340 ret = print_block_option_help(filename, fmt);
341 goto out;
342 }
343
f88e1a42
JS
344 ret = bdrv_img_create(filename, fmt, base_filename, base_fmt,
345 options, img_size, BDRV_O_FLAGS);
c2abccec
MK
346out:
347 if (ret) {
348 return 1;
349 }
ea2384d3
FB
350 return 0;
351}
352
e076f338
KW
353/*
354 * Checks an image for consistency. Exit codes:
355 *
356 * 0 - Check completed, image is good
357 * 1 - Check not completed because of internal errors
358 * 2 - Check completed, image is corrupted
359 * 3 - Check completed, image has leaked clusters, but is good otherwise
360 */
1585969c
AL
361static int img_check(int argc, char **argv)
362{
363 int c, ret;
364 const char *filename, *fmt;
1585969c 365 BlockDriverState *bs;
e076f338 366 BdrvCheckResult result;
1585969c
AL
367
368 fmt = NULL;
369 for(;;) {
370 c = getopt(argc, argv, "f:h");
b8fb60da 371 if (c == -1) {
1585969c 372 break;
b8fb60da 373 }
1585969c 374 switch(c) {
ef87394c 375 case '?':
1585969c
AL
376 case 'h':
377 help();
378 break;
379 case 'f':
380 fmt = optarg;
381 break;
382 }
383 }
b8fb60da 384 if (optind >= argc) {
1585969c 385 help();
b8fb60da 386 }
1585969c
AL
387 filename = argv[optind++];
388
adfe078e 389 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
c2abccec
MK
390 if (!bs) {
391 return 1;
392 }
e076f338
KW
393 ret = bdrv_check(bs, &result);
394
395 if (ret == -ENOTSUP) {
15654a6d 396 error_report("This image format does not support checks");
e076f338
KW
397 bdrv_delete(bs);
398 return 1;
399 }
400
401 if (!(result.corruptions || result.leaks || result.check_errors)) {
402 printf("No errors were found on the image.\n");
403 } else {
404 if (result.corruptions) {
405 printf("\n%d errors were found on the image.\n"
406 "Data may be corrupted, or further writes to the image "
407 "may corrupt it.\n",
408 result.corruptions);
409 }
410
411 if (result.leaks) {
412 printf("\n%d leaked clusters were found on the image.\n"
413 "This means waste of disk space, but no harm to data.\n",
414 result.leaks);
415 }
416
417 if (result.check_errors) {
418 printf("\n%d internal errors have occurred during the check.\n",
419 result.check_errors);
1585969c 420 }
1585969c
AL
421 }
422
423 bdrv_delete(bs);
e076f338
KW
424
425 if (ret < 0 || result.check_errors) {
426 printf("\nAn error has occurred during the check: %s\n"
427 "The check is not complete and may have missed error.\n",
428 strerror(-ret));
c2abccec
MK
429 return 1;
430 }
e076f338
KW
431
432 if (result.corruptions) {
433 return 2;
434 } else if (result.leaks) {
435 return 3;
436 } else {
437 return 0;
438 }
1585969c
AL
439}
440
ea2384d3
FB
441static int img_commit(int argc, char **argv)
442{
443 int c, ret;
444 const char *filename, *fmt;
ea2384d3
FB
445 BlockDriverState *bs;
446
447 fmt = NULL;
448 for(;;) {
449 c = getopt(argc, argv, "f:h");
b8fb60da 450 if (c == -1) {
ea2384d3 451 break;
b8fb60da 452 }
ea2384d3 453 switch(c) {
ef87394c 454 case '?':
ea2384d3
FB
455 case 'h':
456 help();
457 break;
458 case 'f':
459 fmt = optarg;
460 break;
461 }
462 }
b8fb60da 463 if (optind >= argc) {
ea2384d3 464 help();
b8fb60da 465 }
ea2384d3
FB
466 filename = argv[optind++];
467
adfe078e 468 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
c2abccec
MK
469 if (!bs) {
470 return 1;
471 }
ea2384d3
FB
472 ret = bdrv_commit(bs);
473 switch(ret) {
474 case 0:
475 printf("Image committed.\n");
476 break;
477 case -ENOENT:
15654a6d 478 error_report("No disk inserted");
ea2384d3
FB
479 break;
480 case -EACCES:
15654a6d 481 error_report("Image is read-only");
ea2384d3
FB
482 break;
483 case -ENOTSUP:
15654a6d 484 error_report("Image is already committed");
ea2384d3
FB
485 break;
486 default:
15654a6d 487 error_report("Error while committing image");
ea2384d3
FB
488 break;
489 }
490
491 bdrv_delete(bs);
c2abccec
MK
492 if (ret) {
493 return 1;
494 }
ea2384d3
FB
495 return 0;
496}
497
498static int is_not_zero(const uint8_t *sector, int len)
499{
500 int i;
501 len >>= 2;
502 for(i = 0;i < len; i++) {
503 if (((uint32_t *)sector)[i] != 0)
504 return 1;
505 }
506 return 0;
507}
508
f58c7b35
TS
509/*
510 * Returns true iff the first sector pointed to by 'buf' contains at least
511 * a non-NUL byte.
512 *
513 * 'pnum' is set to the number of sectors (including and immediately following
514 * the first one) that are known to be in the same allocated/unallocated state.
515 */
ea2384d3
FB
516static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
517{
518 int v, i;
519
520 if (n <= 0) {
521 *pnum = 0;
522 return 0;
523 }
524 v = is_not_zero(buf, 512);
525 for(i = 1; i < n; i++) {
526 buf += 512;
527 if (v != is_not_zero(buf, 512))
528 break;
529 }
530 *pnum = i;
531 return v;
532}
533
3e85c6fd
KW
534/*
535 * Compares two buffers sector by sector. Returns 0 if the first sector of both
536 * buffers matches, non-zero otherwise.
537 *
538 * pnum is set to the number of sectors (including and immediately following
539 * the first one) that are known to have the same comparison result
540 */
541static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
542 int *pnum)
543{
544 int res, i;
545
546 if (n <= 0) {
547 *pnum = 0;
548 return 0;
549 }
550
551 res = !!memcmp(buf1, buf2, 512);
552 for(i = 1; i < n; i++) {
553 buf1 += 512;
554 buf2 += 512;
555
556 if (!!memcmp(buf1, buf2, 512) != res) {
557 break;
558 }
559 }
560
561 *pnum = i;
562 return res;
563}
564
80ee15a6 565#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3
FB
566
567static int img_convert(int argc, char **argv)
568{
eec77d9e 569 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
f58c7b35 570 const char *fmt, *out_fmt, *out_baseimg, *out_filename;
b50cbabc 571 BlockDriver *drv, *proto_drv;
c2abccec 572 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
573 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
574 uint64_t bs_sectors;
c2abccec 575 uint8_t * buf = NULL;
ea2384d3 576 const uint8_t *buf1;
faea38e7 577 BlockDriverInfo bdi;
b50cbabc 578 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 579 QEMUOptionParameter *out_baseimg_param;
efa84d43 580 char *options = NULL;
51ef6727 581 const char *snapshot_name = NULL;
ea2384d3
FB
582
583 fmt = NULL;
584 out_fmt = "raw";
f58c7b35 585 out_baseimg = NULL;
eec77d9e 586 compress = 0;
ea2384d3 587 for(;;) {
51ef6727 588 c = getopt(argc, argv, "f:O:B:s:hce6o:");
b8fb60da 589 if (c == -1) {
ea2384d3 590 break;
b8fb60da 591 }
ea2384d3 592 switch(c) {
ef87394c 593 case '?':
ea2384d3
FB
594 case 'h':
595 help();
596 break;
597 case 'f':
598 fmt = optarg;
599 break;
600 case 'O':
601 out_fmt = optarg;
602 break;
f58c7b35
TS
603 case 'B':
604 out_baseimg = optarg;
605 break;
ea2384d3 606 case 'c':
eec77d9e 607 compress = 1;
ea2384d3
FB
608 break;
609 case 'e':
15654a6d 610 error_report("qemu-img: option -e is deprecated, please use \'-o "
eec77d9e
JS
611 "encryption\' instead!");
612 return 1;
ec36ba14 613 case '6':
15654a6d 614 error_report("qemu-img: option -6 is deprecated, please use \'-o "
eec77d9e
JS
615 "compat6\' instead!");
616 return 1;
efa84d43
KW
617 case 'o':
618 options = optarg;
619 break;
51ef6727 620 case 's':
621 snapshot_name = optarg;
622 break;
ea2384d3
FB
623 }
624 }
3b46e624 625
926c2d23 626 bs_n = argc - optind - 1;
b8fb60da
JS
627 if (bs_n < 1) {
628 help();
629 }
926c2d23
AZ
630
631 out_filename = argv[argc - 1];
f58c7b35 632
4ac8aacd
JS
633 if (options && !strcmp(options, "?")) {
634 ret = print_block_option_help(out_filename, out_fmt);
635 goto out;
636 }
637
c2abccec 638 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
639 error_report("-B makes no sense when concatenating multiple input "
640 "images");
31ca34b8
JS
641 ret = -1;
642 goto out;
c2abccec 643 }
926c2d23 644
5bdf61fd 645 bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
646
647 total_sectors = 0;
648 for (bs_i = 0; bs_i < bs_n; bs_i++) {
adfe078e 649 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
c2abccec 650 if (!bs[bs_i]) {
15654a6d 651 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
652 ret = -1;
653 goto out;
654 }
926c2d23
AZ
655 bdrv_get_geometry(bs[bs_i], &bs_sectors);
656 total_sectors += bs_sectors;
657 }
ea2384d3 658
51ef6727 659 if (snapshot_name != NULL) {
660 if (bs_n > 1) {
15654a6d 661 error_report("No support for concatenating multiple snapshot\n");
51ef6727 662 ret = -1;
663 goto out;
664 }
665 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
15654a6d 666 error_report("Failed to load snapshot\n");
51ef6727 667 ret = -1;
668 goto out;
669 }
670 }
671
efa84d43 672 /* Find driver and parse its options */
ea2384d3 673 drv = bdrv_find_format(out_fmt);
c2abccec 674 if (!drv) {
15654a6d 675 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
676 ret = -1;
677 goto out;
678 }
efa84d43 679
b50cbabc 680 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 681 if (!proto_drv) {
15654a6d 682 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
683 ret = -1;
684 goto out;
685 }
b50cbabc
MK
686
687 create_options = append_option_parameters(create_options,
688 drv->create_options);
689 create_options = append_option_parameters(create_options,
690 proto_drv->create_options);
db08adf5 691
efa84d43 692 if (options) {
b50cbabc 693 param = parse_option_parameters(options, create_options, param);
efa84d43 694 if (param == NULL) {
15654a6d 695 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
696 ret = -1;
697 goto out;
efa84d43
KW
698 }
699 } else {
b50cbabc 700 param = parse_option_parameters("", create_options, param);
efa84d43
KW
701 }
702
703 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 704 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
705 if (ret < 0) {
706 goto out;
707 }
efa84d43 708
a18953fb
KW
709 /* Get backing file name if -o backing_file was used */
710 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
711 if (out_baseimg_param) {
712 out_baseimg = out_baseimg_param->value.s;
713 }
714
efa84d43 715 /* Check if compression is supported */
eec77d9e 716 if (compress) {
efa84d43
KW
717 QEMUOptionParameter *encryption =
718 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
719
720 if (!drv->bdrv_write_compressed) {
15654a6d 721 error_report("Compression not supported for this file format");
c2abccec
MK
722 ret = -1;
723 goto out;
efa84d43
KW
724 }
725
726 if (encryption && encryption->value.n) {
15654a6d
JS
727 error_report("Compression and encryption not supported at "
728 "the same time");
c2abccec
MK
729 ret = -1;
730 goto out;
efa84d43
KW
731 }
732 }
733
734 /* Create the new image */
735 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
736 if (ret < 0) {
737 if (ret == -ENOTSUP) {
15654a6d
JS
738 error_report("Formatting not supported for file format '%s'",
739 out_fmt);
6e9ea0c0 740 } else if (ret == -EFBIG) {
15654a6d
JS
741 error_report("The image size is too large for file format '%s'",
742 out_fmt);
ea2384d3 743 } else {
15654a6d
JS
744 error_report("%s: error while converting %s: %s",
745 out_filename, out_fmt, strerror(-ret));
ea2384d3 746 }
c2abccec 747 goto out;
ea2384d3 748 }
3b46e624 749
1bd8e175
KW
750 out_bs = bdrv_new_open(out_filename, out_fmt,
751 BDRV_O_FLAGS | BDRV_O_RDWR | BDRV_O_NO_FLUSH);
c2abccec
MK
752 if (!out_bs) {
753 ret = -1;
754 goto out;
755 }
ea2384d3 756
926c2d23
AZ
757 bs_i = 0;
758 bs_offset = 0;
759 bdrv_get_geometry(bs[0], &bs_sectors);
d6771bfa 760 buf = qemu_malloc(IO_BUF_SIZE);
926c2d23 761
eec77d9e 762 if (compress) {
c2abccec
MK
763 ret = bdrv_get_info(out_bs, &bdi);
764 if (ret < 0) {
15654a6d 765 error_report("could not get block driver info");
c2abccec
MK
766 goto out;
767 }
faea38e7 768 cluster_size = bdi.cluster_size;
c2abccec 769 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 770 error_report("invalid cluster size");
c2abccec
MK
771 ret = -1;
772 goto out;
773 }
ea2384d3
FB
774 cluster_sectors = cluster_size >> 9;
775 sector_num = 0;
776 for(;;) {
926c2d23
AZ
777 int64_t bs_num;
778 int remainder;
779 uint8_t *buf2;
780
ea2384d3
FB
781 nb_sectors = total_sectors - sector_num;
782 if (nb_sectors <= 0)
783 break;
784 if (nb_sectors >= cluster_sectors)
785 n = cluster_sectors;
786 else
787 n = nb_sectors;
926c2d23
AZ
788
789 bs_num = sector_num - bs_offset;
790 assert (bs_num >= 0);
791 remainder = n;
792 buf2 = buf;
793 while (remainder > 0) {
794 int nlow;
795 while (bs_num == bs_sectors) {
796 bs_i++;
797 assert (bs_i < bs_n);
798 bs_offset += bs_sectors;
799 bdrv_get_geometry(bs[bs_i], &bs_sectors);
800 bs_num = 0;
0bfcd599
BS
801 /* printf("changing part: sector_num=%" PRId64 ", "
802 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
803 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
804 }
805 assert (bs_num < bs_sectors);
806
807 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
808
c2abccec
MK
809 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
810 if (ret < 0) {
15654a6d 811 error_report("error while reading");
c2abccec
MK
812 goto out;
813 }
926c2d23
AZ
814
815 buf2 += nlow * 512;
816 bs_num += nlow;
817
818 remainder -= nlow;
819 }
820 assert (remainder == 0);
821
b8fb60da 822 if (n < cluster_sectors) {
ea2384d3 823 memset(buf + n * 512, 0, cluster_size - n * 512);
b8fb60da 824 }
ea2384d3 825 if (is_not_zero(buf, cluster_size)) {
c2abccec
MK
826 ret = bdrv_write_compressed(out_bs, sector_num, buf,
827 cluster_sectors);
828 if (ret != 0) {
15654a6d 829 error_report("error while compressing sector %" PRId64,
ec3757de 830 sector_num);
c2abccec
MK
831 goto out;
832 }
ea2384d3
FB
833 }
834 sector_num += n;
835 }
faea38e7
FB
836 /* signal EOF to align */
837 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 838 } else {
f2feebbd
KW
839 int has_zero_init = bdrv_has_zero_init(out_bs);
840
f58c7b35 841 sector_num = 0; // total number of sectors converted so far
ea2384d3
FB
842 for(;;) {
843 nb_sectors = total_sectors - sector_num;
b8fb60da 844 if (nb_sectors <= 0) {
ea2384d3 845 break;
b8fb60da
JS
846 }
847 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 848 n = (IO_BUF_SIZE / 512);
b8fb60da 849 } else {
ea2384d3 850 n = nb_sectors;
b8fb60da 851 }
926c2d23
AZ
852
853 while (sector_num - bs_offset >= bs_sectors) {
854 bs_i ++;
855 assert (bs_i < bs_n);
856 bs_offset += bs_sectors;
857 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
858 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
859 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
860 sector_num, bs_i, bs_offset, bs_sectors); */
861 }
862
b8fb60da 863 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 864 n = bs_offset + bs_sectors - sector_num;
b8fb60da 865 }
926c2d23 866
f2feebbd 867 if (has_zero_init) {
d032044f
AS
868 /* If the output image is being created as a copy on write image,
869 assume that sectors which are unallocated in the input image
870 are present in both the output's and input's base images (no
871 need to copy them). */
872 if (out_baseimg) {
873 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
874 n, &n1)) {
875 sector_num += n1;
876 continue;
877 }
878 /* The next 'n1' sectors are allocated in the input image. Copy
879 only those as they may be followed by unallocated sectors. */
880 n = n1;
93c65b47 881 }
93c65b47
AL
882 } else {
883 n1 = n;
f58c7b35
TS
884 }
885
c2abccec
MK
886 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
887 if (ret < 0) {
15654a6d 888 error_report("error while reading");
c2abccec
MK
889 goto out;
890 }
ea2384d3
FB
891 /* NOTE: at the same time we convert, we do not write zero
892 sectors to have a chance to compress the image. Ideally, we
893 should add a specific call to have the info to go faster */
894 buf1 = buf;
895 while (n > 0) {
f58c7b35
TS
896 /* If the output image is being created as a copy on write image,
897 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
898 because they may differ from the sectors in the base image.
899
900 If the output is to a host device, we also write out
901 sectors that are entirely 0, since whatever data was
902 already there is garbage, not 0s. */
f2feebbd 903 if (!has_zero_init || out_baseimg ||
93c65b47 904 is_allocated_sectors(buf1, n, &n1)) {
c2abccec
MK
905 ret = bdrv_write(out_bs, sector_num, buf1, n1);
906 if (ret < 0) {
15654a6d 907 error_report("error while writing");
c2abccec
MK
908 goto out;
909 }
ea2384d3
FB
910 }
911 sector_num += n1;
912 n -= n1;
913 buf1 += n1 * 512;
914 }
915 }
916 }
c2abccec
MK
917out:
918 free_option_parameters(create_options);
919 free_option_parameters(param);
d6771bfa 920 qemu_free(buf);
c2abccec
MK
921 if (out_bs) {
922 bdrv_delete(out_bs);
923 }
31ca34b8
JS
924 if (bs) {
925 for (bs_i = 0; bs_i < bs_n; bs_i++) {
926 if (bs[bs_i]) {
927 bdrv_delete(bs[bs_i]);
928 }
c2abccec 929 }
31ca34b8 930 qemu_free(bs);
c2abccec 931 }
c2abccec
MK
932 if (ret) {
933 return 1;
934 }
ea2384d3
FB
935 return 0;
936}
937
57d1a2b6
FB
938#ifdef _WIN32
939static int64_t get_allocated_file_size(const char *filename)
940{
e8445331
FB
941 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
942 get_compressed_t get_compressed;
57d1a2b6 943 struct _stati64 st;
e8445331
FB
944
945 /* WinNT support GetCompressedFileSize to determine allocate size */
946 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
947 if (get_compressed) {
948 DWORD high, low;
949 low = get_compressed(filename, &high);
950 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
951 return (((int64_t) high) << 32) + low;
952 }
953
5fafdf24 954 if (_stati64(filename, &st) < 0)
57d1a2b6
FB
955 return -1;
956 return st.st_size;
957}
958#else
959static int64_t get_allocated_file_size(const char *filename)
960{
961 struct stat st;
5fafdf24 962 if (stat(filename, &st) < 0)
57d1a2b6
FB
963 return -1;
964 return (int64_t)st.st_blocks * 512;
965}
966#endif
967
faea38e7
FB
968static void dump_snapshots(BlockDriverState *bs)
969{
970 QEMUSnapshotInfo *sn_tab, *sn;
971 int nb_sns, i;
972 char buf[256];
973
974 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
975 if (nb_sns <= 0)
976 return;
977 printf("Snapshot list:\n");
978 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
979 for(i = 0; i < nb_sns; i++) {
980 sn = &sn_tab[i];
981 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
982 }
983 qemu_free(sn_tab);
984}
985
ea2384d3
FB
986static int img_info(int argc, char **argv)
987{
988 int c;
989 const char *filename, *fmt;
ea2384d3
FB
990 BlockDriverState *bs;
991 char fmt_name[128], size_buf[128], dsize_buf[128];
96b8f136
TS
992 uint64_t total_sectors;
993 int64_t allocated_size;
93b6b2a3
FB
994 char backing_filename[1024];
995 char backing_filename2[1024];
faea38e7 996 BlockDriverInfo bdi;
ea2384d3
FB
997
998 fmt = NULL;
999 for(;;) {
1000 c = getopt(argc, argv, "f:h");
b8fb60da 1001 if (c == -1) {
ea2384d3 1002 break;
b8fb60da 1003 }
ea2384d3 1004 switch(c) {
ef87394c 1005 case '?':
ea2384d3
FB
1006 case 'h':
1007 help();
1008 break;
1009 case 'f':
1010 fmt = optarg;
1011 break;
1012 }
1013 }
b8fb60da 1014 if (optind >= argc) {
ea2384d3 1015 help();
b8fb60da 1016 }
ea2384d3
FB
1017 filename = argv[optind++];
1018
adfe078e 1019 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
c2abccec
MK
1020 if (!bs) {
1021 return 1;
1022 }
ea2384d3
FB
1023 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1024 bdrv_get_geometry(bs, &total_sectors);
1025 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
57d1a2b6 1026 allocated_size = get_allocated_file_size(filename);
b8fb60da 1027 if (allocated_size < 0) {
a10ea30b 1028 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
b8fb60da 1029 } else {
5fafdf24 1030 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
de167e41 1031 allocated_size);
b8fb60da 1032 }
ea2384d3
FB
1033 printf("image: %s\n"
1034 "file format: %s\n"
ec3757de 1035 "virtual size: %s (%" PRId64 " bytes)\n"
ea2384d3 1036 "disk size: %s\n",
5fafdf24 1037 filename, fmt_name, size_buf,
ec3757de 1038 (total_sectors * 512),
ea2384d3 1039 dsize_buf);
b8fb60da 1040 if (bdrv_is_encrypted(bs)) {
ea2384d3 1041 printf("encrypted: yes\n");
b8fb60da 1042 }
faea38e7 1043 if (bdrv_get_info(bs, &bdi) >= 0) {
b8fb60da 1044 if (bdi.cluster_size != 0) {
faea38e7 1045 printf("cluster_size: %d\n", bdi.cluster_size);
b8fb60da 1046 }
faea38e7 1047 }
93b6b2a3 1048 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
faea38e7 1049 if (backing_filename[0] != '\0') {
93b6b2a3
FB
1050 path_combine(backing_filename2, sizeof(backing_filename2),
1051 filename, backing_filename);
5fafdf24 1052 printf("backing file: %s (actual path: %s)\n",
93b6b2a3
FB
1053 backing_filename,
1054 backing_filename2);
faea38e7
FB
1055 }
1056 dump_snapshots(bs);
ea2384d3
FB
1057 bdrv_delete(bs);
1058 return 0;
1059}
1060
f7b4a940
AL
1061#define SNAPSHOT_LIST 1
1062#define SNAPSHOT_CREATE 2
1063#define SNAPSHOT_APPLY 3
1064#define SNAPSHOT_DELETE 4
1065
153859be 1066static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1067{
1068 BlockDriverState *bs;
1069 QEMUSnapshotInfo sn;
1070 char *filename, *snapshot_name = NULL;
c2abccec 1071 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
1072 int action = 0;
1073 qemu_timeval tv;
1074
710da702 1075 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
f7b4a940
AL
1076 /* Parse commandline parameters */
1077 for(;;) {
1078 c = getopt(argc, argv, "la:c:d:h");
b8fb60da 1079 if (c == -1) {
f7b4a940 1080 break;
b8fb60da 1081 }
f7b4a940 1082 switch(c) {
ef87394c 1083 case '?':
f7b4a940
AL
1084 case 'h':
1085 help();
153859be 1086 return 0;
f7b4a940
AL
1087 case 'l':
1088 if (action) {
1089 help();
153859be 1090 return 0;
f7b4a940
AL
1091 }
1092 action = SNAPSHOT_LIST;
f5edb014 1093 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
1094 break;
1095 case 'a':
1096 if (action) {
1097 help();
153859be 1098 return 0;
f7b4a940
AL
1099 }
1100 action = SNAPSHOT_APPLY;
1101 snapshot_name = optarg;
1102 break;
1103 case 'c':
1104 if (action) {
1105 help();
153859be 1106 return 0;
f7b4a940
AL
1107 }
1108 action = SNAPSHOT_CREATE;
1109 snapshot_name = optarg;
1110 break;
1111 case 'd':
1112 if (action) {
1113 help();
153859be 1114 return 0;
f7b4a940
AL
1115 }
1116 action = SNAPSHOT_DELETE;
1117 snapshot_name = optarg;
1118 break;
1119 }
1120 }
1121
b8fb60da 1122 if (optind >= argc) {
f7b4a940 1123 help();
b8fb60da 1124 }
f7b4a940
AL
1125 filename = argv[optind++];
1126
1127 /* Open the image */
f163d073 1128 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
c2abccec
MK
1129 if (!bs) {
1130 return 1;
1131 }
f7b4a940
AL
1132
1133 /* Perform the requested action */
1134 switch(action) {
1135 case SNAPSHOT_LIST:
1136 dump_snapshots(bs);
1137 break;
1138
1139 case SNAPSHOT_CREATE:
1140 memset(&sn, 0, sizeof(sn));
1141 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1142
1143 qemu_gettimeofday(&tv);
1144 sn.date_sec = tv.tv_sec;
1145 sn.date_nsec = tv.tv_usec * 1000;
1146
1147 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 1148 if (ret) {
15654a6d 1149 error_report("Could not create snapshot '%s': %d (%s)",
f7b4a940 1150 snapshot_name, ret, strerror(-ret));
b8fb60da 1151 }
f7b4a940
AL
1152 break;
1153
1154 case SNAPSHOT_APPLY:
1155 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 1156 if (ret) {
15654a6d 1157 error_report("Could not apply snapshot '%s': %d (%s)",
f7b4a940 1158 snapshot_name, ret, strerror(-ret));
b8fb60da 1159 }
f7b4a940
AL
1160 break;
1161
1162 case SNAPSHOT_DELETE:
1163 ret = bdrv_snapshot_delete(bs, snapshot_name);
b8fb60da 1164 if (ret) {
15654a6d 1165 error_report("Could not delete snapshot '%s': %d (%s)",
f7b4a940 1166 snapshot_name, ret, strerror(-ret));
b8fb60da 1167 }
f7b4a940
AL
1168 break;
1169 }
1170
1171 /* Cleanup */
1172 bdrv_delete(bs);
c2abccec
MK
1173 if (ret) {
1174 return 1;
1175 }
153859be 1176 return 0;
f7b4a940
AL
1177}
1178
3e85c6fd
KW
1179static int img_rebase(int argc, char **argv)
1180{
c2abccec 1181 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 1182 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 1183 char *filename;
e53dbee0 1184 const char *fmt, *out_basefmt, *out_baseimg;
3e85c6fd
KW
1185 int c, flags, ret;
1186 int unsafe = 0;
1187
1188 /* Parse commandline parameters */
e53dbee0 1189 fmt = NULL;
3e85c6fd
KW
1190 out_baseimg = NULL;
1191 out_basefmt = NULL;
1192
1193 for(;;) {
e53dbee0 1194 c = getopt(argc, argv, "uhf:F:b:");
b8fb60da 1195 if (c == -1) {
3e85c6fd 1196 break;
b8fb60da 1197 }
3e85c6fd 1198 switch(c) {
ef87394c 1199 case '?':
3e85c6fd
KW
1200 case 'h':
1201 help();
1202 return 0;
e53dbee0
KW
1203 case 'f':
1204 fmt = optarg;
1205 break;
3e85c6fd
KW
1206 case 'F':
1207 out_basefmt = optarg;
1208 break;
1209 case 'b':
1210 out_baseimg = optarg;
1211 break;
1212 case 'u':
1213 unsafe = 1;
1214 break;
1215 }
1216 }
1217
b8fb60da 1218 if ((optind >= argc) || !out_baseimg) {
3e85c6fd 1219 help();
b8fb60da 1220 }
3e85c6fd
KW
1221 filename = argv[optind++];
1222
1223 /*
1224 * Open the images.
1225 *
1226 * Ignore the old backing file for unsafe rebase in case we want to correct
1227 * the reference to a renamed or moved backing file.
1228 */
adfe078e 1229 flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
f163d073 1230 bs = bdrv_new_open(filename, fmt, flags);
c2abccec
MK
1231 if (!bs) {
1232 return 1;
1233 }
3e85c6fd
KW
1234
1235 /* Find the right drivers for the backing files */
1236 old_backing_drv = NULL;
1237 new_backing_drv = NULL;
1238
1239 if (!unsafe && bs->backing_format[0] != '\0') {
1240 old_backing_drv = bdrv_find_format(bs->backing_format);
1241 if (old_backing_drv == NULL) {
15654a6d 1242 error_report("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
1243 ret = -1;
1244 goto out;
3e85c6fd
KW
1245 }
1246 }
1247
1248 if (out_basefmt != NULL) {
1249 new_backing_drv = bdrv_find_format(out_basefmt);
1250 if (new_backing_drv == NULL) {
15654a6d 1251 error_report("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
1252 ret = -1;
1253 goto out;
3e85c6fd
KW
1254 }
1255 }
1256
1257 /* For safe rebasing we need to compare old and new backing file */
1258 if (unsafe) {
1259 /* Make the compiler happy */
1260 bs_old_backing = NULL;
1261 bs_new_backing = NULL;
1262 } else {
1263 char backing_name[1024];
1264
1265 bs_old_backing = bdrv_new("old_backing");
1266 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
c2abccec
MK
1267 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1268 old_backing_drv);
1269 if (ret) {
15654a6d 1270 error_report("Could not open old backing file '%s'", backing_name);
c2abccec 1271 goto out;
3e85c6fd
KW
1272 }
1273
1274 bs_new_backing = bdrv_new("new_backing");
cdbae851 1275 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
c2abccec
MK
1276 new_backing_drv);
1277 if (ret) {
15654a6d 1278 error_report("Could not open new backing file '%s'", out_baseimg);
c2abccec 1279 goto out;
3e85c6fd
KW
1280 }
1281 }
1282
1283 /*
1284 * Check each unallocated cluster in the COW file. If it is unallocated,
1285 * accesses go to the backing file. We must therefore compare this cluster
1286 * in the old and new backing file, and if they differ we need to copy it
1287 * from the old backing file into the COW file.
1288 *
1289 * If qemu-img crashes during this step, no harm is done. The content of
1290 * the image is the same as the original one at any time.
1291 */
1292 if (!unsafe) {
1293 uint64_t num_sectors;
1294 uint64_t sector;
cc60e327 1295 int n;
d6771bfa
T
1296 uint8_t * buf_old;
1297 uint8_t * buf_new;
1298
1299 buf_old = qemu_malloc(IO_BUF_SIZE);
1300 buf_new = qemu_malloc(IO_BUF_SIZE);
3e85c6fd
KW
1301
1302 bdrv_get_geometry(bs, &num_sectors);
1303
1304 for (sector = 0; sector < num_sectors; sector += n) {
1305
1306 /* How many sectors can we handle with the next read? */
1307 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1308 n = (IO_BUF_SIZE / 512);
1309 } else {
1310 n = num_sectors - sector;
1311 }
1312
1313 /* If the cluster is allocated, we don't need to take action */
cc60e327
KW
1314 ret = bdrv_is_allocated(bs, sector, n, &n);
1315 if (ret) {
3e85c6fd
KW
1316 continue;
1317 }
1318
1319 /* Read old and new backing file */
c2abccec
MK
1320 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1321 if (ret < 0) {
15654a6d 1322 error_report("error while reading from old backing file");
c2abccec 1323 goto out;
3e85c6fd 1324 }
c2abccec
MK
1325 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1326 if (ret < 0) {
15654a6d 1327 error_report("error while reading from new backing file");
c2abccec 1328 goto out;
3e85c6fd
KW
1329 }
1330
1331 /* If they differ, we need to write to the COW file */
1332 uint64_t written = 0;
1333
1334 while (written < n) {
1335 int pnum;
1336
1337 if (compare_sectors(buf_old + written * 512,
60b1bd4f 1338 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
1339 {
1340 ret = bdrv_write(bs, sector + written,
1341 buf_old + written * 512, pnum);
1342 if (ret < 0) {
15654a6d 1343 error_report("Error while writing to COW image: %s",
3e85c6fd 1344 strerror(-ret));
c2abccec 1345 goto out;
3e85c6fd
KW
1346 }
1347 }
1348
1349 written += pnum;
1350 }
1351 }
d6771bfa
T
1352
1353 qemu_free(buf_old);
1354 qemu_free(buf_new);
3e85c6fd
KW
1355 }
1356
1357 /*
1358 * Change the backing file. All clusters that are different from the old
1359 * backing file are overwritten in the COW file now, so the visible content
1360 * doesn't change when we switch the backing file.
1361 */
1362 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1363 if (ret == -ENOSPC) {
15654a6d
JS
1364 error_report("Could not change the backing file to '%s': No "
1365 "space left in the file header", out_baseimg);
3e85c6fd 1366 } else if (ret < 0) {
15654a6d 1367 error_report("Could not change the backing file to '%s': %s",
3e85c6fd
KW
1368 out_baseimg, strerror(-ret));
1369 }
1370
1371 /*
1372 * TODO At this point it is possible to check if any clusters that are
1373 * allocated in the COW file are the same in the backing file. If so, they
1374 * could be dropped from the COW file. Don't do this before switching the
1375 * backing file, in case of a crash this would lead to corruption.
1376 */
c2abccec 1377out:
3e85c6fd
KW
1378 /* Cleanup */
1379 if (!unsafe) {
1380 bdrv_delete(bs_old_backing);
1381 bdrv_delete(bs_new_backing);
1382 }
1383
1384 bdrv_delete(bs);
c2abccec
MK
1385 if (ret) {
1386 return 1;
1387 }
3e85c6fd
KW
1388 return 0;
1389}
1390
ae6b0ed6
SH
1391static int img_resize(int argc, char **argv)
1392{
1393 int c, ret, relative;
1394 const char *filename, *fmt, *size;
1395 int64_t n, total_size;
2a81998a 1396 BlockDriverState *bs = NULL;
ae6b0ed6
SH
1397 QEMUOptionParameter *param;
1398 QEMUOptionParameter resize_options[] = {
1399 {
1400 .name = BLOCK_OPT_SIZE,
1401 .type = OPT_SIZE,
1402 .help = "Virtual disk size"
1403 },
1404 { NULL }
1405 };
1406
1407 fmt = NULL;
1408 for(;;) {
1409 c = getopt(argc, argv, "f:h");
1410 if (c == -1) {
1411 break;
1412 }
1413 switch(c) {
ef87394c 1414 case '?':
ae6b0ed6
SH
1415 case 'h':
1416 help();
1417 break;
1418 case 'f':
1419 fmt = optarg;
1420 break;
1421 }
1422 }
1423 if (optind + 1 >= argc) {
1424 help();
1425 }
1426 filename = argv[optind++];
1427 size = argv[optind++];
1428
1429 /* Choose grow, shrink, or absolute resize mode */
1430 switch (size[0]) {
1431 case '+':
1432 relative = 1;
1433 size++;
1434 break;
1435 case '-':
1436 relative = -1;
1437 size++;
1438 break;
1439 default:
1440 relative = 0;
1441 break;
1442 }
1443
1444 /* Parse size */
1445 param = parse_option_parameters("", resize_options, NULL);
1446 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1447 /* Error message already printed when size parsing fails */
2a81998a
JS
1448 ret = -1;
1449 goto out;
ae6b0ed6
SH
1450 }
1451 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1452 free_option_parameters(param);
1453
1454 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
c2abccec 1455 if (!bs) {
2a81998a
JS
1456 ret = -1;
1457 goto out;
c2abccec 1458 }
ae6b0ed6
SH
1459
1460 if (relative) {
1461 total_size = bdrv_getlength(bs) + n * relative;
1462 } else {
1463 total_size = n;
1464 }
1465 if (total_size <= 0) {
15654a6d 1466 error_report("New image size must be positive");
c2abccec
MK
1467 ret = -1;
1468 goto out;
ae6b0ed6
SH
1469 }
1470
1471 ret = bdrv_truncate(bs, total_size);
1472 switch (ret) {
1473 case 0:
1474 printf("Image resized.\n");
1475 break;
1476 case -ENOTSUP:
15654a6d 1477 error_report("This image format does not support resize");
ae6b0ed6
SH
1478 break;
1479 case -EACCES:
15654a6d 1480 error_report("Image is read-only");
ae6b0ed6
SH
1481 break;
1482 default:
15654a6d 1483 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
1484 break;
1485 }
c2abccec 1486out:
2a81998a
JS
1487 if (bs) {
1488 bdrv_delete(bs);
1489 }
c2abccec
MK
1490 if (ret) {
1491 return 1;
1492 }
ae6b0ed6
SH
1493 return 0;
1494}
1495
c227f099 1496static const img_cmd_t img_cmds[] = {
153859be
SB
1497#define DEF(option, callback, arg_string) \
1498 { option, callback },
1499#include "qemu-img-cmds.h"
1500#undef DEF
1501#undef GEN_DOCS
1502 { NULL, NULL, },
1503};
1504
ea2384d3
FB
1505int main(int argc, char **argv)
1506{
c227f099 1507 const img_cmd_t *cmd;
153859be 1508 const char *cmdname;
ea2384d3 1509
53f76e58
KW
1510 error_set_progname(argv[0]);
1511
ea2384d3
FB
1512 bdrv_init();
1513 if (argc < 2)
1514 help();
153859be 1515 cmdname = argv[1];
8f9b157e 1516 argc--; argv++;
153859be
SB
1517
1518 /* find the command */
1519 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1520 if (!strcmp(cmdname, cmd->name)) {
1521 return cmd->handler(argc, argv);
1522 }
ea2384d3 1523 }
153859be
SB
1524
1525 /* not found */
1526 help();
ea2384d3
FB
1527 return 0;
1528}