summaryrefslogtreecommitdiff
path: root/qemu-img.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-08-05 21:31:00 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-08-05 21:31:00 +0000
commitfaea38e7863a6e29f110063388eb93840fcd475c (patch)
treeafb1de92737724cc8341079e7fe6faf78f0c56d0 /qemu-img.c
parent42ca638823ad463d5eb0301d160887883fad9efd (diff)
multiple snapshot support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2086 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'qemu-img.c')
-rw-r--r--qemu-img.c71
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;
}