diff mbox

[1/2] hmp: add hmp command for incremental backup

Message ID 1453375338-13508-2-git-send-email-rudyflyzhang@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Rudy Zhang Jan. 21, 2016, 11:22 a.m. UTC
Add hmp command for incremental backup in drive-backup.
It need a bitmap to backup data from drive-image to incremental image,
so before it need add bitmap for this device to track io.
Usage:
	drive_backup [-n] [-f] device target [bitmap] [format]

Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com>
---
 hmp-commands.hx |  5 +++--
 hmp.c           | 16 ++++++++++++++--
 2 files changed, 17 insertions(+), 4 deletions(-)

Comments

Eric Blake Jan. 21, 2016, 4:39 p.m. UTC | #1
On 01/21/2016 04:22 AM, Rudy Zhang wrote:
> Add hmp command for incremental backup in drive-backup.
> It need a bitmap to backup data from drive-image to incremental image,
> so before it need add bitmap for this device to track io.
> Usage:
> 	drive_backup [-n] [-f] device target [bitmap] [format]
> 
> Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com>
> ---
>  hmp-commands.hx |  5 +++--
>  hmp.c           | 16 ++++++++++++++--
>  2 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index bb52e4d..7378aaa 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1180,12 +1180,13 @@ ETEXI
>  
>      {
>          .name       = "drive_backup",
> -        .args_type  = "reuse:-n,full:-f,device:B,target:s,format:s?",
> -        .params     = "[-n] [-f] device target [format]",
> +        .args_type  = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
> +        .params     = "[-n] [-f] device target [bitmap] [format]",

This is HMP, so it may not matter, but this is not backwards compatible.
 Scripts targetting the old style of passing a format will now have that
format string interpreted as a bitmap name with no format.  Better would
be to stick [bitmap] at the end, not the middle.


> @@ -1098,6 +1100,17 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
>          return;
>      }
>  
> +    if (full && bitmap) {
> +        error_setg(&err, "Parameter 'bitmap' if conflict with '-f'");

s/if conflict/conflicts/

> +        hmp_handle_error(mon, &err);
> +        return;
> +    } else if (full)
> +        sync = MIRROR_SYNC_MODE_FULL;

