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