Signed-off-by: Peter Lieven <p...@kamp.de> --- qemu-img-cmds.hx | 4 ++-- qemu-img.c | 31 ++++++++++++++++++++++++++++--- qemu-img.texi | 4 +++- 3 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index da1d965..6c8183b 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -34,9 +34,9 @@ STEXI ETEXI DEF("convert", img_convert, - "convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename") + "convert [-c] [-p|-pp] [-q] [-n] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename") STEXI -@item convert [-c] [-p] [-q] [-n] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} +@item convert [-c] [-p|-pp] [-q] [-n] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} ETEXI DEF("info", img_info, diff --git a/qemu-img.c b/qemu-img.c index 1421f0f..cc7540f 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -99,6 +99,7 @@ static void help(void) " rebasing in this case (useful for renaming the backing file)\n" " '-h' with or without a command shows this help and lists the supported formats\n" " '-p' show progress of command (only certain commands)\n" + " '-pp' show progress of command in sectors (only convert command)\n" " '-q' use Quiet mode - do not print any output (except errors)\n" " '-S' indicates the consecutive number of bytes (defaults to 4k) that must\n" " contain only zeros for qemu-img to create a sparse image during\n" @@ -1122,6 +1123,22 @@ out3: return ret; } +static void print_sector_progress(int progress, int64_t sector_num, + int64_t total_sectors) +{ + static int64_t last_sector = -1; + if (progress == 2) { + if (sector_num == 0 || + sector_num > last_sector + 0.02 * total_sectors || + sector_num == total_sectors) { + printf("%ld of %ld sectors converted.\r", sector_num, + total_sectors); + fflush(stdout); + last_sector = sector_num; + } + } +} + static int img_convert(int argc, char **argv) { int c, n, n1, bs_n, bs_i, compress, cluster_sectors, skip_create; @@ -1130,7 +1147,7 @@ static int img_convert(int argc, char **argv) const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename; BlockDriver *drv, *proto_drv; BlockDriverState **bs = NULL, *out_bs = NULL; - int64_t total_sectors, nb_sectors, sector_num, bs_offset, + int64_t total_sectors = 0, nb_sectors, sector_num, bs_offset, sector_num_next_status = 0; uint64_t bs_sectors; uint8_t * buf = NULL; @@ -1201,7 +1218,7 @@ static int img_convert(int argc, char **argv) break; } case 'p': - progress = 1; + progress++; break; case 't': cache = optarg; @@ -1227,7 +1244,7 @@ static int img_convert(int argc, char **argv) out_filename = argv[argc - 1]; /* Initialize before goto out */ - qemu_progress_init(progress, 2.0); + qemu_progress_init(progress == 1, 2.0); if (options && is_help_option(options)) { ret = print_block_option_help(out_filename, out_fmt); @@ -1258,6 +1275,8 @@ static int img_convert(int argc, char **argv) total_sectors += bs_sectors; } + print_sector_progress(progress, 0, total_sectors); + if (snapshot_name != NULL) { if (bs_n > 1) { error_report("No support for concatenating multiple snapshot"); @@ -1472,6 +1491,7 @@ static int img_convert(int argc, char **argv) } sector_num += n; qemu_progress_print(100.0 * sector_num / total_sectors, 0); + print_sector_progress(progress, sector_num, total_sectors); } /* signal EOF to align */ bdrv_write_compressed(out_bs, 0, NULL, 0); @@ -1587,11 +1607,16 @@ static int img_convert(int argc, char **argv) buf1 += n1 * 512; } qemu_progress_print(100.0 * sector_num / total_sectors, 0); + print_sector_progress(progress, sector_num, total_sectors); } } out: if (!ret) { qemu_progress_print(100, 0); + print_sector_progress(progress, total_sectors, total_sectors); + } + if (progress == 2) { + printf("\n"); } qemu_progress_end(); free_option_parameters(create_options); diff --git a/qemu-img.texi b/qemu-img.texi index da36975..cb4a3eb 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -54,6 +54,8 @@ indicates that target image must be compressed (qcow format only) with or without a command shows help and lists the supported formats @item -p display progress bar (convert and rebase commands only) +@item -pp +display progress in sectors (convert command only) @item -q Quiet mode - do not print any output (except errors). There's no progress bar in case both @var{-q} and @var{-p} options are used. @@ -179,7 +181,7 @@ Error on reading data @end table -@item convert [-c] [-p] [-n] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} +@item convert [-c] [-p|-pp] [-n] [-f @var{fmt}] [-t @var{cache}] [-O @var{output_fmt}] [-o @var{options}] [-s @var{snapshot_name}] [-S @var{sparse_size}] @var{filename} [@var{filename2} [...]] @var{output_filename} Convert the disk image @var{filename} or a snapshot @var{snapshot_name} to disk image @var{output_filename} using format @var{output_fmt}. It can be optionally compressed (@code{-c} -- 1.7.9.5