Needs {}.  Run your patch through scripts/checkpatch.pl, to flag this
and other style violations.
John Snow Jan. 21, 2016, 8:47 p.m. UTC | #2
On 01/21/2016 11:39 AM, Eric Blake wrote:
> On 01/21/2016 04:22 AM, Rudy Zhang wrote:
>> Add hmp command for incremental backup in drive-backup.
>> It need a bitmap to backup data from drive-image to incremental image,
>> so before it need add bitmap for this device to track io.
>> Usage:
>> 	drive_backup [-n] [-f] device target [bitmap] [format]
>>
>> Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com>
>> ---
>>  hmp-commands.hx |  5 +++--
>>  hmp.c           | 16 ++++++++++++++--
>>  2 files changed, 17 insertions(+), 4 deletions(-)
>>
>> diff --git a/hmp-commands.hx b/hmp-commands.hx
>> index bb52e4d..7378aaa 100644
>> --- a/hmp-commands.hx
>> +++ b/hmp-commands.hx
>> @@ -1180,12 +1180,13 @@ ETEXI
>>  
>>      {
>>          .name       = "drive_backup",
>> -        .args_type  = "reuse:-n,full:-f,device:B,target:s,format:s?",
>> -        .params     = "[-n] [-f] device target [format]",
>> +        .args_type  = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
>> +        .params     = "[-n] [-f] device target [bitmap] [format]",
> 
> This is HMP, so it may not matter, but this is not backwards compatible.
>  Scripts targetting the old style of passing a format will now have that
> format string interpreted as a bitmap name with no format.  Better would
> be to stick [bitmap] at the end, not the middle.
> 

I'd like to also point out that the method of intuiting the backup mode
based on the parameters present won't expand very well as we add more
modes, especially if there's ever an addition for a differential backup
mode.

Maybe it's fine because it's HMP and backwards compatibility is not a
real concern ...

> 
>> @@ -1098,6 +1100,17 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
>>          return;
>>      }
>>  
>> +    if (full && bitmap) {
>> +        error_setg(&err, "Parameter 'bitmap' if conflict with '-f'");
> 
> s/if conflict/conflicts/
> 
>> +        hmp_handle_error(mon, &err);
>> +        return;
>> +    } else if (full)
>> +        sync = MIRROR_SYNC_MODE_FULL;
> 
> Needs {}.  Run your patch through scripts/checkpatch.pl, to flag this
> and other style violations.
>
Rudy Zhang Jan. 22, 2016, 2:04 a.m. UTC | #3
On 16/1/22 ??12:39, Eric Blake wrote:
> On 01/21/2016 04:22 AM, Rudy Zhang wrote:
>> Add hmp command for incremental backup in drive-backup.
>> It need a bitmap to backup data from drive-image to incremental image,
>> so before it need add bitmap for this device to track io.
>> Usage:
>> drive_backup [-n] [-f] device target [bitmap] [format]
>>
>> Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com>
>> ---
>>   hmp-commands.hx |  5 +++--
>>   hmp.c           | 16 ++++++++++++++--
>>   2 files changed, 17 insertions(+), 4 deletions(-)
>>
>> diff --git a/hmp-commands.hx b/hmp-commands.hx
>> index bb52e4d..7378aaa 100644
>> --- a/hmp-commands.hx
>> +++ b/hmp-commands.hx
>> @@ -1180,12 +1180,13 @@ ETEXI
>>
>>       {
>>           .name       = "drive_backup",
>> -        .args_type  = "reuse:-n,full:-f,device:B,target:s,format:s?",
>> -        .params     = "[-n] [-f] device target [format]",
>> +        .args_type  = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
>> +        .params     = "[-n] [-f] device target [bitmap] [format]",
> This is HMP, so it may not matter, but this is not backwards compatible.
>   Scripts targetting the old style of passing a format will now have that
> format string interpreted as a bitmap name with no format.  Better would
> be to stick [bitmap] at the end, not the middle.

But I have a question: If I don't want to input a 'format', only use 'bitmap',
it will let 'bitmap' as 'format', This problem how to do it.

>
>> @@ -1098,6 +1100,17 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
>>           return;
>>       }
>>
>> +    if (full && bitmap) {
>> +        error_setg(&err, "Parameter 'bitmap' if conflict with '-f'");
> s/if conflict/conflicts/

oh?made a mistake.

>> +        hmp_handle_error(mon, &err);
>> +        return;
>> +    } else if (full)
>> +        sync = MIRROR_SYNC_MODE_FULL;
> Needs {}.  Run your patch through scripts/checkpatch.pl, to flag this
> and other style violations.

I have checked these patches?but I ignored these warnings.
Eric Blake Jan. 22, 2016, 4:39 p.m. UTC | #4
On 01/21/2016 07:04 PM, ?? wrote:

>>> -        .args_type  = "reuse:-n,full:-f,device:B,target:s,format:s?",
>>> -        .params     = "[-n] [-f] device target [format]",
>>> +        .args_type  = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
>>> +        .params     = "[-n] [-f] device target [bitmap] [format]",
>> This is HMP, so it may not matter, but this is not backwards compatible.
>>   Scripts targetting the old style of passing a format will now have that
>> format string interpreted as a bitmap name with no format.  Better would
>> be to stick [bitmap] at the end, not the middle.
> 
> But I have a question: If I don't want to input a 'format', only use 'bitmap',
> it will let 'bitmap' as 'format', This problem how to do it.

Several solutions, some nicer than others, some more complicated than
others.  I don't have any strong preference, so much as pointing out the
design space:

