qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, mreitz@redhat.com, pkrempa@redhat.com,
	eblake@redhat.com, jcody@redhat.com, jdurgin@redhat.com,
	mitake.hitoshi@lab.ntt.co.jp, namei.unix@gmail.com,
	qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH v4 28/37] sheepdog: QAPIfy "redundancy" create option
Date: Wed,  7 Mar 2018 19:59:37 +0100	[thread overview]
Message-ID: <20180307185946.29366-29-kwolf@redhat.com> (raw)
In-Reply-To: <20180307185946.29366-1-kwolf@redhat.com>

The "redundancy" option for Sheepdog image creation is currently a
string that can encode one or two integers depending on its format,
which at the same time implicitly selects a mode.

This patch turns it into a QAPI union and converts the string into such
a QAPI object before interpreting the values.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 qapi/block-core.json | 45 +++++++++++++++++++++++++
 block/sheepdog.c     | 94 +++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 112 insertions(+), 27 deletions(-)

diff --git a/qapi/block-core.json b/qapi/block-core.json
index 39e53c7791..e590ab6c71 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -3467,6 +3467,51 @@
             '*cluster-size' :   'size' } }
 
 ##
+# @SheepdogRedundancyType:
+#
+# @full             Create a fully replicated vdi with x copies
+# @erasure-coded    Create an erasure coded vdi with x data strips and
+#                   y parity strips
+#
+# Since: 2.12
+##
+{ 'enum': 'SheepdogRedundancyType',
+  'data': [ 'full', 'erasure-coded' ] }
+
+##
+# @SheepdogRedundancyFull:
+#
+# @copies           Number of copies to use (between 1 and 31)
+#
+# Since: 2.12
+##
+{ 'struct': 'SheepdogRedundancyFull',
+  'data': { 'copies': 'int' }}
+
+##
+# @SheepdogRedundancyErasureCoded:
+#
+# @data-strips      Number of data strips to use (one of {2,4,8,16})
+# @parity-strips    Number of parity strips to use (between 1 and 15)
+#
+# Since: 2.12
+##
+{ 'struct': 'SheepdogRedundancyErasureCoded',
+  'data': { 'data-strips': 'int',
+            'parity-strips': 'int' }}
+
+##
+# @SheepdogRedundancy:
+#
+# Since: 2.12
+##
+{ 'union': 'SheepdogRedundancy',
+  'base': { 'type': 'SheepdogRedundancyType' },
+  'discriminator': 'type',
+  'data': { 'full': 'SheepdogRedundancyFull',
+            'erasure-coded': 'SheepdogRedundancyErasureCoded' } }
+
+##
 # @BlockdevCreateNotSupported:
 #
 # This is used for all drivers that don't support creating images.
diff --git a/block/sheepdog.c b/block/sheepdog.c
index d8c10b7cac..3966cd229a 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -1882,6 +1882,48 @@ out_with_err_set:
     return ret;
 }
 
+static int parse_redundancy(BDRVSheepdogState *s, SheepdogRedundancy *opt)
+{
+    struct SheepdogInode *inode = &s->inode;
+
+    switch (opt->type) {
+    case SHEEPDOG_REDUNDANCY_TYPE_FULL:
+        if (opt->u.full.copies > SD_MAX_COPIES || opt->u.full.copies < 1) {
+            return -EINVAL;
+        }
+        inode->copy_policy = 0;
+        inode->nr_copies = opt->u.full.copies;
+        return 0;
+
+    case SHEEPDOG_REDUNDANCY_TYPE_ERASURE_CODED:
+    {
+        int64_t copy = opt->u.erasure_coded.data_strips;
+        int64_t parity = opt->u.erasure_coded.parity_strips;
+
+        if (copy != 2 && copy != 4 && copy != 8 && copy != 16) {
+            return -EINVAL;
+        }
+
+        if (parity >= SD_EC_MAX_STRIP || parity < 1) {
+            return -EINVAL;
+        }
+
+        /*
+         * 4 bits for parity and 4 bits for data.
+         * We have to compress upper data bits because it can't represent 16
+         */
+        inode->copy_policy = ((copy / 2) << 4) + parity;
+        inode->nr_copies = copy + parity;
+        return 0;
+    }
+
+    default:
+        g_assert_not_reached();
+    }
+
+    return -EINVAL;
+}
+
 /*
  * Sheepdog support two kinds of redundancy, full replication and erasure
  * coding.
@@ -1892,12 +1934,13 @@ out_with_err_set:
  * # create a erasure coded vdi with x data strips and y parity strips
  * -o redundancy=x:y (x must be one of {2,4,8,16} and 1 <= y < SD_EC_MAX_STRIP)
  */
-static int parse_redundancy(BDRVSheepdogState *s, const char *opt)
+static int parse_redundancy_str(BDRVSheepdogState *s, const char *opt)
 {
-    struct SheepdogInode *inode = &s->inode;
+    struct SheepdogRedundancy redundancy;
     const char *n1, *n2;
     long copy, parity;
     char p[10];
+    int ret;
 
     pstrcpy(p, sizeof(p), opt);
     n1 = strtok(p, ":");
@@ -1907,35 +1950,32 @@ static int parse_redundancy(BDRVSheepdogState *s, const char *opt)
         return -EINVAL;
     }
 
