From nobody Fri Oct 24 09:45:23 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 1519415866454701.7926205585861; Fri, 23 Feb 2018 11:57:46 -0800 (PST) Received: from localhost ([::1]:46899 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1epJTU-0002j0-Qm for importer@patchew.org; Fri, 23 Feb 2018 14:57:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50457) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1epIze-0001FH-5t for qemu-devel@nongnu.org; Fri, 23 Feb 2018 14:26:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1epIzc-0005Cz-QR for qemu-devel@nongnu.org; Fri, 23 Feb 2018 14:26:54 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:33928 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 1epIzZ-00055o-0o; Fri, 23 Feb 2018 14:26:49 -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 65C0DEAEB8; Fri, 23 Feb 2018 19:26:48 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-118.ams2.redhat.com [10.36.117.118]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9B112024CAC; Fri, 23 Feb 2018 19:26:46 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Fri, 23 Feb 2018 20:25:40 +0100 Message-Id: <20180223192549.26666-28-kwolf@redhat.com> In-Reply-To: <20180223192549.26666-1-kwolf@redhat.com> References: <20180223192549.26666-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]); Fri, 23 Feb 2018 19:26:48 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Fri, 23 Feb 2018 19:26:48 +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 v3 27/36] sheepdog: QAPIfy "redundancy" 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 "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 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