On 08.04.2014 17:34, Kevin Wolf wrote:
Am 08.04.2014 um 14:50 hat Max Reitz geschrieben:
Implement progress output for the commit command by querying the
progress of the block job.
Signed-off-by: Max Reitz <mre...@redhat.com>
Reviewed-by: Eric Blake <ebl...@redhat.com>
---
qemu-img-cmds.hx | 4 ++--
qemu-img.c | 33 +++++++++++++++++++++++++++++++--
qemu-img.texi | 2 +-
3 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index d029609..8bc55cd 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -22,9 +22,9 @@ STEXI
ETEXI
DEF("commit", img_commit,
- "commit [-q] [-f fmt] [-t cache] filename")
+ "commit [-q] [-f fmt] [-t cache] [-p] filename")
STEXI
-@item commit [-q] [-f @var{fmt}] [-t @var{cache}] @var{filename}
+@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-p] @var{filename}
ETEXI
DEF("compare", img_compare,
diff --git a/qemu-img.c b/qemu-img.c
index e86911f..0a9eff7 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -690,12 +690,27 @@ static void dummy_block_job_cb(void *opaque, int ret)
static void run_block_job(BlockJob *job, Error **errp)
{
BlockJobInfo *info;
+ uint64_t mod_offset = 0;
do {
aio_poll(qemu_get_aio_context(), true);
info = block_job_query(job);
+ if (info->offset) {
+ if (!mod_offset) {
On a fully populated image this doesn't look entirely right. I think the
first 2 MB (or whatever the buffer size is) will be disregarded in the
calculation, even though they are real work that is done.
Hm, right. I'll see how I get it included into this supposedly common
function.
Max
+ /* Some block jobs (at least "commit") will only work on a
+ * subset of the image file and therefore basically skip many
+ * sectors at the start (processing them apparently
+ * instantaneously). These sectors should be ignored when
+ * calculating the progress. */
+ mod_offset = info->offset;
+ }
+
+ qemu_progress_print((float)(info->offset - mod_offset) /
+ (info->len - mod_offset) * 100.f, 0);
+ }
+
if (!info->busy && info->offset < info->len) {
block_job_resume(job);
}
Kevin