1. You don't.  If you want to use 'bitmap', you MUST supply 'format'
(supplying format is good anyways, as implicit formats have led to CVEs
in the past).

1.a. Possible variation: Teach the command to allow empty '' format to
be a synonym for an implicit format, so that it could look like:

drive_backup device target '' /path/to/bitmap

2. You modify the HMP parser to accept optionally-named arguments, so
that you can then supply later optional arguments by name without having
to provide the earlier optional arguments.  Maybe looking something like:

drive_backup device target --bitmap=/path/to/bitmap

3. Instead of trying to overload an existing command, you create a new
command.  Particularly since your overload already declared that '-f'
and 'bitmap' are incompatible.

4. maybe something else?

>> Needs {}.  Run your patch through scripts/checkpatch.pl, to flag this
>> and other style violations.
> 
> I have checked these patches?but I ignored these warnings.

Not a good idea.  And even in the rare case that you plan on ignoring
the warnings, you should at least document in the commit message your
justification for doing so.
diff mbox

Patch

diff --git a/hmp-commands.hx b/hmp-commands.hx
index bb52e4d..7378aaa 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1180,12 +1180,13 @@  ETEXI
 
     {
         .name       = "drive_backup",
-        .args_type  = "reuse:-n,full:-f,device:B,target:s,format:s?",
-        .params     = "[-n] [-f] device target [format]",
+        .args_type  = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
+        .params     = "[-n] [-f] device target [bitmap] [format]",
         .help       = "initiates a point-in-time\n\t\t\t"
                       "copy for a device. The device's contents are\n\t\t\t"
                       "copied to the new image file, excluding data that\n\t\t\t"
                       "is written after the command is started.\n\t\t\t"
+                      "With bitmap will start incremental backup.\n\t\t\t"
                       "The -n flag requests QEMU to reuse the image found\n\t\t\t"
                       "in new-image-file, instead of recreating it from scratch.\n\t\t\t"
                       "The -f flag requests QEMU to copy the whole disk,\n\t\t\t"
diff --git a/hmp.c b/hmp.c
index 54f2620..f8c33cd 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1086,11 +1086,13 @@  void hmp_drive_backup(Monitor *mon, const QDict *qdict)
 {
     const char *device = qdict_get_str(qdict, "device");
     const char *filename = qdict_get_str(qdict, "target");
+    const char *bitmap = qdict_get_try_str(qdict, "bitmap");
     const char *format = qdict_get_try_str(qdict, "format");
     bool reuse = qdict_get_try_bool(qdict, "reuse", false);
     bool full = qdict_get_try_bool(qdict, "full", false);
     enum NewImageMode mode;
     Error *err = NULL;
+    enum MirrorSyncMode sync;
 
     if (!filename) {
         error_setg(&err, QERR_MISSING_PARAMETER, "target");
@@ -1098,6 +1100,17 @@  void hmp_drive_backup(Monitor *mon, const QDict *qdict)
         return;
     }
 
+    if (full && bitmap) {
+        error_setg(&err, "Parameter 'bitmap' if conflict with '-f'");
+        hmp_handle_error(mon, &err);
+        return;
+    } else if (full)
+        sync = MIRROR_SYNC_MODE_FULL;
+    else if (bitmap)
+        sync = MIRROR_SYNC_MODE_INCREMENTAL;
+    else
+        sync = MIRROR_SYNC_MODE_TOP;
+
     if (reuse) {
         mode = NEW_IMAGE_MODE_EXISTING;
     } else {
@@ -1105,8 +1118,7 @@  void hmp_drive_backup(Monitor *mon, const QDict *qdict)
     }
 
     qmp_drive_backup(device, filename, !!format, format,
-                     full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
-                     true, mode, false, 0, false, NULL,
+                     sync, true, mode, false, 0, !!bitmap, bitmap,
                      false, 0, false, 0, &err);
     hmp_handle_error(mon, &err);
 }