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