-    copy = strtol(n1, NULL, 10);
-    /* FIXME fix error checking by switching to qemu_strtol() */
-    if (copy > SD_MAX_COPIES || copy < 1) {
-        return -EINVAL;
-    }
-    if (!n2) {
-        inode->copy_policy = 0;
-        inode->nr_copies = copy;
-        return 0;
+    ret = qemu_strtol(n1, NULL, 10, &copy);
+    if (ret < 0) {
+        return ret;
     }
 
-    if (copy != 2 && copy != 4 && copy != 8 && copy != 16) {
-        return -EINVAL;
-    }
+    if (!n2) {
+        redundancy = (SheepdogRedundancy) {
+            .type               = SHEEPDOG_REDUNDANCY_TYPE_FULL,
+            .u.full.copies      = copy,
+        };
+    } else {
+        ret = qemu_strtol(n2, NULL, 10, &parity);
+        if (ret < 0) {
+            return ret;
+        }
 
-    parity = strtol(n2, NULL, 10);
-    /* FIXME fix error checking by switching to qemu_strtol() */
-    if (parity >= SD_EC_MAX_STRIP || parity < 1) {
-        return -EINVAL;
+        redundancy = (SheepdogRedundancy) {
+            .type               = SHEEPDOG_REDUNDANCY_TYPE_ERASURE_CODED,
+            .u.erasure_coded    = {
+                .data_strips    = copy,
+                .parity_strips  = parity,
+            },
+        };
     }
 
-    /*
-     * 4 bits for parity and 4 bits for data.
-     * We have to compress upper data bits because it can't represent 16
-     */
-    inode->copy_policy = ((copy / 2) << 4) + parity;
-    inode->nr_copies = copy + parity;
-
-    return 0;
+    return parse_redundancy(s, &redundancy);
 }
 
 static int parse_block_size_shift(BDRVSheepdogState *s, QemuOpts *opt)
@@ -2007,7 +2047,7 @@ static int coroutine_fn sd_co_create_opts(const char *filename, QemuOpts *opts,
     g_free(buf);
     buf = qemu_opt_get_del(opts, BLOCK_OPT_REDUNDANCY);
     if (buf) {
-        ret = parse_redundancy(s, buf);
+        ret = parse_redundancy_str(s, buf);
         if (ret < 0) {
             error_setg(errp, "Invalid redundancy mode: '%s'", buf);
             goto out;
-- 
2.13.6

  parent reply	other threads:[~2018-03-07 19:01 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-07 18:59 [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 01/37] block/qapi: Introduce BlockdevCreateOptions Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 02/37] block/qapi: Add qcow2 create options to schema Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 03/37] qcow2: Rename qcow2_co_create2() to qcow2_co_create() Kevin Wolf
2018-03-07 19:13   ` Max Reitz
2018-03-07 19:15   ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 04/37] qcow2: Let qcow2_create() handle protocol layer Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 05/37] qcow2: Pass BlockdevCreateOptions to qcow2_co_create() Kevin Wolf
2018-03-07 19:41   ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 06/37] qcow2: Use BlockdevRef in qcow2_co_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 07/37] qcow2: Use QCryptoBlockCreateOptions " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 08/37] qcow2: Handle full/falloc preallocation " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 09/37] util: Add qemu_opts_to_qdict_filtered() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 10/37] test-qemu-opts: Test qemu_opts_append() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 11/37] test-qemu-opts: Test qemu_opts_to_qdict_filtered() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 12/37] qdict: Introduce qdict_rename_keys() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 13/37] qcow2: Use visitor for options in qcow2_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 14/37] block: Make bdrv_is_whitelisted() public Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 15/37] block: x-blockdev-create QMP command Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 16/37] file-posix: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 17/37] file-win32: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 18/37] gluster: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 19/37] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 20/37] rbd: Factor out qemu_rbd_connect() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 21/37] rbd: Remove non-schema options from runtime_opts Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 22/37] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect() Kevin Wolf
2018-03-07 19:28   ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 23/37] rbd: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 24/37] rbd: Assign s->snap/image_name in qemu_rbd_open() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 25/37] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 26/37] nfs: Use QAPI options in nfs_client_open() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` Kevin Wolf [this message]
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 29/37] sheepdog: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 30/37] ssh: Use QAPI BlockdevOptionsSsh object Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 31/37] ssh: QAPIfy host-key-check option Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 32/37] ssh: Pass BlockdevOptionsSsh to connect_to_ssh() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 33/37] ssh: Support .bdrv_co_create Kevin Wolf
2018-03-07 19:40   ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 34/37] file-posix: Fix no-op bdrv_truncate() with falloc preallocation Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 35/37] block: Fail bdrv_truncate() with negative size Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 36/37] qemu-iotests: Test qcow2 over file image creation with QMP Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 37/37] qemu-iotests: Test ssh image creation over QMP Kevin Wolf
2018-03-07 19:38 ` [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 no-reply
2018-03-08 10:21 ` Daniel P. Berrangé
2018-03-08 11:25   ` Kevin Wolf

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=20180307185946.29366-29-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=eblake@redhat.com \
    --cc=jcody@redhat.com \
    --cc=jdurgin@redhat.com \
    --cc=mitake.hitoshi@lab.ntt.co.jp \
    --cc=mreitz@redhat.com \
    --cc=namei.unix@gmail.com \
    --cc=pkrempa@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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).