qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kashyap Chamarthy <kashyap.cv@gmail.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	qemu-devel@nongnu.org, "Benoît Canet" <benoit@irqsave.net>
Subject: Re: [Qemu-devel] [PATCH] qemu-img: Add --backing-chain option to info command
Date: Sat, 13 Oct 2012 01:49:54 +0530	[thread overview]
Message-ID: <CAOaxAcbDNmO2265LNvmCur0DPOEu29SEWOG66jTB5owNs1jxOA@mail.gmail.com> (raw)
In-Reply-To: <CAOaxAcZ-dgLcmT3adfs--3_GsOnmBwFgdCaCY5h-NYOyo9F5cA@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6733 bytes --]

On Sat, Oct 13, 2012 at 12:46 AM, Kashyap Chamarthy
<kashyap.cv@gmail.com> wrote:
> On Fri, Oct 12, 2012 at 7:39 PM, Stefan Hajnoczi <stefanha@redhat.com> wrote:
>> The qemu-img info --backing-chain option enumerates the backing file
>> chain.  For example, for base.qcow2 <- snap1.qcow2 <- snap2.qcow2 the
>> output becomes:
>>
>>   $ qemu-img info --backing-chain snap2.qcow2
>>   image: snap2.qcow2
>>   file format: qcow2
>>   virtual size: 100M (104857600 bytes)
>>   disk size: 196K
>>   cluster_size: 65536
>>   backing file: snap1.qcow2
>>   backing file format: qcow2
>>
>>   image: snap1.qcow2
>>   file format: qcow2
>>   virtual size: 100M (104857600 bytes)
>>   disk size: 196K
>>   cluster_size: 65536
>>   backing file: base.qcow2
>>   backing file format: qcow2
>>
>>   image: base.qcow2
>>   file format: qcow2
>>   virtual size: 100M (104857600 bytes)
>>   disk size: 136K
>>   cluster_size: 65536
>>
>> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
>> ---
>>  qemu-img.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++--------------
>>  1 file changed, 76 insertions(+), 22 deletions(-)
>>
>> diff --git a/qemu-img.c b/qemu-img.c
>> index f17f187..c717f3e 100644
>> --- a/qemu-img.c
>> +++ b/qemu-img.c
>> @@ -1249,7 +1249,10 @@ static void dump_human_image_info(ImageInfo *info)
>>      }
>>  }
>>
>> -enum {OPTION_OUTPUT = 256};
>> +enum {
>> +    OPTION_OUTPUT = 256,
>> +    OPTION_BACKING_CHAIN = 257,
>> +};
>>
>>  typedef enum OutputFormat {
>>      OFORMAT_JSON,
>> @@ -1260,7 +1263,9 @@ static int img_info(int argc, char **argv)
>>  {
>>      int c;
>>      OutputFormat output_format = OFORMAT_HUMAN;
>> -    const char *filename, *fmt, *output;
>> +    bool chain = false;
>> +    const char *output;
>> +    char *filename, *fmt;
>>      BlockDriverState *bs;
>>      ImageInfo *info;
>>
>> @@ -1272,6 +1277,7 @@ static int img_info(int argc, char **argv)
>>              {"help", no_argument, 0, 'h'},
>>              {"format", required_argument, 0, 'f'},
>>              {"output", required_argument, 0, OPTION_OUTPUT},
>> +            {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
>>              {0, 0, 0, 0}
>>          };
>>          c = getopt_long(argc, argv, "f:h",
>> @@ -1285,17 +1291,20 @@ static int img_info(int argc, char **argv)
>>              help();
>>              break;
>>          case 'f':
>> -            fmt = optarg;
>> +            fmt = g_strdup(optarg);
>>              break;
>>          case OPTION_OUTPUT:
>>              output = optarg;
>>              break;
>> +        case OPTION_BACKING_CHAIN:
>> +            chain = true;
>> +            break;
>>          }
>>      }
>>      if (optind >= argc) {
>>          help();
>>      }
>> -    filename = argv[optind++];
>> +    filename = g_strdup(argv[optind++]);
>>
>>      if (output && !strcmp(output, "json")) {
>>          output_format = OFORMAT_JSON;
>> @@ -1303,31 +1312,76 @@ static int img_info(int argc, char **argv)
>>          output_format = OFORMAT_HUMAN;
>>      } else if (output) {
>>          error_report("--output must be used with human or json as argument.");
>> -        return 1;
>> +        goto err;
>>      }
>>
>> -    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING, false);
>> -    if (!bs) {
>> -        return 1;
>> +    if (chain && output_format == OFORMAT_JSON) {
>> +        printf("[\n");
>>      }
>>
>> -    info = g_new0(ImageInfo, 1);
>> -    collect_image_info(bs, info, filename, fmt);
>> +    do {
>> +        bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
>> +                           false);
>> +        if (!bs) {
>> +            goto err;
>> +        }
>>
>> -    switch (output_format) {
>> -    case OFORMAT_HUMAN:
>> -        dump_human_image_info(info);
>> -        dump_snapshots(bs);
>> -        break;
>> -    case OFORMAT_JSON:
>> -        collect_snapshots(bs, info);
>> -        dump_json_image_info(info);
>> -        break;
>> -    }
>> +        info = g_new0(ImageInfo, 1);
>> +        collect_image_info(bs, info, filename, fmt);
>>
>> -    qapi_free_ImageInfo(info);
>> -    bdrv_delete(bs);
>> +        switch (output_format) {
>> +        case OFORMAT_HUMAN:
>> +            dump_human_image_info(info);
>> +            dump_snapshots(bs);
>> +            break;
>> +        case OFORMAT_JSON:
>> +            collect_snapshots(bs, info);
>> +            dump_json_image_info(info);
>> +            break;
>> +        }
>> +
>> +        g_free(filename);
>> +        g_free(fmt);
>> +        filename = NULL;
>> +        fmt = NULL;
>> +
>> +        if (chain) {
>> +            if (info->has_full_backing_filename) {
>> +                filename = g_strdup(info->full_backing_filename);
>> +            } else if (info->has_backing_filename) {
>> +                filename = g_strdup(info->backing_filename);
>> +            }
>> +
>> +            if (filename && info->has_backing_filename_format) {
>> +                fmt = g_strdup(info->backing_filename_format);
>> +            }
>> +
>> +            /* Print delimiters between items */
>> +            if (filename) {
>> +                switch (output_format) {
>> +                case OFORMAT_HUMAN:
>> +                    printf("\n");
>> +                    break;
>> +                case OFORMAT_JSON:
>> +                    printf(",\n");
>> +                    break;
>> +                }
>> +            }
>> +        }
>> +
>> +        qapi_free_ImageInfo(info);
>> +        bdrv_delete(bs);
>> +    } while (filename);
>> +
>> +    if (chain && output_format == OFORMAT_JSON) {
>> +        printf("]\n");
>> +    }
>>      return 0;
>> +
>> +err:
>> +    g_free(filename);
>> +    g_free(fmt);
>> +    return 1;
>>  }
>>
>>  #define SNAPSHOT_LIST   1
>> --
>> 1.7.11.4
>>
>
> Thanks a lot Stefan for making this. Just tested this with latest qemu
> git. Works like a charm:
>
> [kashyap@moon qemu]$ ./qemu-img info --backing-chain
> /var/lib/libvirt/images/snap4-of-test-f17base.qcow2
> image: /var/lib/libvirt/images/snap4-of-test-f17base.qcow2
> file format: qcow2
> virtual size: 1.0G (1073741824 bytes)
> disk size: 3.6M
> cluster_size: 65536
> backing file: /var/lib/libvirt/images/snap1-of-test-f17base.qcow2
> backing file format: qcow2
>
> image: /var/lib/libvirt/images/snap1-of-test-f17base.qcow2
> file format: qcow2
> virtual size: 1.0G (1073741824 bytes)
> disk size: 968K
> cluster_size: 65536
> backing file: /export/vmimgs2/test-f17base.img
> backing file format: raw
>
> image: /export/vmimgs2/test-f17base.img
> file format: raw
> virtual size: 1.0G (1073741824 bytes)
> disk size: 607M
> [kashyap@moon qemu]$


