diff options
Diffstat (limited to 'qemu-img.c')
-rw-r--r-- | qemu-img.c | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/qemu-img.c b/qemu-img.c index 8b2acad14e..06687bc1f3 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -159,36 +159,6 @@ void help(void) exit(1); } - -#define NB_SUFFIXES 4 - -static void get_human_readable_size(char *buf, int buf_size, int64_t size) -{ - static const char suffixes[NB_SUFFIXES] = "KMGT"; - int64_t base; - int i; - - if (size <= 999) { - snprintf(buf, buf_size, "%" PRId64, size); - } else { - base = 1024; - for(i = 0; i < NB_SUFFIXES; i++) { - if (size < (10 * base)) { - snprintf(buf, buf_size, "%0.1f%c", - (double)size / base, - suffixes[i]); - break; - } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) { - snprintf(buf, buf_size, "%" PRId64 "%c", - ((size + (base >> 1)) / base), - suffixes[i]); - break; - } - base = base * 1024; - } - } -} - #if defined(WIN32) /* XXX: put correct support for win32 */ static int read_password(char *buf, int buf_size) @@ -486,6 +456,7 @@ static int img_convert(int argc, char **argv) int64_t total_sectors, nb_sectors, sector_num; uint8_t buf[IO_BUF_SIZE]; const uint8_t *buf1; + BlockDriverInfo bdi; fmt = NULL; out_fmt = "raw"; @@ -525,9 +496,9 @@ static int img_convert(int argc, char **argv) drv = bdrv_find_format(out_fmt); if (!drv) error("Unknown file format '%s'", fmt); - if (compress && drv != &bdrv_qcow) + if (compress && drv != &bdrv_qcow && drv != &bdrv_qcow2) error("Compression not supported for this file format"); - if (encrypt && drv != &bdrv_qcow) + if (encrypt && drv != &bdrv_qcow && drv != &bdrv_qcow2) error("Encryption not supported for this file format"); if (compress && encrypt) error("Compression and encryption not supported at the same time"); @@ -544,7 +515,9 @@ static int img_convert(int argc, char **argv) out_bs = bdrv_new_open(out_filename, out_fmt); if (compress) { - cluster_size = qcow_get_cluster_size(out_bs); + if (bdrv_get_info(out_bs, &bdi) < 0) + error("could not get block driver info"); + cluster_size = bdi.cluster_size; if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) error("invalid cluster size"); cluster_sectors = cluster_size >> 9; @@ -562,12 +535,15 @@ static int img_convert(int argc, char **argv) if (n < cluster_sectors) memset(buf + n * 512, 0, cluster_size - n * 512); if (is_not_zero(buf, cluster_size)) { - if (qcow_compress_cluster(out_bs, sector_num, buf) != 0) + if (bdrv_write_compressed(out_bs, sector_num, buf, + cluster_sectors) != 0) error("error while compressing sector %" PRId64, sector_num); } sector_num += n; } + /* signal EOF to align */ + bdrv_write_compressed(out_bs, 0, NULL, 0); } else { sector_num = 0; for(;;) { @@ -630,6 +606,24 @@ static int64_t get_allocated_file_size(const char *filename) } #endif +static void dump_snapshots(BlockDriverState *bs) +{ + QEMUSnapshotInfo *sn_tab, *sn; + int nb_sns, i; + char buf[256]; + + nb_sns = bdrv_snapshot_list(bs, &sn_tab); + if (nb_sns <= 0) + return; + printf("Snapshot list:\n"); + printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL)); + for(i = 0; i < nb_sns; i++) { + sn = &sn_tab[i]; + printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn)); + } + qemu_free(sn_tab); +} + static int img_info(int argc, char **argv) { int c; @@ -640,6 +634,7 @@ static int img_info(int argc, char **argv) int64_t total_sectors, allocated_size; char backing_filename[1024]; char backing_filename2[1024]; + BlockDriverInfo bdi; fmt = NULL; for(;;) { @@ -690,13 +685,19 @@ static int img_info(int argc, char **argv) dsize_buf); if (bdrv_is_encrypted(bs)) printf("encrypted: yes\n"); + if (bdrv_get_info(bs, &bdi) >= 0) { + if (bdi.cluster_size != 0) + printf("cluster_size: %d\n", bdi.cluster_size); + } bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename)); - if (backing_filename[0] != '\0') + if (backing_filename[0] != '\0') { path_combine(backing_filename2, sizeof(backing_filename2), filename, backing_filename); printf("backing file: %s (actual path: %s)\n", backing_filename, backing_filename2); + } + dump_snapshots(bs); bdrv_delete(bs); return 0; } |