From nobody Fri Oct 24 22:13:28 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519222278856427.2097048135645; Wed, 21 Feb 2018 06:11:18 -0800 (PST) Received: from localhost ([::1]:32815 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eoV78-0006Nz-0u for importer@patchew.org; Wed, 21 Feb 2018 09:11:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38497) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eoUrs-0001Px-9t for qemu-devel@nongnu.org; Wed, 21 Feb 2018 08:55:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eoUrp-00035F-Mj for qemu-devel@nongnu.org; Wed, 21 Feb 2018 08:55:32 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:33036 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eoUrk-00032U-8F; Wed, 21 Feb 2018 08:55:24 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B94A8FB674; Wed, 21 Feb 2018 13:55:23 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-57.ams2.redhat.com [10.36.117.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A7E62024CAA; Wed, 21 Feb 2018 13:55:22 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Wed, 21 Feb 2018 14:53:55 +0100 Message-Id: <20180221135404.27598-28-kwolf@redhat.com> In-Reply-To: <20180221135404.27598-1-kwolf@redhat.com> References: <20180221135404.27598-1-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Wed, 21 Feb 2018 13:55:23 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Wed, 21 Feb 2018 13:55:23 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'kwolf@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 27/36] sheepdog: QAPIfy "redundacy" create option X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jdurgin@redhat.com, pkrempa@redhat.com, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, namei.unix@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The "redundacy" 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 Reviewed-by: Max Reitz --- 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 085b791303..2b249c9e3d 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3467,6 +3467,51 @@ '*cluster-size' : 'size' } } =20 ## +# @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 3c3becf94d..22df2ba9d0 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1882,6 +1882,48 @@ out_with_err_set: return ret; } =20 +static int parse_redundancy(BDRVSheepdogState *s, SheepdogRedundancy *opt) +{ + struct SheepdogInode *inode =3D &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 =3D 0; + inode->nr_copies =3D opt->u.full.copies; + return 0; + + case SHEEPDOG_REDUNDANCY_TYPE_ERASURE_CODED: + { + int64_t copy =3D opt->u.erasure_coded.data_strips; + int64_t parity =3D opt->u.erasure_coded.parity_strips; + + if (copy !=3D 2 && copy !=3D 4 && copy !=3D 8 && copy !=3D 16) { + return -EINVAL; + } + + if (parity >=3D 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 =3D ((copy / 2) << 4) + parity; + inode->nr_copies =3D 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=3Dx:y (x must be one of {2,4,8,16} and 1 <=3D y < SD_EC_M= AX_STRIP) */ -static int parse_redundancy(BDRVSheepdogState *s, const char *opt) +static int parse_redundancy_str(BDRVSheepdogState *s, const char *opt) { - struct SheepdogInode *inode =3D &s->inode; + struct SheepdogRedundancy redundancy; const char *n1, *n2; long copy, parity; char p[10]; + int ret; =20 pstrcpy(p, sizeof(p), opt); n1 =3D strtok(p, ":"); @@ -1907,35 +1950,32 @@ static int parse_redundancy(BDRVSheepdogState *s, c= onst char *opt) return -EINVAL; } =20 - copy =3D 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 =3D 0; - inode->nr_copies =3D copy; - return 0; + ret =3D qemu_strtol(n1, NULL, 10, ©); + if (ret < 0) { + return ret; } =20 - if (copy !=3D 2 && copy !=3D 4 && copy !=3D 8 && copy !=3D 16) { - return -EINVAL; - } + if (!n2) { + redundancy =3D (SheepdogRedundancy) { + .type =3D SHEEPDOG_REDUNDANCY_TYPE_FULL, + .u.full.copies =3D copy, + }; + } else { + ret =3D qemu_strtol(n2, NULL, 10, &parity); + if (ret < 0) { + return ret; + } =20 - parity =3D strtol(n2, NULL, 10); - /* FIXME fix error checking by switching to qemu_strtol() */ - if (parity >=3D SD_EC_MAX_STRIP || parity < 1) { - return -EINVAL; + redundancy =3D (SheepdogRedundancy) { + .type =3D SHEEPDOG_REDUNDANCY_TYPE_ERASURE_CODED, + .u.erasure_coded =3D { + .data_strips =3D copy, + .parity_strips =3D parity, + }, + }; } =20 - /* - * 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 =3D ((copy / 2) << 4) + parity; - inode->nr_copies =3D copy + parity; - - return 0; + return parse_redundancy(s, &redundancy); } =20 static int parse_block_size_shift(BDRVSheepdogState *s, QemuOpts *opt) @@ -2007,7 +2047,7 @@ static int sd_create(const char *filename, QemuOpts *= opts, g_free(buf); buf =3D qemu_opt_get_del(opts, BLOCK_OPT_REDUNDANCY); if (buf) { - ret =3D parse_redundancy(s, buf); + ret =3D parse_redundancy_str(s, buf); if (ret < 0) { error_setg(errp, "Invalid redundancy mode: '%s'", buf); goto out; --=20 2.13.6