} img_cmd_t;
/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
-#define BRDV_O_FLAGS BDRV_O_CACHE_WB
+#define BDRV_O_FLAGS BDRV_O_CACHE_WB
static void QEMU_NORETURN error(const char *fmt, ...)
{
/* Please keep in synch with qemu-img.texi */
static void help(void)
{
- printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
+ const char *help_msg =
+ "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
"usage: qemu-img command [command options]\n"
"QEMU disk image utility\n"
"\n"
" '-a' applies a snapshot (revert disk to saved state)\n"
" '-c' creates a snapshot\n"
" '-d' deletes a snapshot\n"
- " '-l' lists all snapshots in the given image\n"
- );
- printf("\nSupported formats:");
+ " '-l' lists all snapshots in the given image\n";
+
+ printf("%s\nSupported formats:", help_msg);
bdrv_iterate_format(format_print, NULL);
printf("\n");
exit(1);
#endif
static BlockDriverState *bdrv_new_open(const char *filename,
- const char *fmt)
+ const char *fmt,
+ int flags)
{
BlockDriverState *bs;
BlockDriver *drv;
} else {
drv = NULL;
}
- if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_RDWR, drv) < 0) {
+ if (bdrv_open(bs, filename, flags, drv) < 0) {
error("Could not open '%s'", filename);
}
if (bdrv_is_encrypted(bs)) {
}
}
- bs = bdrv_new_open(backing_file->value.s, fmt);
+ bs = bdrv_new_open(backing_file->value.s, fmt, BDRV_O_FLAGS);
bdrv_get_geometry(bs, &size);
size *= 512;
bdrv_delete(bs);
} else if (ret == -EFBIG) {
error("The image size is too large for file format '%s'", fmt);
} else {
- error("Error while formatting");
+ error("%s: error while creating %s: %s", filename, fmt, strerror(-ret));
}
}
return 0;
{
int c, ret;
const char *filename, *fmt;
- BlockDriver *drv;
BlockDriverState *bs;
fmt = NULL;
help();
filename = argv[optind++];
- bs = bdrv_new("");
- if (!bs)
- error("Not enough memory");
- if (fmt) {
- drv = bdrv_find_format(fmt);
- if (!drv)
- error("Unknown file format '%s'", fmt);
- } else {
- drv = NULL;
- }
- if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
- error("Could not open '%s'", filename);
- }
+ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
ret = bdrv_check(bs);
switch(ret) {
case 0:
{
int c, ret;
const char *filename, *fmt;
- BlockDriver *drv;
BlockDriverState *bs;
fmt = NULL;
help();
filename = argv[optind++];
- bs = bdrv_new("");
- if (!bs)
- error("Not enough memory");
- if (fmt) {
- drv = bdrv_find_format(fmt);
- if (!drv)
- error("Unknown file format '%s'", fmt);
- } else {
- drv = NULL;
- }
- if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_RDWR, drv) < 0) {
- error("Could not open '%s'", filename);
- }
+ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
ret = bdrv_commit(bs);
switch(ret) {
case 0:
BlockDriverState **bs, *out_bs;
int64_t total_sectors, nb_sectors, sector_num, bs_offset;
uint64_t bs_sectors;
- uint8_t buf[IO_BUF_SIZE];
+ uint8_t * buf;
const uint8_t *buf1;
BlockDriverInfo bdi;
QEMUOptionParameter *param = NULL;
total_sectors = 0;
for (bs_i = 0; bs_i < bs_n; bs_i++) {
- bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt);
+ bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
if (!bs[bs_i])
error("Could not open '%s'", argv[optind + bs_i]);
bdrv_get_geometry(bs[bs_i], &bs_sectors);
} else if (ret == -EFBIG) {
error("The image size is too large for file format '%s'", out_fmt);
} else {
- error("Error while formatting '%s'", out_filename);
+ error("%s: error while converting %s: %s", out_filename, out_fmt, strerror(-ret));
}
}
- out_bs = bdrv_new_open(out_filename, out_fmt);
+ out_bs = bdrv_new_open(out_filename, out_fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
bs_i = 0;
bs_offset = 0;
bdrv_get_geometry(bs[0], &bs_sectors);
+ buf = qemu_malloc(IO_BUF_SIZE);
if (flags & BLOCK_FLAG_COMPRESS) {
if (bdrv_get_info(out_bs, &bdi) < 0)
}
}
}
+ qemu_free(buf);
bdrv_delete(out_bs);
for (bs_i = 0; bs_i < bs_n; bs_i++)
bdrv_delete(bs[bs_i]);
{
int c;
const char *filename, *fmt;
- BlockDriver *drv;
BlockDriverState *bs;
char fmt_name[128], size_buf[128], dsize_buf[128];
uint64_t total_sectors;
help();
filename = argv[optind++];
- bs = bdrv_new("");
- if (!bs)
- error("Not enough memory");
- if (fmt) {
- drv = bdrv_find_format(fmt);
- if (!drv)
- error("Unknown file format '%s'", fmt);
- } else {
- drv = NULL;
- }
- if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_NO_BACKING, drv) < 0) {
- error("Could not open '%s'", filename);
- }
+ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
bdrv_get_geometry(bs, &total_sectors);
get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
filename = argv[optind++];
/* Open the image */
- bs = bdrv_new("");
- if (!bs)
- error("Not enough memory");
-
- if (bdrv_open2(bs, filename, bdrv_oflags, NULL) < 0) {
- error("Could not open '%s'", filename);
- }
+ bs = bdrv_new_open(filename, NULL, bdrv_oflags);
/* Perform the requested action */
switch(action) {
BlockDriverState *bs, *bs_old_backing, *bs_new_backing;
BlockDriver *old_backing_drv, *new_backing_drv;
char *filename;
- const char *out_basefmt, *out_baseimg;
+ const char *fmt, *out_basefmt, *out_baseimg;
int c, flags, ret;
int unsafe = 0;
/* Parse commandline parameters */
+ fmt = NULL;
out_baseimg = NULL;
out_basefmt = NULL;
for(;;) {
- c = getopt(argc, argv, "uhF:b:");
+ c = getopt(argc, argv, "uhf:F:b:");
if (c == -1)
break;
switch(c) {
case 'h':
help();
return 0;
+ case 'f':
+ fmt = optarg;
+ break;
case 'F':
out_basefmt = optarg;
break;
* Ignore the old backing file for unsafe rebase in case we want to correct
* the reference to a renamed or moved backing file.
*/
- bs = bdrv_new("");
- if (!bs)
- error("Not enough memory");
-
- flags = BRDV_O_FLAGS | (unsafe ? BDRV_O_NO_BACKING : 0);
- if (bdrv_open2(bs, filename, flags, NULL) < 0) {
- error("Could not open '%s'", filename);
- }
+ flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
+ bs = bdrv_new_open(filename, fmt, flags);
/* Find the right drivers for the backing files */
old_backing_drv = NULL;
bs_old_backing = bdrv_new("old_backing");
bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
- if (bdrv_open2(bs_old_backing, backing_name, BRDV_O_FLAGS,
+ if (bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
old_backing_drv))
{
error("Could not open old backing file '%s'", backing_name);
}
bs_new_backing = bdrv_new("new_backing");
- if (bdrv_open2(bs_new_backing, out_baseimg, BRDV_O_FLAGS,
+ if (bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS | BDRV_O_RDWR,
new_backing_drv))
{
- error("Could not open new backing file '%s'", backing_name);
+ error("Could not open new backing file '%s'", out_baseimg);
return -1;
}
}
uint64_t num_sectors;
uint64_t sector;
int n, n1;
- uint8_t buf_old[IO_BUF_SIZE];
- uint8_t buf_new[IO_BUF_SIZE];
+ uint8_t * buf_old;
+ uint8_t * buf_new;
+
+ buf_old = qemu_malloc(IO_BUF_SIZE);
+ buf_new = qemu_malloc(IO_BUF_SIZE);
bdrv_get_geometry(bs, &num_sectors);
int pnum;
if (compare_sectors(buf_old + written * 512,
- buf_new + written * 512, n, &pnum))
+ buf_new + written * 512, n - written, &pnum))
{
ret = bdrv_write(bs, sector + written,
buf_old + written * 512, pnum);
written += pnum;
}
}
+
+ qemu_free(buf_old);
+ qemu_free(buf_new);
}
/*