diff mbox

[v22,13/25] qed.c: replace QEMUOptionParameter with QemuOpts

Message ID 1394436721-21812-14-git-send-email-cyliu@suse.com
State New
Headers show

Commit Message

Chunyan Liu March 10, 2014, 7:31 a.m. UTC
Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
Signed-off-by: Chunyan Liu <cyliu@suse.com>
---
 block/qed.c | 114 ++++++++++++++++++++++++++++++++----------------------------
 block/qed.h |   3 +-
 2 files changed, 61 insertions(+), 56 deletions(-)

Comments

Stefan Hajnoczi March 11, 2014, 2:24 p.m. UTC | #1
On Mon, Mar 10, 2014 at 03:31:49PM +0800, Chunyan Liu wrote:
> diff --git a/block/qed.h b/block/qed.h
> index 5d65bea..b024751 100644
> --- a/block/qed.h
> +++ b/block/qed.h
> @@ -43,7 +43,7 @@
>   *
>   * All fields are little-endian on disk.
>   */
> -
> +#define  QED_DEFAULT_CLUSTER_SIZE  65536
>  enum {
>      QED_MAGIC = 'Q' | 'E' << 8 | 'D' << 16 | '\0' << 24,
>  
> @@ -69,7 +69,6 @@ enum {
>       */
>      QED_MIN_CLUSTER_SIZE = 4 * 1024, /* in bytes */
>      QED_MAX_CLUSTER_SIZE = 64 * 1024 * 1024,
> -    QED_DEFAULT_CLUSTER_SIZE = 64 * 1024,

Why is this change made for cluster size but not table size?

Stefan
Chunyan Liu March 20, 2014, 9:08 a.m. UTC | #2
>>> On 3/11/2014 at 10:24 PM, in message
<20140311142451.GM7761@stefanha-thinkpad.redhat.com>, Stefan Hajnoczi
<stefanha@gmail.com> wrote: 
> On Mon, Mar 10, 2014 at 03:31:49PM +0800, Chunyan Liu wrote: 
> > diff --git a/block/qed.h b/block/qed.h 
> > index 5d65bea..b024751 100644 
> > --- a/block/qed.h 
> > +++ b/block/qed.h 
> > @@ -43,7 +43,7 @@ 
> >   * 
> >   * All fields are little-endian on disk. 
> >   */ 
> > - 
> > +#define  QED_DEFAULT_CLUSTER_SIZE  65536 
> >  enum { 
> >      QED_MAGIC = 'Q' | 'E' << 8 | 'D' << 16 | '\0' << 24, 
> >   
> > @@ -69,7 +69,6 @@ enum { 
> >       */ 
> >      QED_MIN_CLUSTER_SIZE = 4 * 1024, /* in bytes */ 
> >      QED_MAX_CLUSTER_SIZE = 64 * 1024 * 1024, 
> > -    QED_DEFAULT_CLUSTER_SIZE = 64 * 1024, 
>  
> Why is this change made for cluster size but not table size? 

According to existing create_options, "cluster size" has default value = 
QED_DEFAULT_CLUSTER_SIZE, after switching to create_opts, this has to be 
stringized and set to .def_value_str. That is, 
 .def_value_str = stringify(QED_DEFAULT_CLUSTER_SIZE), 
so the QED_DEFAULT_CLUSTER_SIZE could not be a expression, here changes. 
"table size" has no default value in create_options, not need such changes

>  
> Stefan 
>  
>
Stefan Hajnoczi March 20, 2014, 2:14 p.m. UTC | #3
On Thu, Mar 20, 2014 at 03:08:07AM -0600, Chun Yan Liu wrote:
> 
> 
> >>> On 3/11/2014 at 10:24 PM, in message
> <20140311142451.GM7761@stefanha-thinkpad.redhat.com>, Stefan Hajnoczi
> <stefanha@gmail.com> wrote: 
> > On Mon, Mar 10, 2014 at 03:31:49PM +0800, Chunyan Liu wrote: 
> > > diff --git a/block/qed.h b/block/qed.h 
> > > index 5d65bea..b024751 100644 
> > > --- a/block/qed.h 
> > > +++ b/block/qed.h 
> > > @@ -43,7 +43,7 @@ 
> > >   * 
> > >   * All fields are little-endian on disk. 
> > >   */ 
> > > - 
> > > +#define  QED_DEFAULT_CLUSTER_SIZE  65536 
> > >  enum { 
> > >      QED_MAGIC = 'Q' | 'E' << 8 | 'D' << 16 | '\0' << 24, 
> > >   
> > > @@ -69,7 +69,6 @@ enum { 
> > >       */ 
> > >      QED_MIN_CLUSTER_SIZE = 4 * 1024, /* in bytes */ 
> > >      QED_MAX_CLUSTER_SIZE = 64 * 1024 * 1024, 
> > > -    QED_DEFAULT_CLUSTER_SIZE = 64 * 1024, 
> >  
> > Why is this change made for cluster size but not table size? 
> 
> According to existing create_options, "cluster size" has default value = 
> QED_DEFAULT_CLUSTER_SIZE, after switching to create_opts, this has to be 
> stringized and set to .def_value_str. That is, 
>  .def_value_str = stringify(QED_DEFAULT_CLUSTER_SIZE), 
> so the QED_DEFAULT_CLUSTER_SIZE could not be a expression, here changes. 
> "table size" has no default value in create_options, not need such changes

Okay, thanks!
diff mbox

Patch

diff --git a/block/qed.c b/block/qed.c
index db27f36..a22c2d9 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -621,53 +621,51 @@  out:
     return ret;
 }
 
-static int bdrv_qed_create(const char *filename, QEMUOptionParameter *options,
-                           Error **errp)
+static int bdrv_qed_create(const char *filename, QemuOpts *opts, Error **errp)
 {
     uint64_t image_size = 0;
     uint32_t cluster_size = QED_DEFAULT_CLUSTER_SIZE;
     uint32_t table_size = QED_DEFAULT_TABLE_SIZE;
-    const char *backing_file = NULL;
-    const char *backing_fmt = NULL;
-
-    while (options && options->name) {
-        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
-            image_size = options->value.n;
-        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
-            backing_file = options->value.s;
-        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FMT)) {
-            backing_fmt = options->value.s;
-        } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) {
-            if (options->value.n) {
-                cluster_size = options->value.n;
-            }
-        } else if (!strcmp(options->name, BLOCK_OPT_TABLE_SIZE)) {
-            if (options->value.n) {
-                table_size = options->value.n;
-            }
-        }
-        options++;
-    }
+    char *backing_file = NULL;
+    char *backing_fmt = NULL;
+    int ret;
+
+    image_size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
+    backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE);
+    backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT);
+    cluster_size = qemu_opt_get_size_del(opts,
+                                         BLOCK_OPT_CLUSTER_SIZE,
+                                         QED_DEFAULT_CLUSTER_SIZE);
+    table_size = qemu_opt_get_size_del(opts, BLOCK_OPT_TABLE_SIZE,
+                                       QED_DEFAULT_TABLE_SIZE);
 
     if (!qed_is_cluster_size_valid(cluster_size)) {
         fprintf(stderr, "QED cluster size must be within range [%u, %u] and power of 2\n",
                 QED_MIN_CLUSTER_SIZE, QED_MAX_CLUSTER_SIZE);
-        return -EINVAL;
+        ret = -EINVAL;
+        goto finish;
     }
     if (!qed_is_table_size_valid(table_size)) {
         fprintf(stderr, "QED table size must be within range [%u, %u] and power of 2\n",
                 QED_MIN_TABLE_SIZE, QED_MAX_TABLE_SIZE);
-        return -EINVAL;
+        ret = -EINVAL;
+        goto finish;
     }
     if (!qed_is_image_size_valid(image_size, cluster_size, table_size)) {
         fprintf(stderr, "QED image size must be a non-zero multiple of "
                         "cluster size and less than %" PRIu64 " bytes\n",
                 qed_max_image_size(cluster_size, table_size));
-        return -EINVAL;
+        ret = -EINVAL;
+        goto finish;
     }
 
-    return qed_create(filename, cluster_size, image_size, table_size,
-                      backing_file, backing_fmt, errp);
+    ret = qed_create(filename, cluster_size, image_size, table_size,
+                     backing_file, backing_fmt, errp);
+
+finish:
+    g_free(backing_file);
+    g_free(backing_fmt);
+    return ret;
 }
 
 typedef struct {
@@ -1575,43 +1573,51 @@  static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result,
     return qed_check(s, result, !!fix);
 }
 
