]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
rtl8139: remove unused marco
[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
f58c7b35
TS
517/*
518 * Returns true iff the first sector pointed to by 'buf' contains at least
519 * a non-NUL byte.
520 *
521 * 'pnum' is set to the number of sectors (including and immediately following
522 * the first one) that are known to be in the same allocated/unallocated state.
523 */
ea2384d3
FB
524static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
525{
1a6d39fd
SH
526 bool is_zero;
527 int i;
ea2384d3
FB
528
529 if (n <= 0) {
530 *pnum = 0;
531 return 0;
532 }
1a6d39fd 533 is_zero = buffer_is_zero(buf, 512);
ea2384d3
FB
534 for(i = 1; i < n; i++) {
535 buf += 512;
1a6d39fd 536 if (is_zero != buffer_is_zero(buf, 512)) {
ea2384d3 537 break;
1a6d39fd 538 }
ea2384d3
FB
539 }
540 *pnum = i;
1a6d39fd 541 return !is_zero;
ea2384d3
FB
542}
543
a22f123c
KW
544/*
545 * Like is_allocated_sectors, but if the buffer starts with a used sector,
546 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
547 * breaking up write requests for only small sparse areas.
548 */
549static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
550 int min)
551{
552 int ret;
553 int num_checked, num_used;
554
555 if (n < min) {
556 min = n;
557 }
558
559 ret = is_allocated_sectors(buf, n, pnum);
560 if (!ret) {
561 return ret;
562 }
563
564 num_used = *pnum;
565 buf += BDRV_SECTOR_SIZE * *pnum;
566 n -= *pnum;
567 num_checked = num_used;
568
569 while (n > 0) {
570 ret = is_allocated_sectors(buf, n, pnum);
571
572 buf += BDRV_SECTOR_SIZE * *pnum;
573 n -= *pnum;
574 num_checked += *pnum;
575 if (ret) {
576 num_used = num_checked;
577 } else if (*pnum >= min) {
578 break;
579 }
580 }
581
582 *pnum = num_used;
583 return 1;
584}
585
3e85c6fd
KW
586/*
587 * Compares two buffers sector by sector. Returns 0 if the first sector of both
588 * buffers matches, non-zero otherwise.
589 *
590 * pnum is set to the number of sectors (including and immediately following
591 * the first one) that are known to have the same comparison result
592 */
593static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
594 int *pnum)
595{
596 int res, i;
597
598 if (n <= 0) {
599 *pnum = 0;
600 return 0;
601 }
602
603 res = !!memcmp(buf1, buf2, 512);
604 for(i = 1; i < n; i++) {
605 buf1 += 512;
606 buf2 += 512;
607
608 if (!!memcmp(buf1, buf2, 512) != res) {
609 break;
610 }
611 }
612
613 *pnum = i;
614 return res;
615}
616
80ee15a6 617#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3
FB
618
619static int img_convert(int argc, char **argv)
620{
eec77d9e 621 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
661a0f71
FS
622 int progress = 0, flags;
623 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
b50cbabc 624 BlockDriver *drv, *proto_drv;
c2abccec 625 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
626 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
627 uint64_t bs_sectors;
c2abccec 628 uint8_t * buf = NULL;
ea2384d3 629 const uint8_t *buf1;
faea38e7 630 BlockDriverInfo bdi;
b50cbabc 631 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 632 QEMUOptionParameter *out_baseimg_param;
efa84d43 633 char *options = NULL;
51ef6727 634 const char *snapshot_name = NULL;
6b837bc4 635 float local_progress;
a22f123c 636 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
ea2384d3
FB
637
638 fmt = NULL;
639 out_fmt = "raw";
661a0f71 640 cache = "unsafe";
f58c7b35 641 out_baseimg = NULL;
eec77d9e 642 compress = 0;
ea2384d3 643 for(;;) {
a22f123c 644 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
b8fb60da 645 if (c == -1) {
ea2384d3 646 break;
b8fb60da 647 }
ea2384d3 648 switch(c) {
ef87394c 649 case '?':
ea2384d3
FB
650 case 'h':
651 help();
652 break;
653 case 'f':
654 fmt = optarg;
655 break;
656 case 'O':
657 out_fmt = optarg;
658 break;
f58c7b35
TS
659 case 'B':
660 out_baseimg = optarg;
661 break;
ea2384d3 662 case 'c':
eec77d9e 663 compress = 1;
ea2384d3
FB
664 break;
665 case 'e':
9d42e15d 666 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
667 "encryption\' instead!");
668 return 1;
ec36ba14 669 case '6':
9d42e15d 670 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
671 "compat6\' instead!");
672 return 1;
efa84d43
KW
673 case 'o':
674 options = optarg;
675 break;
51ef6727 676 case 's':
677 snapshot_name = optarg;
678 break;
a22f123c
KW
679 case 'S':
680 {
681 int64_t sval;
e36b3695
MA
682 char *end;
683 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
684 if (sval < 0 || *end) {
a22f123c
KW
685 error_report("Invalid minimum zero buffer size for sparse output specified");
686 return 1;
687 }
688
689 min_sparse = sval / BDRV_SECTOR_SIZE;
690 break;
691 }
6b837bc4
JS
692 case 'p':
693 progress = 1;
694 break;
661a0f71
FS
695 case 't':
696 cache = optarg;
697 break;
ea2384d3
FB
698 }
699 }
3b46e624 700
926c2d23 701 bs_n = argc - optind - 1;
b8fb60da
JS
702 if (bs_n < 1) {
703 help();
704 }
926c2d23
AZ
705
706 out_filename = argv[argc - 1];
f58c7b35 707
4ac8aacd
JS
708 if (options && !strcmp(options, "?")) {
709 ret = print_block_option_help(out_filename, out_fmt);
710 goto out;
711 }
712
c2abccec 713 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
714 error_report("-B makes no sense when concatenating multiple input "
715 "images");
31ca34b8
JS
716 ret = -1;
717 goto out;
c2abccec 718 }
926c2d23 719
6b837bc4
JS
720 qemu_progress_init(progress, 2.0);
721 qemu_progress_print(0, 100);
722
7267c094 723 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
724
725 total_sectors = 0;
726 for (bs_i = 0; bs_i < bs_n; bs_i++) {
adfe078e 727 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
c2abccec 728 if (!bs[bs_i]) {
15654a6d 729 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
730 ret = -1;
731 goto out;
732 }
926c2d23
AZ
733 bdrv_get_geometry(bs[bs_i], &bs_sectors);
734 total_sectors += bs_sectors;
735 }
ea2384d3 736
51ef6727 737 if (snapshot_name != NULL) {
738 if (bs_n > 1) {
6daf194d 739 error_report("No support for concatenating multiple snapshot");
51ef6727 740 ret = -1;
741 goto out;
742 }
743 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
6daf194d 744 error_report("Failed to load snapshot");
51ef6727 745 ret = -1;
746 goto out;
747 }
748 }
749
efa84d43 750 /* Find driver and parse its options */
ea2384d3 751 drv = bdrv_find_format(out_fmt);
c2abccec 752 if (!drv) {
15654a6d 753 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
754 ret = -1;
755 goto out;
756 }
efa84d43 757
b50cbabc 758 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 759 if (!proto_drv) {
15654a6d 760 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
761 ret = -1;
762 goto out;
763 }
b50cbabc
MK
764
765 create_options = append_option_parameters(create_options,
766 drv->create_options);
767 create_options = append_option_parameters(create_options,
768 proto_drv->create_options);
db08adf5 769
efa84d43 770 if (options) {
b50cbabc 771 param = parse_option_parameters(options, create_options, param);
efa84d43 772 if (param == NULL) {
15654a6d 773 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
774 ret = -1;
775 goto out;
efa84d43
KW
776 }
777 } else {
b50cbabc 778 param = parse_option_parameters("", create_options, param);
efa84d43
KW
779 }
780
781 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 782 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
783 if (ret < 0) {
784 goto out;
785 }
efa84d43 786
a18953fb
KW
787 /* Get backing file name if -o backing_file was used */
788 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
789 if (out_baseimg_param) {
790 out_baseimg = out_baseimg_param->value.s;
791 }
792
efa84d43 793 /* Check if compression is supported */
eec77d9e 794 if (compress) {
efa84d43
KW
795 QEMUOptionParameter *encryption =
796 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
41521fa4
KW
797 QEMUOptionParameter *preallocation =
798 get_option_parameter(param, BLOCK_OPT_PREALLOC);
efa84d43
KW
799
800 if (!drv->bdrv_write_compressed) {
15654a6d 801 error_report("Compression not supported for this file format");
c2abccec
MK
802 ret = -1;
803 goto out;
efa84d43
KW
804 }
805
806 if (encryption && encryption->value.n) {
15654a6d
JS
807 error_report("Compression and encryption not supported at "
808 "the same time");
c2abccec
MK
809 ret = -1;
810 goto out;
efa84d43 811 }
41521fa4
KW
812
813 if (preallocation && preallocation->value.s
814 && strcmp(preallocation->value.s, "off"))
815 {
816 error_report("Compression and preallocation not supported at "
817 "the same time");
818 ret = -1;
819 goto out;
820 }
efa84d43
KW
821 }
822
823 /* Create the new image */
824 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
825 if (ret < 0) {
826 if (ret == -ENOTSUP) {
15654a6d
JS
827 error_report("Formatting not supported for file format '%s'",
828 out_fmt);
6e9ea0c0 829 } else if (ret == -EFBIG) {
15654a6d
JS
830 error_report("The image size is too large for file format '%s'",
831 out_fmt);
ea2384d3 832 } else {
15654a6d
JS
833 error_report("%s: error while converting %s: %s",
834 out_filename, out_fmt, strerror(-ret));
ea2384d3 835 }
c2abccec 836 goto out;
ea2384d3 837 }
3b46e624 838
661a0f71 839 flags = BDRV_O_RDWR;
c3993cdc 840 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
841 if (ret < 0) {
842 error_report("Invalid cache option: %s", cache);
843 return -1;
844 }
845
846 out_bs = bdrv_new_open(out_filename, out_fmt, flags);
c2abccec
MK
847 if (!out_bs) {
848 ret = -1;
849 goto out;
850 }
ea2384d3 851
926c2d23
AZ
852 bs_i = 0;
853 bs_offset = 0;
854 bdrv_get_geometry(bs[0], &bs_sectors);
bb1c0597 855 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
926c2d23 856
eec77d9e 857 if (compress) {
c2abccec
MK
858 ret = bdrv_get_info(out_bs, &bdi);
859 if (ret < 0) {
15654a6d 860 error_report("could not get block driver info");
c2abccec
MK
861 goto out;
862 }
faea38e7 863 cluster_size = bdi.cluster_size;
c2abccec 864 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 865 error_report("invalid cluster size");
c2abccec
MK
866 ret = -1;
867 goto out;
868 }
ea2384d3
FB
869 cluster_sectors = cluster_size >> 9;
870 sector_num = 0;
6b837bc4
JS
871
872 nb_sectors = total_sectors;
873 local_progress = (float)100 /
4ee96418 874 (nb_sectors / MIN(nb_sectors, cluster_sectors));
6b837bc4 875
ea2384d3 876 for(;;) {
926c2d23
AZ
877 int64_t bs_num;
878 int remainder;
879 uint8_t *buf2;
880
ea2384d3
FB
881 nb_sectors = total_sectors - sector_num;
882 if (nb_sectors <= 0)
883 break;
884 if (nb_sectors >= cluster_sectors)
885 n = cluster_sectors;
886 else
887 n = nb_sectors;
926c2d23
AZ
888
889 bs_num = sector_num - bs_offset;
890 assert (bs_num >= 0);
891 remainder = n;
892 buf2 = buf;
893 while (remainder > 0) {
894 int nlow;
895 while (bs_num == bs_sectors) {
896 bs_i++;
897 assert (bs_i < bs_n);
898 bs_offset += bs_sectors;
899 bdrv_get_geometry(bs[bs_i], &bs_sectors);
900 bs_num = 0;
0bfcd599
BS
901 /* printf("changing part: sector_num=%" PRId64 ", "
902 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
903 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
904 }
905 assert (bs_num < bs_sectors);
906
907 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
908
c2abccec
MK
909 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
910 if (ret < 0) {
3fba9d81
SH
911 error_report("error while reading sector %" PRId64 ": %s",
912 bs_num, strerror(-ret));
c2abccec
MK
913 goto out;
914 }
926c2d23
AZ
915
916 buf2 += nlow * 512;
917 bs_num += nlow;
918
919 remainder -= nlow;
920 }
921 assert (remainder == 0);
922
b8fb60da 923 if (n < cluster_sectors) {
ea2384d3 924 memset(buf + n * 512, 0, cluster_size - n * 512);
b8fb60da 925 }
1a6d39fd 926 if (!buffer_is_zero(buf, cluster_size)) {
c2abccec
MK
927 ret = bdrv_write_compressed(out_bs, sector_num, buf,
928 cluster_sectors);
929 if (ret != 0) {
3fba9d81
SH
930 error_report("error while compressing sector %" PRId64
931 ": %s", sector_num, strerror(-ret));
c2abccec
MK
932 goto out;
933 }
ea2384d3
FB
934 }
935 sector_num += n;
6b837bc4 936 qemu_progress_print(local_progress, 100);
ea2384d3 937 }
faea38e7
FB
938 /* signal EOF to align */
939 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 940 } else {
f2feebbd
KW
941 int has_zero_init = bdrv_has_zero_init(out_bs);
942
f58c7b35 943 sector_num = 0; // total number of sectors converted so far
6b837bc4
JS
944 nb_sectors = total_sectors - sector_num;
945 local_progress = (float)100 /
4ee96418 946 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
6b837bc4 947
ea2384d3
FB
948 for(;;) {
949 nb_sectors = total_sectors - sector_num;
b8fb60da 950 if (nb_sectors <= 0) {
ea2384d3 951 break;
b8fb60da
JS
952 }
953 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 954 n = (IO_BUF_SIZE / 512);
b8fb60da 955 } else {
ea2384d3 956 n = nb_sectors;
b8fb60da 957 }
926c2d23
AZ
958
959 while (sector_num - bs_offset >= bs_sectors) {
960 bs_i ++;
961 assert (bs_i < bs_n);
962 bs_offset += bs_sectors;
963 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
964 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
965 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
966 sector_num, bs_i, bs_offset, bs_sectors); */
967 }
968
b8fb60da 969 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 970 n = bs_offset + bs_sectors - sector_num;
b8fb60da 971 }
926c2d23 972
f2feebbd 973 if (has_zero_init) {
d032044f
AS
974 /* If the output image is being created as a copy on write image,
975 assume that sectors which are unallocated in the input image
976 are present in both the output's and input's base images (no
977 need to copy them). */
978 if (out_baseimg) {
979 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
980 n, &n1)) {
981 sector_num += n1;
982 continue;
983 }
984 /* The next 'n1' sectors are allocated in the input image. Copy
985 only those as they may be followed by unallocated sectors. */
986 n = n1;
93c65b47 987 }
93c65b47
AL
988 } else {
989 n1 = n;
f58c7b35
TS
990 }
991
c2abccec
MK
992 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
993 if (ret < 0) {
3fba9d81
SH
994 error_report("error while reading sector %" PRId64 ": %s",
995 sector_num - bs_offset, strerror(-ret));
c2abccec
MK
996 goto out;
997 }
ea2384d3
FB
998 /* NOTE: at the same time we convert, we do not write zero
999 sectors to have a chance to compress the image. Ideally, we
1000 should add a specific call to have the info to go faster */
1001 buf1 = buf;
1002 while (n > 0) {
f58c7b35
TS
1003 /* If the output image is being created as a copy on write image,
1004 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
1005 because they may differ from the sectors in the base image.
1006
1007 If the output is to a host device, we also write out
1008 sectors that are entirely 0, since whatever data was
1009 already there is garbage, not 0s. */
f2feebbd 1010 if (!has_zero_init || out_baseimg ||
a22f123c 1011 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
c2abccec
MK
1012 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1013 if (ret < 0) {
3fba9d81
SH
1014 error_report("error while writing sector %" PRId64
1015 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1016 goto out;
1017 }
ea2384d3
FB
1018 }
1019 sector_num += n1;
1020 n -= n1;
1021 buf1 += n1 * 512;
1022 }
6b837bc4 1023 qemu_progress_print(local_progress, 100);
ea2384d3
FB
1024 }
1025 }
c2abccec 1026out:
6b837bc4 1027 qemu_progress_end();
c2abccec
MK
1028 free_option_parameters(create_options);
1029 free_option_parameters(param);
bb1c0597 1030 qemu_vfree(buf);
c2abccec
MK
1031 if (out_bs) {
1032 bdrv_delete(out_bs);
1033 }
31ca34b8
JS
1034 if (bs) {
1035 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1036 if (bs[bs_i]) {
1037 bdrv_delete(bs[bs_i]);
1038 }
c2abccec 1039 }
7267c094 1040 g_free(bs);
c2abccec 1041 }
c2abccec
MK
1042 if (ret) {
1043 return 1;
1044 }
ea2384d3
FB
1045 return 0;
1046}
1047
57d1a2b6 1048
faea38e7
FB
1049static void dump_snapshots(BlockDriverState *bs)
1050{
1051 QEMUSnapshotInfo *sn_tab, *sn;
1052 int nb_sns, i;
1053 char buf[256];
1054
1055 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1056 if (nb_sns <= 0)
1057 return;
1058 printf("Snapshot list:\n");
1059 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1060 for(i = 0; i < nb_sns; i++) {
1061 sn = &sn_tab[i];
1062 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1063 }
7267c094 1064 g_free(sn_tab);
faea38e7
FB
1065}
1066
ea2384d3
FB
1067static int img_info(int argc, char **argv)
1068{
1069 int c;
1070 const char *filename, *fmt;
ea2384d3
FB
1071 BlockDriverState *bs;
1072 char fmt_name[128], size_buf[128], dsize_buf[128];
96b8f136
TS
1073 uint64_t total_sectors;
1074 int64_t allocated_size;
93b6b2a3
FB
1075 char backing_filename[1024];
1076 char backing_filename2[1024];
faea38e7 1077 BlockDriverInfo bdi;
ea2384d3
FB
1078
1079 fmt = NULL;
1080 for(;;) {
1081 c = getopt(argc, argv, "f:h");
b8fb60da 1082 if (c == -1) {
ea2384d3 1083 break;
b8fb60da 1084 }
ea2384d3 1085 switch(c) {
ef87394c 1086 case '?':
ea2384d3
FB
1087 case 'h':
1088 help();
1089 break;
1090 case 'f':
1091 fmt = optarg;
1092 break;
1093 }
1094 }
b8fb60da 1095 if (optind >= argc) {
ea2384d3 1096 help();
b8fb60da 1097 }
ea2384d3
FB
1098 filename = argv[optind++];
1099
adfe078e 1100 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
c2abccec
MK
1101 if (!bs) {
1102 return 1;
1103 }
ea2384d3
FB
1104 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1105 bdrv_get_geometry(bs, &total_sectors);
1106 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
4a1d5e1f 1107 allocated_size = bdrv_get_allocated_file_size(bs);
b8fb60da 1108 if (allocated_size < 0) {
a10ea30b 1109 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
b8fb60da 1110 } else {
5fafdf24 1111 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
de167e41 1112 allocated_size);
b8fb60da 1113 }
ea2384d3
FB
1114 printf("image: %s\n"
1115 "file format: %s\n"
ec3757de 1116 "virtual size: %s (%" PRId64 " bytes)\n"
ea2384d3 1117 "disk size: %s\n",
5fafdf24 1118 filename, fmt_name, size_buf,
ec3757de 1119 (total_sectors * 512),
ea2384d3 1120 dsize_buf);
b8fb60da 1121 if (bdrv_is_encrypted(bs)) {
ea2384d3 1122 printf("encrypted: yes\n");
b8fb60da 1123 }
faea38e7 1124 if (bdrv_get_info(bs, &bdi) >= 0) {
b8fb60da 1125 if (bdi.cluster_size != 0) {
faea38e7 1126 printf("cluster_size: %d\n", bdi.cluster_size);
b8fb60da 1127 }
faea38e7 1128 }
93b6b2a3 1129 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
faea38e7 1130 if (backing_filename[0] != '\0') {
93b6b2a3
FB
1131 path_combine(backing_filename2, sizeof(backing_filename2),
1132 filename, backing_filename);
5fafdf24 1133 printf("backing file: %s (actual path: %s)\n",
93b6b2a3
FB
1134 backing_filename,
1135 backing_filename2);
faea38e7
FB
1136 }
1137 dump_snapshots(bs);
ea2384d3
FB
1138 bdrv_delete(bs);
1139 return 0;
1140}
1141
f7b4a940
AL
1142#define SNAPSHOT_LIST 1
1143#define SNAPSHOT_CREATE 2
1144#define SNAPSHOT_APPLY 3
1145#define SNAPSHOT_DELETE 4
1146
153859be 1147static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1148{
1149 BlockDriverState *bs;
1150 QEMUSnapshotInfo sn;
1151 char *filename, *snapshot_name = NULL;
c2abccec 1152 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
1153 int action = 0;
1154 qemu_timeval tv;
1155
710da702 1156 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
f7b4a940
AL
1157 /* Parse commandline parameters */
1158 for(;;) {
1159 c = getopt(argc, argv, "la:c:d:h");
b8fb60da 1160 if (c == -1) {
f7b4a940 1161 break;
b8fb60da 1162 }
f7b4a940 1163 switch(c) {
ef87394c 1164 case '?':
f7b4a940
AL
1165 case 'h':
1166 help();
153859be 1167 return 0;
f7b4a940
AL
1168 case 'l':
1169 if (action) {
1170 help();
153859be 1171 return 0;
f7b4a940
AL
1172 }
1173 action = SNAPSHOT_LIST;
f5edb014 1174 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
1175 break;
1176 case 'a':
1177 if (action) {
1178 help();
153859be 1179 return 0;
f7b4a940
AL
1180 }
1181 action = SNAPSHOT_APPLY;
1182 snapshot_name = optarg;
1183 break;
1184 case 'c':
1185 if (action) {
1186 help();
153859be 1187 return 0;
f7b4a940
AL
1188 }
1189 action = SNAPSHOT_CREATE;
1190 snapshot_name = optarg;
1191 break;
1192 case 'd':
1193 if (action) {
1194 help();
153859be 1195 return 0;
f7b4a940
AL
1196 }
1197 action = SNAPSHOT_DELETE;
1198 snapshot_name = optarg;
1199 break;
1200 }
1201 }
1202
b8fb60da 1203 if (optind >= argc) {
f7b4a940 1204 help();
b8fb60da 1205 }
f7b4a940
AL
1206 filename = argv[optind++];
1207
1208 /* Open the image */
f163d073 1209 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
c2abccec
MK
1210 if (!bs) {
1211 return 1;
1212 }
f7b4a940
AL
1213
1214 /* Perform the requested action */
1215 switch(action) {
1216 case SNAPSHOT_LIST:
1217 dump_snapshots(bs);
1218 break;
1219
1220 case SNAPSHOT_CREATE:
1221 memset(&sn, 0, sizeof(sn));
1222 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1223
1224 qemu_gettimeofday(&tv);
1225 sn.date_sec = tv.tv_sec;
1226 sn.date_nsec = tv.tv_usec * 1000;
1227
1228 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 1229 if (ret) {
15654a6d 1230 error_report("Could not create snapshot '%s': %d (%s)",
f7b4a940 1231 snapshot_name, ret, strerror(-ret));
b8fb60da 1232 }
f7b4a940
AL
1233 break;
1234
1235 case SNAPSHOT_APPLY:
1236 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 1237 if (ret) {
15654a6d 1238 error_report("Could not apply snapshot '%s': %d (%s)",
f7b4a940 1239 snapshot_name, ret, strerror(-ret));
b8fb60da 1240 }
f7b4a940
AL
1241 break;
1242
1243 case SNAPSHOT_DELETE:
1244 ret = bdrv_snapshot_delete(bs, snapshot_name);
b8fb60da 1245 if (ret) {
15654a6d 1246 error_report("Could not delete snapshot '%s': %d (%s)",
f7b4a940 1247 snapshot_name, ret, strerror(-ret));
b8fb60da 1248 }
f7b4a940
AL
1249 break;
1250 }
1251
1252 /* Cleanup */
1253 bdrv_delete(bs);
c2abccec
MK
1254 if (ret) {
1255 return 1;
1256 }
153859be 1257 return 0;
f7b4a940
AL
1258}
1259
3e85c6fd
KW
1260static int img_rebase(int argc, char **argv)
1261{
c2abccec 1262 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 1263 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 1264 char *filename;
661a0f71 1265 const char *fmt, *cache, *out_basefmt, *out_baseimg;
3e85c6fd
KW
1266 int c, flags, ret;
1267 int unsafe = 0;
6b837bc4 1268 int progress = 0;
3e85c6fd
KW
1269
1270 /* Parse commandline parameters */
e53dbee0 1271 fmt = NULL;
661a0f71 1272 cache = BDRV_DEFAULT_CACHE;
3e85c6fd
KW
1273 out_baseimg = NULL;
1274 out_basefmt = NULL;
3e85c6fd 1275 for(;;) {
661a0f71 1276 c = getopt(argc, argv, "uhf:F:b:pt:");
b8fb60da 1277 if (c == -1) {
3e85c6fd 1278 break;
b8fb60da 1279 }
3e85c6fd 1280 switch(c) {
ef87394c 1281 case '?':
3e85c6fd
KW
1282 case 'h':
1283 help();
1284 return 0;
e53dbee0
KW
1285 case 'f':
1286 fmt = optarg;
1287 break;
3e85c6fd
KW
1288 case 'F':
1289 out_basefmt = optarg;
1290 break;
1291 case 'b':
1292 out_baseimg = optarg;
1293 break;
1294 case 'u':
1295 unsafe = 1;
1296 break;
6b837bc4
JS
1297 case 'p':
1298 progress = 1;
1299 break;
661a0f71
FS
1300 case 't':
1301 cache = optarg;
1302 break;
3e85c6fd
KW
1303 }
1304 }
1305
9a9d9dba 1306 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
3e85c6fd 1307 help();
b8fb60da 1308 }
3e85c6fd
KW
1309 filename = argv[optind++];
1310
6b837bc4
JS
1311 qemu_progress_init(progress, 2.0);
1312 qemu_progress_print(0, 100);
1313
661a0f71 1314 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
c3993cdc 1315 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
1316 if (ret < 0) {
1317 error_report("Invalid cache option: %s", cache);
1318 return -1;
1319 }
1320
3e85c6fd
KW
1321 /*
1322 * Open the images.
1323 *
1324 * Ignore the old backing file for unsafe rebase in case we want to correct
1325 * the reference to a renamed or moved backing file.
1326 */
f163d073 1327 bs = bdrv_new_open(filename, fmt, flags);
c2abccec
MK
1328 if (!bs) {
1329 return 1;
1330 }
3e85c6fd
KW
1331
1332 /* Find the right drivers for the backing files */
1333 old_backing_drv = NULL;
1334 new_backing_drv = NULL;
1335
1336 if (!unsafe && bs->backing_format[0] != '\0') {
1337 old_backing_drv = bdrv_find_format(bs->backing_format);
1338 if (old_backing_drv == NULL) {
15654a6d 1339 error_report("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
1340 ret = -1;
1341 goto out;
3e85c6fd
KW
1342 }
1343 }
1344
1345 if (out_basefmt != NULL) {
1346 new_backing_drv = bdrv_find_format(out_basefmt);
1347 if (new_backing_drv == NULL) {
15654a6d 1348 error_report("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
1349 ret = -1;
1350 goto out;
3e85c6fd
KW
1351 }
1352 }
1353
1354 /* For safe rebasing we need to compare old and new backing file */
1355 if (unsafe) {
1356 /* Make the compiler happy */
1357 bs_old_backing = NULL;
1358 bs_new_backing = NULL;
1359 } else {
1360 char backing_name[1024];
1361
1362 bs_old_backing = bdrv_new("old_backing");
1363 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
c2abccec
MK
1364 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1365 old_backing_drv);
1366 if (ret) {
15654a6d 1367 error_report("Could not open old backing file '%s'", backing_name);
c2abccec 1368 goto out;
3e85c6fd
KW
1369 }
1370
1371 bs_new_backing = bdrv_new("new_backing");
cdbae851 1372 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
c2abccec
MK
1373 new_backing_drv);
1374 if (ret) {
15654a6d 1375 error_report("Could not open new backing file '%s'", out_baseimg);
c2abccec 1376 goto out;
3e85c6fd
KW
1377 }
1378 }
1379
1380 /*
1381 * Check each unallocated cluster in the COW file. If it is unallocated,
1382 * accesses go to the backing file. We must therefore compare this cluster
1383 * in the old and new backing file, and if they differ we need to copy it
1384 * from the old backing file into the COW file.
1385 *
1386 * If qemu-img crashes during this step, no harm is done. The content of
1387 * the image is the same as the original one at any time.
1388 */
1389 if (!unsafe) {
1390 uint64_t num_sectors;
87a1b3e3
KW
1391 uint64_t old_backing_num_sectors;
1392 uint64_t new_backing_num_sectors;
3e85c6fd 1393 uint64_t sector;
cc60e327 1394 int n;
d6771bfa
T
1395 uint8_t * buf_old;
1396 uint8_t * buf_new;
6b837bc4 1397 float local_progress;
d6771bfa 1398
bb1c0597
KW
1399 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1400 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
3e85c6fd
KW
1401
1402 bdrv_get_geometry(bs, &num_sectors);
87a1b3e3
KW
1403 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
1404 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
3e85c6fd 1405
6b837bc4 1406 local_progress = (float)100 /
4ee96418 1407 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
3e85c6fd
KW
1408 for (sector = 0; sector < num_sectors; sector += n) {
1409
1410 /* How many sectors can we handle with the next read? */
1411 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1412 n = (IO_BUF_SIZE / 512);
1413 } else {
1414 n = num_sectors - sector;
1415 }
1416
1417 /* If the cluster is allocated, we don't need to take action */
cc60e327
KW
1418 ret = bdrv_is_allocated(bs, sector, n, &n);
1419 if (ret) {
3e85c6fd
KW
1420 continue;
1421 }
1422
87a1b3e3
KW
1423 /*
1424 * Read old and new backing file and take into consideration that
1425 * backing files may be smaller than the COW image.
1426 */
1427 if (sector >= old_backing_num_sectors) {
1428 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1429 } else {
1430 if (sector + n > old_backing_num_sectors) {
1431 n = old_backing_num_sectors - sector;
1432 }
1433
1434 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1435 if (ret < 0) {
1436 error_report("error while reading from old backing file");
1437 goto out;
1438 }
3e85c6fd 1439 }
87a1b3e3
KW
1440
1441 if (sector >= new_backing_num_sectors) {
1442 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1443 } else {
1444 if (sector + n > new_backing_num_sectors) {
1445 n = new_backing_num_sectors - sector;
1446 }
1447
1448 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1449 if (ret < 0) {
1450 error_report("error while reading from new backing file");
1451 goto out;
1452 }
3e85c6fd
KW
1453 }
1454
1455 /* If they differ, we need to write to the COW file */
1456 uint64_t written = 0;
1457
1458 while (written < n) {
1459 int pnum;
1460
1461 if (compare_sectors(buf_old + written * 512,
60b1bd4f 1462 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
1463 {
1464 ret = bdrv_write(bs, sector + written,
1465 buf_old + written * 512, pnum);
1466 if (ret < 0) {
15654a6d 1467 error_report("Error while writing to COW image: %s",
3e85c6fd 1468 strerror(-ret));
c2abccec 1469 goto out;
3e85c6fd
KW
1470 }
1471 }
1472
1473 written += pnum;
1474 }
6b837bc4 1475 qemu_progress_print(local_progress, 100);
3e85c6fd 1476 }
d6771bfa 1477
bb1c0597
KW
1478 qemu_vfree(buf_old);
1479 qemu_vfree(buf_new);
3e85c6fd
KW
1480 }
1481
1482 /*
1483 * Change the backing file. All clusters that are different from the old
1484 * backing file are overwritten in the COW file now, so the visible content
1485 * doesn't change when we switch the backing file.
1486 */
1487 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1488 if (ret == -ENOSPC) {
15654a6d
JS
1489 error_report("Could not change the backing file to '%s': No "
1490 "space left in the file header", out_baseimg);
3e85c6fd 1491 } else if (ret < 0) {
15654a6d 1492 error_report("Could not change the backing file to '%s': %s",
3e85c6fd
KW
1493 out_baseimg, strerror(-ret));
1494 }
1495
6b837bc4 1496 qemu_progress_print(100, 0);
3e85c6fd
KW
1497 /*
1498 * TODO At this point it is possible to check if any clusters that are
1499 * allocated in the COW file are the same in the backing file. If so, they
1500 * could be dropped from the COW file. Don't do this before switching the
1501 * backing file, in case of a crash this would lead to corruption.
1502 */
c2abccec 1503out:
6b837bc4 1504 qemu_progress_end();
3e85c6fd
KW
1505 /* Cleanup */
1506 if (!unsafe) {
eb863add
KW
1507 if (bs_old_backing != NULL) {
1508 bdrv_delete(bs_old_backing);
1509 }
1510 if (bs_new_backing != NULL) {
1511 bdrv_delete(bs_new_backing);
1512 }
3e85c6fd
KW
1513 }
1514
1515 bdrv_delete(bs);
c2abccec
MK
1516 if (ret) {
1517 return 1;
1518 }
3e85c6fd
KW
1519 return 0;
1520}
1521
ae6b0ed6
SH
1522static int img_resize(int argc, char **argv)
1523{
1524 int c, ret, relative;
1525 const char *filename, *fmt, *size;
1526 int64_t n, total_size;
2a81998a 1527 BlockDriverState *bs = NULL;
ae6b0ed6
SH
1528 QEMUOptionParameter *param;
1529 QEMUOptionParameter resize_options[] = {
1530 {
1531 .name = BLOCK_OPT_SIZE,
1532 .type = OPT_SIZE,
1533 .help = "Virtual disk size"
1534 },
1535 { NULL }
1536 };
1537
e80fec7f
KW
1538 /* Remove size from argv manually so that negative numbers are not treated
1539 * as options by getopt. */
1540 if (argc < 3) {
1541 help();
1542 return 1;
1543 }
1544
1545 size = argv[--argc];
1546
1547 /* Parse getopt arguments */
ae6b0ed6
SH
1548 fmt = NULL;
1549 for(;;) {
1550 c = getopt(argc, argv, "f:h");
1551 if (c == -1) {
1552 break;
1553 }
1554 switch(c) {
ef87394c 1555 case '?':
ae6b0ed6
SH
1556 case 'h':
1557 help();
1558 break;
1559 case 'f':
1560 fmt = optarg;
1561 break;
1562 }
1563 }
e80fec7f 1564 if (optind >= argc) {
ae6b0ed6
SH
1565 help();
1566 }
1567 filename = argv[optind++];
ae6b0ed6
SH
1568
1569 /* Choose grow, shrink, or absolute resize mode */
1570 switch (size[0]) {
1571 case '+':
1572 relative = 1;
1573 size++;
1574 break;
1575 case '-':
1576 relative = -1;
1577 size++;
1578 break;
1579 default:
1580 relative = 0;
1581 break;
1582 }
1583
1584 /* Parse size */
1585 param = parse_option_parameters("", resize_options, NULL);
1586 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1587 /* Error message already printed when size parsing fails */
2a81998a
JS
1588 ret = -1;
1589 goto out;
ae6b0ed6
SH
1590 }
1591 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1592 free_option_parameters(param);
1593
1594 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
c2abccec 1595 if (!bs) {
2a81998a
JS
1596 ret = -1;
1597 goto out;
c2abccec 1598 }
ae6b0ed6
SH
1599
1600 if (relative) {
1601 total_size = bdrv_getlength(bs) + n * relative;
1602 } else {
1603 total_size = n;
1604 }
1605 if (total_size <= 0) {
15654a6d 1606 error_report("New image size must be positive");
c2abccec
MK
1607 ret = -1;
1608 goto out;
ae6b0ed6
SH
1609 }
1610
1611 ret = bdrv_truncate(bs, total_size);
1612 switch (ret) {
1613 case 0:
1614 printf("Image resized.\n");
1615 break;
1616 case -ENOTSUP:
259b2173 1617 error_report("This image does not support resize");
ae6b0ed6
SH
1618 break;
1619 case -EACCES:
15654a6d 1620 error_report("Image is read-only");
ae6b0ed6
SH
1621 break;
1622 default:
15654a6d 1623 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
1624 break;
1625 }
c2abccec 1626out:
2a81998a
JS
1627 if (bs) {
1628 bdrv_delete(bs);
1629 }
c2abccec
MK
1630 if (ret) {
1631 return 1;
1632 }
ae6b0ed6
SH
1633 return 0;
1634}
1635
c227f099 1636static const img_cmd_t img_cmds[] = {
153859be
SB
1637#define DEF(option, callback, arg_string) \
1638 { option, callback },
1639#include "qemu-img-cmds.h"
1640#undef DEF
1641#undef GEN_DOCS
1642 { NULL, NULL, },
1643};
1644
ea2384d3
FB
1645int main(int argc, char **argv)
1646{
c227f099 1647 const img_cmd_t *cmd;
153859be 1648 const char *cmdname;
ea2384d3 1649
53f76e58
KW
1650 error_set_progname(argv[0]);
1651
ea2384d3
FB
1652 bdrv_init();
1653 if (argc < 2)
1654 help();
153859be 1655 cmdname = argv[1];
8f9b157e 1656 argc--; argv++;
153859be 1657
67d384e8
ZYW
1658 qemu_init_main_loop();
1659
153859be
SB
1660 /* find the command */
1661 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1662 if (!strcmp(cmdname, cmd->name)) {
1663 return cmd->handler(argc, argv);
1664 }
ea2384d3 1665 }
153859be
SB
1666
1667 /* not found */
1668 help();
ea2384d3
FB
1669 return 0;
1670}