Attached a documentation patch for the '--backing-chain' option.

/kashyap

[-- Attachment #2: 0001-Add-documentation-for-qemu-img-info-backing-chain.patch --]
[-- Type: application/octet-stream, Size: 2365 bytes --]

From eb4c4bc92c035c42c23c30c5e7ee73b54f9cf3a8 Mon Sep 17 00:00:00 2001
From: Kashyap Chamarthy <kashyap.cv@gmail.com>
Date: Sat, 13 Oct 2012 01:30:37 +0530
Subject: [PATCH] Add documentation for 'qemu-img info --backing-chain'

Signed-off-by: Kashyap Chamarthy <kashyap.cv@gmail.com>
---
 qemu-img.texi | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/qemu-img.texi b/qemu-img.texi
index 8b05f2c42801a2535ab4390b47bc415eb880625a..6bbb7a774797fb0cb702d2ff6fc585d90cc0984a 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -28,6 +28,10 @@ Command parameters:
 is the disk image format. It is guessed automatically in most cases. See below
 for a description of the supported disk formats.
 
+@item --backing-chain 
+will enumerate information about backing files in a disk image chain. Refer
+below for further description.
+
 @item size
 is the disk image size in bytes. Optional suffixes @code{k} or @code{K}
 (kilobyte, 1024) @code{M} (megabyte, 1024k) and @code{G} (gigabyte, 1024M)
@@ -129,7 +133,7 @@ created as a copy on write image of the specified base image; the
 @var{backing_file} should have the same content as the input's base image,
 however the path, image format, etc may differ.
 
-@item info [-f @var{fmt}] [--output=@var{ofmt}] @var{filename}
+@item info [-f @var{fmt}] [--output=@var{ofamt}] [--backing-chain] @var{filename}
 
 Give information about the disk image @var{filename}. Use it in
 particular to know the size reserved on disk which can be different
@@ -137,6 +141,19 @@ from the displayed size. If VM snapshots are stored in the disk image,
 they are displayed too. The command can output in the format @var{ofmt}
 which is either @code{human} or @code{json}.
 
+If a disk image has a backing file chain, information about each disk image in
+the chain can be recursively enumerated by using the option @code{--backing-chain} 
+
+For instance, if you have an image chain like: 
+
+    base.qcow2 <- snap1.qcow2 <- snap2.qcow2 
+
+To enumerate information about each disk image in the above chain, starting from top to base, do:
+    
+    @example
+    qemu-img info --backing-chain snap2.qcow2
+    @end example
+
 @item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d @var{snapshot} ] @var{filename}
 
 List, apply, create or delete snapshots in image @var{filename}.
-- 
1.7.12.1


  reply	other threads:[~2012-10-12 20:19 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-12 14:09 [Qemu-devel] [PATCH] qemu-img: Add --backing-chain option to info command Stefan Hajnoczi
2012-10-12 14:18 ` Eric Blake
2012-10-12 14:24 ` Eric Blake
2012-10-12 14:27   ` Kevin Wolf
2012-10-12 14:32     ` Eric Blake
2012-10-12 14:38       ` Kevin Wolf
2012-10-12 14:50         ` Eric Blake
2012-10-12 19:16 ` Kashyap Chamarthy
2012-10-12 20:19   ` Kashyap Chamarthy [this message]
2012-10-12 20:31     ` Eric Blake
2012-10-13 15:50       ` Kashyap Chamarthy
2012-10-13 21:36         ` Eric Blake
2012-10-14  6:10           ` Kashyap Chamarthy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOaxAcbDNmO2265LNvmCur0DPOEu29SEWOG66jTB5owNs1jxOA@mail.gmail.com \
    --to=kashyap.cv@gmail.com \
    --cc=benoit@irqsave.net \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).