-static QEMUOptionParameter qed_create_options[] = {
-    {
-        .name = BLOCK_OPT_SIZE,
-        .type = OPT_SIZE,
-        .help = "Virtual disk size (in bytes)"
-    }, {
-        .name = BLOCK_OPT_BACKING_FILE,
-        .type = OPT_STRING,
-        .help = "File name of a base image"
-    }, {
-        .name = BLOCK_OPT_BACKING_FMT,
-        .type = OPT_STRING,
-        .help = "Image format of the base image"
-    }, {
-        .name = BLOCK_OPT_CLUSTER_SIZE,
-        .type = OPT_SIZE,
-        .help = "Cluster size (in bytes)",
-        .value = { .n = QED_DEFAULT_CLUSTER_SIZE },
-    }, {
-        .name = BLOCK_OPT_TABLE_SIZE,
-        .type = OPT_SIZE,
-        .help = "L1/L2 table size (in clusters)"
-    },
-    { /* end of list */ }
+static QemuOptsList qed_create_opts = {
+    .name = "qed-create-opts",
+    .head = QTAILQ_HEAD_INITIALIZER(qed_create_opts.head),
+    .desc = {
+        {
+            .name = BLOCK_OPT_SIZE,
+            .type = QEMU_OPT_SIZE,
+            .help = "Virtual disk size"
+        },
+        {
+            .name = BLOCK_OPT_BACKING_FILE,
+            .type = QEMU_OPT_STRING,
+            .help = "File name of a base image"
+        },
+        {
+            .name = BLOCK_OPT_BACKING_FMT,
+            .type = QEMU_OPT_STRING,
+            .help = "Image format of the base image"
+        },
+        {
+            .name = BLOCK_OPT_CLUSTER_SIZE,
+            .type = QEMU_OPT_SIZE,
+            .help = "Cluster size (in bytes)",
+            .def_value_str = stringify(QED_DEFAULT_CLUSTER_SIZE)
+        },
+        {
+            .name = BLOCK_OPT_TABLE_SIZE,
+            .type = QEMU_OPT_SIZE,
+            .help = "L1/L2 table size (in clusters)"
+        },
+        { /* end of list */ }
+    }
 };
 
 static BlockDriver bdrv_qed = {
     .format_name              = "qed",
     .instance_size            = sizeof(BDRVQEDState),
-    .create_options           = qed_create_options,
+    .create_opts              = &qed_create_opts,
 
     .bdrv_probe               = bdrv_qed_probe,
     .bdrv_rebind              = bdrv_qed_rebind,
     .bdrv_open                = bdrv_qed_open,
     .bdrv_close               = bdrv_qed_close,
     .bdrv_reopen_prepare      = bdrv_qed_reopen_prepare,
-    .bdrv_create              = bdrv_qed_create,
+    .bdrv_create2             = bdrv_qed_create,
     .bdrv_has_zero_init       = bdrv_has_zero_init_1,
     .bdrv_co_get_block_status = bdrv_qed_co_get_block_status,
     .bdrv_aio_readv           = bdrv_qed_aio_readv,
diff --git a/block/qed.h b/block/qed.h
index 5d65bea..b024751 100644
--- a/block/qed.h
+++ b/block/qed.h
@@ -43,7 +43,7 @@ 
  *
  * All fields are little-endian on disk.
  */
-
+#define  QED_DEFAULT_CLUSTER_SIZE  65536
 enum {
     QED_MAGIC = 'Q' | 'E' << 8 | 'D' << 16 | '\0' << 24,
 
@@ -69,7 +69,6 @@  enum {
      */
     QED_MIN_CLUSTER_SIZE = 4 * 1024, /* in bytes */
     QED_MAX_CLUSTER_SIZE = 64 * 1024 * 1024,
-    QED_DEFAULT_CLUSTER_SIZE = 64 * 1024,
 
     /* Allocated clusters are tracked using a 2-level pagetable.  Table size is
      * a multiple of clusters so large maximum image sizes can be supported