diff mbox series

[v3,3/4] qemu-img: add --shallow option for qemu-img compare

Message ID 20211028102441.1878668-4-vsementsov@virtuozzo.com (mailing list archive)
State New, archived
Headers show
Series qemu-img compare --stat | expand

Commit Message

Vladimir Sementsov-Ogievskiy Oct. 28, 2021, 10:24 a.m. UTC
Allow compare only top images of backing chains. This is useful to
compare images with same backing file or to compare incremental images
from the chain of incremental backups with "--stat" option.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
---
 docs/tools/qemu-img.rst | 9 ++++++++-
 qemu-img.c              | 8 ++++++--
 qemu-img-cmds.hx        | 4 ++--
 3 files changed, 16 insertions(+), 5 deletions(-)

Comments

Eric Blake Oct. 29, 2021, 8:44 p.m. UTC | #1
On Thu, Oct 28, 2021 at 12:24:40PM +0200, Vladimir Sementsov-Ogievskiy wrote:
> Allow compare only top images of backing chains. This is useful to

Allow the comparison of only the top image of backing chains.

> compare images with same backing file or to compare incremental images
> from the chain of incremental backups with "--stat" option.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> Reviewed-by: Hanna Reitz <hreitz@redhat.com>
> ---
>  docs/tools/qemu-img.rst | 9 ++++++++-
>  qemu-img.c              | 8 ++++++--
>  qemu-img-cmds.hx        | 4 ++--
>  3 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
> index 9bfdd93d6c..c6e9306c70 100644
> --- a/docs/tools/qemu-img.rst
> +++ b/docs/tools/qemu-img.rst
> @@ -176,6 +176,13 @@ Parameters to compare subcommand:
>      - If both files don't specify cluster-size, use default of 64K
>      - If only one file specifies cluster-size, just use that.
>  
> +.. option:: --shallow
> +
> +  This option prevents opening and comparing any backing files.
> +  This is useful to compare images with same backing file or to compare
> +  incremental images from the chain of incremental backups with
> +  ``--stat`` option.

If I understand correctly, your implementation makes --shallow an
all-or-none option (either both images are compared shallow, or
neither is).  Does it make sense to make it a per-image option
(--shallow-source, --shallow-dest), where --shallow is a synonym for
the more verbose --shallow-source --shallow-dest?
Vladimir Sementsov-Ogievskiy Nov. 1, 2021, 8:22 a.m. UTC | #2
29.10.2021 23:44, Eric Blake wrote:
> On Thu, Oct 28, 2021 at 12:24:40PM +0200, Vladimir Sementsov-Ogievskiy wrote:
>> Allow compare only top images of backing chains. This is useful to
> 
> Allow the comparison of only the top image of backing chains.
> 
>> compare images with same backing file or to compare incremental images
>> from the chain of incremental backups with "--stat" option.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> Reviewed-by: Hanna Reitz <hreitz@redhat.com>
>> ---
>>   docs/tools/qemu-img.rst | 9 ++++++++-
>>   qemu-img.c              | 8 ++++++--
>>   qemu-img-cmds.hx        | 4 ++--
>>   3 files changed, 16 insertions(+), 5 deletions(-)
>>
>> diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
>> index 9bfdd93d6c..c6e9306c70 100644
>> --- a/docs/tools/qemu-img.rst
>> +++ b/docs/tools/qemu-img.rst
>> @@ -176,6 +176,13 @@ Parameters to compare subcommand:
>>       - If both files don't specify cluster-size, use default of 64K
>>       - If only one file specifies cluster-size, just use that.
>>   
>> +.. option:: --shallow
>> +
>> +  This option prevents opening and comparing any backing files.
>> +  This is useful to compare images with same backing file or to compare
>> +  incremental images from the chain of incremental backups with
>> +  ``--stat`` option.
> 
> If I understand correctly, your implementation makes --shallow an
> all-or-none option (either both images are compared shallow, or
> neither is).  Does it make sense to make it a per-image option
> (--shallow-source, --shallow-dest), where --shallow is a synonym for
> the more verbose --shallow-source --shallow-dest?
> 

Usable, to compare incremental image with "everything below it".

But I'm not sure about source/dest terms in context of compare, where image roles are symmetrical.

