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