Patchwork [1/1] qemu-img.c: Clean up handling of image size in img_create()

login
register
mail settings
Submitter Jes Sorensen
Date Dec. 7, 2010, 5:39 p.m.
Message ID <1291743586-3518-1-git-send-email-Jes.Sorensen@redhat.com>
Download mbox | patch
Permalink /patch/74587/
State New
Headers show

Comments

Jes Sorensen - Dec. 7, 2010, 5:39 p.m.
From: Jes Sorensen <Jes.Sorensen@redhat.com>

This cleans up the handling of image size in img_create() by parsing
the value early, and then only setting it once if a value has been
added as the last argument to the command line.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
---
 qemu-img.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)
Stefan Hajnoczi - Dec. 7, 2010, 8:36 p.m.
On Tue, Dec 7, 2010 at 5:39 PM,  <Jes.Sorensen@redhat.com> wrote:
>     // The size for the image must always be specified, with one exception:
>     // If we are using a backing file, we can obtain the size from there
> -    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
> -
> +    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == 0) {
>         QEMUOptionParameter *backing_file =
>             get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
>         QEMUOptionParameter *backing_fmt =

Today it is possible to create 0 byte sized images.  Your patch will
change that:
If there is a backing file, then the size will be taken from the backing file.
If there is no backing file, then an error about missing size will be
printed, even though a size of 0 has been given.

I don't think 0 sized images are very useful, but I'm not sure we
should make this change.

Stefan
Jes Sorensen - Dec. 8, 2010, 6:30 a.m.
On 12/07/10 21:36, Stefan Hajnoczi wrote:
> On Tue, Dec 7, 2010 at 5:39 PM,  <Jes.Sorensen@redhat.com> wrote:
>>     // The size for the image must always be specified, with one exception:
>>     // If we are using a backing file, we can obtain the size from there
>> -    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
>> -
>> +    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == 0) {
>>         QEMUOptionParameter *backing_file =
>>             get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
>>         QEMUOptionParameter *backing_fmt =
> 
> Today it is possible to create 0 byte sized images.  Your patch will
> change that:
> If there is a backing file, then the size will be taken from the backing file.
> If there is no backing file, then an error about missing size will be
> printed, even though a size of 0 has been given.
> 
> I don't think 0 sized images are very useful, but I'm not sure we
> should make this change.

The old code also fails if there is no size, except for when a backing
file is present.

I hadn't thought of the zero sized file, but on the other hand, I don't
see it being useful.

I would like to make this change to get the option handling cleaned up
as it allows me to refactor the code in img_create().

Cheers,
Jes
Kevin Wolf - Dec. 8, 2010, 8:54 a.m.
Am 07.12.2010 21:36, schrieb Stefan Hajnoczi:
> On Tue, Dec 7, 2010 at 5:39 PM,  <Jes.Sorensen@redhat.com> wrote:
>>     // The size for the image must always be specified, with one exception:
>>     // If we are using a backing file, we can obtain the size from there
>> -    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
>> -
>> +    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == 0) {
>>         QEMUOptionParameter *backing_file =
>>             get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
>>         QEMUOptionParameter *backing_fmt =
> 
> Today it is possible to create 0 byte sized images.  Your patch will
> change that:
> If there is a backing file, then the size will be taken from the backing file.
> If there is no backing file, then an error about missing size will be
> printed, even though a size of 0 has been given.

I can think of one use case for it: You can store the VM state on a
zero-sized qcow2 image for internal snapshots.

Otherwise it's probably rather useless, but we have supported it for a
long time, so I wouldn't remove it. People have actually noticed in the
past when something was broken with it.

Kevin
Jes Sorensen - Dec. 8, 2010, 9:14 a.m.
On 12/08/10 09:54, Kevin Wolf wrote:
> Am 07.12.2010 21:36, schrieb Stefan Hajnoczi:
>> Today it is possible to create 0 byte sized images.  Your patch will
>> change that:
>> If there is a backing file, then the size will be taken from the backing file.
>> If there is no backing file, then an error about missing size will be
>> printed, even though a size of 0 has been given.
> 
> I can think of one use case for it: You can store the VM state on a
> zero-sized qcow2 image for internal snapshots.
> 
> Otherwise it's probably rather useless, but we have supported it for a
> long time, so I wouldn't remove it. People have actually noticed in the
> past when something was broken with it.

Ok that is fair, I have just posted an updated version which should do
the right thing. Shows up it made the patch even simpler :)

Cheers,
Jes

Patch

diff --git a/qemu-img.c b/qemu-img.c
index d146d8c..eaec725 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -282,6 +282,7 @@  static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
 static int img_create(int argc, char **argv)
 {
     int c, ret = 0;
+    uint64_t img_size = 0;
     const char *fmt = "raw";
     const char *base_fmt = NULL;
     const char *filename;
@@ -329,6 +330,11 @@  static int img_create(int argc, char **argv)
     }
     filename = argv[optind++];
 
+    /* Get image size, if specified */
+    if (optind < argc) {
+        img_size = strtosz(argv[optind++], NULL);
+    }
+
     if (options && !strcmp(options, "?")) {
         ret = print_block_option_help(filename, fmt);
         goto out;
@@ -356,7 +362,6 @@  static int img_create(int argc, char **argv)
 
     /* Create parameter list with default values */
     param = parse_option_parameters("", create_options, param);
-    set_option_parameter_int(param, BLOCK_OPT_SIZE, -1);
 
     /* Parse -o options */
     if (options) {
@@ -368,21 +373,19 @@  static int img_create(int argc, char **argv)
         }
     }
 
-    /* Add size to parameters */
-    if (optind < argc) {
-        set_option_parameter(param, BLOCK_OPT_SIZE, argv[optind++]);
-    }
-
     /* Add old-style options to parameters */
     ret = add_old_style_options(fmt, param, base_filename, base_fmt);
     if (ret < 0) {
         goto out;
     }
 
+    if (img_size) {
+        set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
+    }
+
     // The size for the image must always be specified, with one exception:
     // If we are using a backing file, we can obtain the size from there
-    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
-
+    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == 0) {
         QEMUOptionParameter *backing_file =
             get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
         QEMUOptionParameter *backing_fmt =