I even start to thing, that it should be an option, used together with --image-opts, applied to image in person.. And actually we already have it, like

--image-opts ... driver=qcow2,file.filename=file.qcow2,backing=

At least this works with qemu-io. But prints warning:

>> qemu-io: warning: Use of "backing": "" is deprecated; use "backing": null instead

And of course, "null" doesn't work here.

May be we should drop the warning, keeping backing= syntax at least for --image-opts of qemu utilities. Or, another way, support json for --image-opts.

What do you think? driver=qcow2,file.filename=a.qcow2,backing=  doesn't look better than --shallow. But if we want to make shallow option per-image, we can't ignore the fact that we already have a way to specify per-image options.
diff mbox series

Patch

diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
index 9bfdd93d6c..c6e9306c70 100644
--- a/docs/tools/qemu-img.rst
+++ b/docs/tools/qemu-img.rst
@@ -176,6 +176,13 @@  Parameters to compare subcommand:
     - If both files don't specify cluster-size, use default of 64K
     - If only one file specifies cluster-size, just use that.
 
+.. option:: --shallow
+
+  This option prevents opening and comparing any backing files.
+  This is useful to compare images with same backing file or to compare
+  incremental images from the chain of incremental backups with
+  ``--stat`` option.
+
 Parameters to convert subcommand:
 
 .. program:: qemu-img-convert
@@ -395,7 +402,7 @@  Command description:
 
   The rate limit for the commit process is specified by ``-r``.
 
-.. option:: compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] FILENAME1 FILENAME2
+.. option:: compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] [--shallow] FILENAME1 FILENAME2
 
   Check if two images have the same content. You can compare images with
   different format or settings.
diff --git a/qemu-img.c b/qemu-img.c
index 905150671f..b1cef4b7d1 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -85,6 +85,7 @@  enum {
     OPTION_SKIP_BROKEN = 277,
     OPTION_STAT = 278,
     OPTION_BLOCK_SIZE = 279,
+    OPTION_SHALLOW = 280,
 };
 
 typedef enum OutputFormat {
@@ -1483,7 +1484,7 @@  static int img_compare(int argc, char **argv)
     int64_t block_end;
     int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
     bool progress = false, quiet = false, strict = false;
-    int flags;
+    int flags = 0;
     bool writethrough;
     int64_t total_size;
     int64_t offset = 0;
@@ -1504,6 +1505,7 @@  static int img_compare(int argc, char **argv)
             {"force-share", no_argument, 0, 'U'},
             {"stat", no_argument, 0, OPTION_STAT},
             {"block-size", required_argument, 0, OPTION_BLOCK_SIZE},
+            {"shallow", no_argument, 0, OPTION_SHALLOW},
             {0, 0, 0, 0}
         };
         c = getopt_long(argc, argv, ":hf:F:T:pqsU",
@@ -1569,6 +1571,9 @@  static int img_compare(int argc, char **argv)
                 exit(2);
             }
             break;
+        case OPTION_SHALLOW:
+            flags |= BDRV_O_NO_BACKING;
+            break;
         }
     }
 
@@ -1599,7 +1604,6 @@  static int img_compare(int argc, char **argv)
     /* Initialize before goto out */
     qemu_progress_init(progress, 2.0);
 
-    flags = 0;
     ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
     if (ret < 0) {
         error_report("Invalid source cache option: %s", cache);
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index 96a193eea8..6b164767fd 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -40,9 +40,9 @@  SRST
 ERST
 
 DEF("compare", img_compare,
-    "compare [--object objectdef] [--image-opts] [-f fmt] [-F fmt] [-T src_cache] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] filename1 filename2")
+    "compare [--object objectdef] [--image-opts] [-f fmt] [-F fmt] [-T src_cache] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] [--shallow] filename1 filename2")
 SRST
-.. option:: compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] FILENAME1 FILENAME2
+.. option:: compare [--object OBJECTDEF] [--image-opts] [-f FMT] [-F FMT] [-T SRC_CACHE] [-p] [-q] [-s] [-U] [--stat [--block-size BLOCK_SIZE]] [--shallow] FILENAME1 FILENAME2
 ERST
 
 DEF("convert", img_convert,