From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491293824855.4489033401679; Thu, 2 Mar 2017 13:48:13 -0800 (PST) Received: from localhost ([::1]:54826 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYa4-00082H-IX for importer@patchew.org; Thu, 02 Mar 2017 16:48:12 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35078) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWF-0005Vu-Vf for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002pU-4r for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:34684) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYW9-0002jv-7T; Thu, 02 Mar 2017 16:44:09 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4F8A13D94F; Thu, 2 Mar 2017 21:44:09 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 16D0E15A80; Thu, 2 Mar 2017 21:44:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 779FB113864A; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:52 +0100 Message-Id: <1488491046-2549-2-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 02 Mar 2017 21:44:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 01/15] sheepdog: Defuse time bomb in sd_open() error handling 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" When qemu_opts_absorb_qdict() fails, sd_open() closes stdin, because sd->fd is still zero. Fortunately, qemu_opts_absorb_qdict() can't fail, because: 1. it only fails when qemu_opt_parse() fails, and 2. the only member of runtime_opts.desc[] is a QEMU_OPT_STRING, and 3. qemu_opt_parse() can't fail for QEMU_OPT_STRING. Defuse this ticking time bomb by jumping behind the file descriptor cleanup on error. Also do that for the error paths where sd->fd is still -1. The file descriptor cleanup happens to do nothing then, but let's not rely on that here. Signed-off-by: Markus Armbruster --- block/sheepdog.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 860ba61..fe15723 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1392,7 +1392,7 @@ static int sd_open(BlockDriverState *bs, QDict *optio= ns, int flags, if (local_err) { error_propagate(errp, local_err); ret =3D -EINVAL; - goto out; + goto out_no_fd; } =20 filename =3D qemu_opt_get(opts, "filename"); @@ -1412,12 +1412,12 @@ static int sd_open(BlockDriverState *bs, QDict *opt= ions, int flags, } if (ret < 0) { error_setg(errp, "Can't parse filename"); - goto out; + goto out_no_fd; } s->fd =3D get_sheep_fd(s, errp); if (s->fd < 0) { ret =3D s->fd; - goto out; + goto out_no_fd; } =20 ret =3D find_vdi_name(s, vdi, snapid, tag, &vid, true, errp); @@ -1472,6 +1472,7 @@ out: if (s->fd >=3D 0) { closesocket(s->fd); } +out_no_fd: qemu_opts_del(opts); g_free(buf); return ret; --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491274798580.5112516646842; Thu, 2 Mar 2017 13:47:54 -0800 (PST) Received: from localhost ([::1]:54824 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYZl-0007ib-0d for importer@patchew.org; Thu, 02 Mar 2017 16:47:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35089) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWG-0005WK-4P for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002pw-Ca for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:34700) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYW9-0002kU-JT; Thu, 02 Mar 2017 16:44:09 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9ABC33D95E; Thu, 2 Mar 2017 21:44:09 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li8QQ002889 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:09 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 7A38F113864D; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:53 +0100 Message-Id: <1488491046-2549-3-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 02 Mar 2017 21:44:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 02/15] sheepdog: Fix error handling in sd_snapshot_delete() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" As a bdrv_snapshot_delete() method, sd_snapshot_delete() must set an error and return negative errno on failure. It sometimes returns -1, and sometimes neglects to set an error. It also prints error messages with error_report(). Fix all that. Moreover, its handling of an attempt to delete an nonexistent snapshot is wrong: it error_report()s and succeeds. Fix it to set an error and return -ENOENT instead. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/sheepdog.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index fe15723..e4e5345 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2406,18 +2406,15 @@ out: =20 #define NR_BATCHED_DISCARD 128 =20 -static bool remove_objects(BDRVSheepdogState *s) +static int remove_objects(BDRVSheepdogState *s, Error **errp) { int fd, i =3D 0, nr_objs =3D 0; - Error *local_err =3D NULL; int ret =3D 0; - bool result =3D true; SheepdogInode *inode =3D &s->inode; =20 - fd =3D connect_to_sdog(s, &local_err); + fd =3D connect_to_sdog(s, errp); if (fd < 0) { - error_report_err(local_err); - return false; + return fd; } =20 nr_objs =3D count_data_objs(inode); @@ -2447,15 +2444,14 @@ static bool remove_objects(BDRVSheepdogState *s) data_vdi_id[start_idx]), false, s->cache_flags); if (ret < 0) { - error_report("failed to discard snapshot inode."); - result =3D false; + error_setg(errp, "failed to discard snapshot inode."); goto out; } } =20 out: closesocket(fd); - return result; + return ret; } =20 static int sd_snapshot_delete(BlockDriverState *bs, @@ -2465,7 +2461,6 @@ static int sd_snapshot_delete(BlockDriverState *bs, { unsigned long snap_id =3D 0; char snap_tag[SD_MAX_VDI_TAG_LEN]; - Error *local_err =3D NULL; int fd, ret; char buf[SD_MAX_VDI_LEN + SD_MAX_VDI_TAG_LEN]; BDRVSheepdogState *s =3D bs->opaque; @@ -2478,8 +2473,9 @@ static int sd_snapshot_delete(BlockDriverState *bs, }; SheepdogVdiRsp *rsp =3D (SheepdogVdiRsp *)&hdr; =20 - if (!remove_objects(s)) { - return -1; + ret =3D remove_objects(s, errp); + if (ret) { + return ret; } =20 memset(buf, 0, sizeof(buf)); @@ -2500,35 +2496,36 @@ static int sd_snapshot_delete(BlockDriverState *bs, } =20 ret =3D find_vdi_name(s, s->name, snap_id, snap_tag, &vid, true, - &local_err); + errp); if (ret) { return ret; } =20 - fd =3D connect_to_sdog(s, &local_err); + fd =3D connect_to_sdog(s, errp); if (fd < 0) { - error_report_err(local_err); - return -1; + return fd; } =20 ret =3D do_req(fd, s->bs, (SheepdogReq *)&hdr, buf, &wlen, &rlen); closesocket(fd); if (ret) { + error_setg_errno(errp, -ret, "Couldn't send request to server"); return ret; } =20 switch (rsp->result) { case SD_RES_NO_VDI: - error_report("%s was already deleted", s->name); + error_setg(errp, "Can't find the snapshot"); + return -ENOENT; case SD_RES_SUCCESS: break; default: - error_report("%s, %s", sd_strerror(rsp->result), s->name); - return -1; + error_setg(errp, "%s", sd_strerror(rsp->result)); + return -EIO; } =20 - return ret; + return 0; } =20 static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_t= ab) --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491142921407.1674050241395; Thu, 2 Mar 2017 13:45:42 -0800 (PST) Received: from localhost ([::1]:54812 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYXd-0005xS-NO for importer@patchew.org; Thu, 02 Mar 2017 16:45:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35056) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWF-0005Uv-EB for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002q9-FF for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45268) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYW9-0002kN-DO; Thu, 02 Mar 2017 16:44:09 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 76BF3107AB; Thu, 2 Mar 2017 21:44:09 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li8V4014204 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:09 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 7D58A1138650; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:54 +0100 Message-Id: <1488491046-2549-4-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 02 Mar 2017 21:44:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 03/15] sheepdog: Fix error handling sd_create() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" As a bdrv_create() method, sd_create() must set an error and return negative errno on failure. It prints the error instead of setting it when connect_to_sdog() fails. Fix that. While there, return the value of connect_to_sdog() like we do elsewhere, instead of -EIO. No functional change, as connect_to_sdog() returns no other error code. Many more suspicious uses of error_report() and error_report_err() remain in other functions. Left for another day. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Kevin Wolf Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- block/sheepdog.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index e4e5345..abfaa95 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1830,14 +1830,12 @@ static int sd_create(const char *filename, QemuOpts= *opts, if (s->inode.block_size_shift =3D=3D 0) { SheepdogVdiReq hdr; SheepdogClusterRsp *rsp =3D (SheepdogClusterRsp *)&hdr; - Error *local_err =3D NULL; int fd; unsigned int wlen =3D 0, rlen =3D 0; =20 - fd =3D connect_to_sdog(s, &local_err); + fd =3D connect_to_sdog(s, errp); if (fd < 0) { - error_report_err(local_err); - ret =3D -EIO; + ret =3D fd; goto out; } =20 --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 148849129453469.07503177258661; Thu, 2 Mar 2017 13:48:14 -0800 (PST) Received: from localhost ([::1]:54827 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYa5-00082m-CL for importer@patchew.org; Thu, 02 Mar 2017 16:48:13 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35064) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWF-0005V3-HX for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002pP-3R for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38816) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYW9-0002kD-CP; Thu, 02 Mar 2017 16:44:09 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 76CD14E4CD; Thu, 2 Mar 2017 21:44:09 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li8ae012417 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:09 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 806521138657; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:55 +0100 Message-Id: <1488491046-2549-5-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 02 Mar 2017 21:44:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 04/15] sheepdog: Mark sd_snapshot_delete() lossage FIXME 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" sd_snapshot_delete() should delete the snapshot whose ID matches @snapshot_id and whose name matches @name. But that's not what it does. If @snapshot_id is a valid ID, it deletes the snapshot with that ID, else it deletes the snapshot with that name. It doesn't use @name at all. Add suitable FIXME comments, so someone who actually knows Sheepdog can fix it. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/sheepdog.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/block/sheepdog.c b/block/sheepdog.c index abfaa95..5554f47 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2457,6 +2457,10 @@ static int sd_snapshot_delete(BlockDriverState *bs, const char *name, Error **errp) { + /* + * FIXME should delete the snapshot matching both @snapshot_id and + * @name, but @name not used here + */ unsigned long snap_id =3D 0; char snap_tag[SD_MAX_VDI_TAG_LEN]; int fd, ret; @@ -2481,6 +2485,11 @@ static int sd_snapshot_delete(BlockDriverState *bs, pstrcpy(buf, SD_MAX_VDI_LEN, s->name); ret =3D qemu_strtoul(snapshot_id, NULL, 10, &snap_id); if (ret || snap_id > UINT32_MAX) { + /* + * FIXME Since qemu_strtoul() returns -EINVAL when + * @snapshot_id is null, @snapshot_id is mandatory. Correct + * would be to require at least one of @snapshot_id and @name. + */ error_setg(errp, "Invalid snapshot ID: %s", snapshot_id ? snapshot_id : ""); return -EINVAL; @@ -2489,6 +2498,7 @@ static int sd_snapshot_delete(BlockDriverState *bs, if (snap_id) { hdr.snapid =3D (uint32_t) snap_id; } else { + /* FIXME I suspect we should use @name here */ pstrcpy(snap_tag, sizeof(snap_tag), snapshot_id); pstrcpy(buf + SD_MAX_VDI_LEN, SD_MAX_VDI_TAG_LEN, snap_tag); } --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491126277521.0227969912003; Thu, 2 Mar 2017 13:45:26 -0800 (PST) Received: from localhost ([::1]:54805 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYXN-0005fW-2r for importer@patchew.org; Thu, 02 Mar 2017 16:45:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35154) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWH-0005YH-CK for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWF-0002qr-HD for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38828) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lQ-4D; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3DABF4E4D3; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li97v012427 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8362611386CE; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:56 +0100 Message-Id: <1488491046-2549-6-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 05/15] sheepdog: Fix snapshot ID parsing in _open(), _create, _goto() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" sd_parse_uri() and sd_snapshot_goto() screw up error checking after strtoul(), and truncate long tag names silently. Fix by replacing those parts by new sd_parse_snapid_or_tag(), which checks more carefully. sd_snapshot_delete() also parses snapshot IDs, but is currently too broken for me to touch. Mark TODO. Two calls of strtol() without error checking remain in parse_redundancy(). Mark them FIXME. More silent truncation of configuration strings remains elsewhere. Not marked. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/sheepdog.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 5554f47..deb110e 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -914,6 +914,49 @@ static int get_sheep_fd(BDRVSheepdogState *s, Error **= errp) return fd; } =20 +/* + * Parse numeric snapshot ID in @str + * If @str can't be parsed as number, return false. + * Else, if the number is zero or too large, set *@snapid to zero and + * return true. + * Else, set *@snapid to the number and return true. + */ +static bool sd_parse_snapid(const char *str, uint32_t *snapid) +{ + unsigned long ul; + int ret; + + ret =3D qemu_strtoul(str, NULL, 10, &ul); + if (ret =3D=3D -ERANGE) { + ul =3D ret =3D 0; + } + if (ret) { + return false; + } + if (ul > UINT32_MAX) { + ul =3D 0; + } + + *snapid =3D ul; + return true; +} + +static bool sd_parse_snapid_or_tag(const char *str, + uint32_t *snapid, char tag[]) +{ + if (!sd_parse_snapid(str, snapid)) { + *snapid =3D 0; + if (g_strlcpy(tag, str, SD_MAX_VDI_TAG_LEN) >=3D SD_MAX_VDI_TAG_LE= N) { + return false; + } + } else if (!*snapid) { + return false; + } else { + tag[0] =3D 0; + } + return true; +} + static int sd_parse_uri(BDRVSheepdogState *s, const char *filename, char *vdi, uint32_t *snapid, char *tag) { @@ -965,9 +1008,9 @@ static int sd_parse_uri(BDRVSheepdogState *s, const ch= ar *filename, =20 /* snapshot tag */ if (uri->fragment) { - *snapid =3D strtoul(uri->fragment, NULL, 10); - if (*snapid =3D=3D 0) { - pstrcpy(tag, SD_MAX_VDI_TAG_LEN, uri->fragment); + if (!sd_parse_snapid_or_tag(uri->fragment, snapid, tag)) { + ret =3D -EINVAL; + goto out; } } else { *snapid =3D CURRENT_VDI_ID; /* search current vdi */ @@ -1686,6 +1729,7 @@ static int parse_redundancy(BDRVSheepdogState *s, con= st char *opt) } =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; } @@ -1700,6 +1744,7 @@ static int parse_redundancy(BDRVSheepdogState *s, con= st char *opt) } =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; } @@ -2366,19 +2411,16 @@ static int sd_snapshot_goto(BlockDriverState *bs, c= onst char *snapshot_id) BDRVSheepdogState *old_s; char tag[SD_MAX_VDI_TAG_LEN]; uint32_t snapid =3D 0; - int ret =3D 0; + int ret; + + if (!sd_parse_snapid_or_tag(snapshot_id, &snapid, tag)) { + return -EINVAL; + } =20 old_s =3D g_new(BDRVSheepdogState, 1); =20 memcpy(old_s, s, sizeof(BDRVSheepdogState)); =20 - snapid =3D strtoul(snapshot_id, NULL, 10); - if (snapid) { - tag[0] =3D 0; - } else { - pstrcpy(tag, sizeof(tag), snapshot_id); - } - ret =3D reload_inode(s, snapid, tag); if (ret) { goto out; @@ -2483,6 +2525,7 @@ static int sd_snapshot_delete(BlockDriverState *bs, memset(buf, 0, sizeof(buf)); memset(snap_tag, 0, sizeof(snap_tag)); pstrcpy(buf, SD_MAX_VDI_LEN, s->name); + /* TODO Use sd_parse_snapid() once this mess is cleaned up */ ret =3D qemu_strtoul(snapshot_id, NULL, 10, &snap_id); if (ret || snap_id > UINT32_MAX) { /* @@ -2499,6 +2542,7 @@ static int sd_snapshot_delete(BlockDriverState *bs, hdr.snapid =3D (uint32_t) snap_id; } else { /* FIXME I suspect we should use @name here */ + /* FIXME don't truncate silently */ pstrcpy(snap_tag, sizeof(snap_tag), snapshot_id); pstrcpy(buf + SD_MAX_VDI_LEN, SD_MAX_VDI_TAG_LEN, snap_tag); } --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491139587236.90799669254454; Thu, 2 Mar 2017 13:45:39 -0800 (PST) Received: from localhost ([::1]:54811 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYXa-0005tz-6o for importer@patchew.org; Thu, 02 Mar 2017 16:45:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35084) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWG-0005W1-1C for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002pr-AE for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45276) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWA-0002lG-ST; Thu, 02 Mar 2017 16:44:10 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E8E9580484; Thu, 2 Mar 2017 21:44:10 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AF5BA15A80; Thu, 2 Mar 2017 21:44:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 86B2211386DC; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:57 +0100 Message-Id: <1488491046-2549-7-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 06/15] sheepdog: Don't truncate long VDI name in _open(), _create() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" sd_parse_uri() truncates long VDI names silently. Reject them instead. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- block/sheepdog.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index deb110e..72a52a6 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -985,7 +985,9 @@ static int sd_parse_uri(BDRVSheepdogState *s, const cha= r *filename, ret =3D -EINVAL; goto out; } - pstrcpy(vdi, SD_MAX_VDI_LEN, uri->path + 1); + if (g_strlcpy(vdi, uri->path + 1, SD_MAX_VDI_LEN) >=3D SD_MAX_VDI_LEN)= { + goto out; + } =20 qp =3D query_params_parse(uri->query); if (qp->n > 1 || (s->is_unix && !qp->n) || (!s->is_unix && qp->n)) { --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491428824374.29972244740463; Thu, 2 Mar 2017 13:50:28 -0800 (PST) Received: from localhost ([::1]:54833 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYcF-0001Qx-HA for importer@patchew.org; Thu, 02 Mar 2017 16:50:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35180) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWI-0005Zr-AH for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWG-0002sJ-R5 for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45292) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lW-6l; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C1B91B1750; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li9fi021023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 894FB11385E0; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:58 +0100 Message-Id: <1488491046-2549-8-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 07/15] sheepdog: Report errors in pseudo-filename more usefully 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" Errors in the pseudo-filename are all reported with the same laconic "Can't parse filename" message. Add real error reporting, such as: $ qemu-system-x86_64 --drive driver=3Dsheepdog,filename=3Dsheepdog:/// qemu-system-x86_64: --drive driver=3Dsheepdog,filename=3Dsheepdog:///: = missing file path in URI $ qemu-system-x86_64 --drive driver=3Dsheepdog,filename=3Dsheepgod:///v= di qemu-system-x86_64: --drive driver=3Dsheepdog,filename=3Dsheepgod:///vd= i: URI scheme must be 'sheepdog', 'sheepdog+tcp', or 'sheepdog+unix' $ qemu-system-x86_64 --drive driver=3Dsheepdog,filename=3Dsheepdog+unix= :///vdi?socke=3Dsheepdog.sock qemu-system-x86_64: --drive driver=3Dsheepdog,filename=3Dsheepdog+unix:= ///vdi?socke=3Dsheepdog.sock: unexpected query parameters The code to translate legacy syntax to URI fails to escape URI meta-characters. The new error messages are misleading then. Replace them by the old "Can't parse filename" message. "Internal error" would be more honest. Anyway, no worse than before. Also add a FIXME comment. Signed-off-by: Markus Armbruster Reviewed-by: Kevin Wolf --- block/sheepdog.c | 86 ++++++++++++++++++++++++++++++++++++++--------------= ---- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 72a52a6..ac62225 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -957,16 +957,18 @@ static bool sd_parse_snapid_or_tag(const char *str, return true; } =20 -static int sd_parse_uri(BDRVSheepdogState *s, const char *filename, - char *vdi, uint32_t *snapid, char *tag) +static void sd_parse_uri(BDRVSheepdogState *s, const char *filename, + char *vdi, uint32_t *snapid, char *tag, + Error **errp) { + Error *err =3D NULL; URI *uri; QueryParams *qp =3D NULL; - int ret =3D 0; =20 uri =3D uri_parse(filename); if (!uri) { - return -EINVAL; + error_setg(&err, "invalid URI"); + goto out; } =20 /* transport */ @@ -977,33 +979,46 @@ static int sd_parse_uri(BDRVSheepdogState *s, const c= har *filename, } else if (!strcmp(uri->scheme, "sheepdog+unix")) { s->is_unix =3D true; } else { - ret =3D -EINVAL; + error_setg(&err, "URI scheme must be 'sheepdog', 'sheepdog+tcp'," + " or 'sheepdog+unix'"); goto out; } =20 if (uri->path =3D=3D NULL || !strcmp(uri->path, "/")) { - ret =3D -EINVAL; + error_setg(&err, "missing file path in URI"); goto out; } if (g_strlcpy(vdi, uri->path + 1, SD_MAX_VDI_LEN) >=3D SD_MAX_VDI_LEN)= { + error_setg(&err, "VDI name is too long"); goto out; } =20 qp =3D query_params_parse(uri->query); - if (qp->n > 1 || (s->is_unix && !qp->n) || (!s->is_unix && qp->n)) { - ret =3D -EINVAL; - goto out; - } =20 if (s->is_unix) { /* sheepdog+unix:///vdiname?socket=3Dpath */ - if (uri->server || uri->port || strcmp(qp->p[0].name, "socket")) { - ret =3D -EINVAL; + if (uri->server || uri->port) { + error_setg(&err, "URI scheme %s doesn't accept a server addres= s", + uri->scheme); + goto out; + } + if (!qp->n) { + error_setg(&err, + "URI scheme %s requires query parameter 'socket'", + uri->scheme); + goto out; + } + if (qp->n !=3D 1 || strcmp(qp->p[0].name, "socket")) { + error_setg(&err, "unexpected query parameters"); goto out; } s->host_spec =3D g_strdup(qp->p[0].value); } else { /* sheepdog[+tcp]://[host:port]/vdiname */ + if (qp->n) { + error_setg(&err, "unexpected query parameters"); + goto out; + } s->host_spec =3D g_strdup_printf("%s:%d", uri->server ?: SD_DEFAUL= T_ADDR, uri->port ?: SD_DEFAULT_PORT); } @@ -1011,7 +1026,8 @@ static int sd_parse_uri(BDRVSheepdogState *s, const c= har *filename, /* snapshot tag */ if (uri->fragment) { if (!sd_parse_snapid_or_tag(uri->fragment, snapid, tag)) { - ret =3D -EINVAL; + error_setg(&err, "'%s' is not a valid snapshot ID", + uri->fragment); goto out; } } else { @@ -1019,11 +1035,11 @@ static int sd_parse_uri(BDRVSheepdogState *s, const= char *filename, } =20 out: + error_propagate(errp, err); if (qp) { query_params_free(qp); } uri_free(uri); - return ret; } =20 /* @@ -1043,12 +1059,14 @@ out: * You can run VMs outside the Sheepdog cluster by specifying * `hostname' and `port' (experimental). */ -static int parse_vdiname(BDRVSheepdogState *s, const char *filename, - char *vdi, uint32_t *snapid, char *tag) +static void parse_vdiname(BDRVSheepdogState *s, const char *filename, + char *vdi, uint32_t *snapid, char *tag, + Error **errp) { + Error *err =3D NULL; char *p, *q, *uri; const char *host_spec, *vdi_spec; - int nr_sep, ret; + int nr_sep; =20 strstart(filename, "sheepdog:", &filename); p =3D q =3D g_strdup(filename); @@ -1083,12 +1101,23 @@ static int parse_vdiname(BDRVSheepdogState *s, cons= t char *filename, =20 uri =3D g_strdup_printf("sheepdog://%s/%s", host_spec, vdi_spec); =20 - ret =3D sd_parse_uri(s, uri, vdi, snapid, tag); + /* + * FIXME We to escape URI meta-characters, e.g. "x?y=3Dz" + * produces "sheepdog://x?y=3Dz". Because of that ... + */ + sd_parse_uri(s, uri, vdi, snapid, tag, &err); + if (err) { + /* + * ... this can fail, but the error message is misleading. + * Replace it by the traditional useless one until the + * escaping is fixed. + */ + error_free(err); + error_setg(errp, "Can't parse filename"); + } =20 g_free(q); g_free(uri); - - return ret; } =20 static int find_vdi_name(BDRVSheepdogState *s, const char *filename, @@ -1451,12 +1480,12 @@ static int sd_open(BlockDriverState *bs, QDict *opt= ions, int flags, memset(tag, 0, sizeof(tag)); =20 if (strstr(filename, "://")) { - ret =3D sd_parse_uri(s, filename, vdi, &snapid, tag); + sd_parse_uri(s, filename, vdi, &snapid, tag, &local_err); } else { - ret =3D parse_vdiname(s, filename, vdi, &snapid, tag); + parse_vdiname(s, filename, vdi, &snapid, tag, &local_err); } - if (ret < 0) { - error_setg(errp, "Can't parse filename"); + if (local_err) { + error_propagate(errp, local_err); goto out_no_fd; } s->fd =3D get_sheep_fd(s, errp); @@ -1785,6 +1814,7 @@ static int parse_block_size_shift(BDRVSheepdogState *= s, QemuOpts *opt) static int sd_create(const char *filename, QemuOpts *opts, Error **errp) { + Error *err =3D NULL; int ret =3D 0; uint32_t vid =3D 0; char *backing_file =3D NULL; @@ -1799,12 +1829,12 @@ static int sd_create(const char *filename, QemuOpts= *opts, =20 memset(tag, 0, sizeof(tag)); if (strstr(filename, "://")) { - ret =3D sd_parse_uri(s, filename, s->name, &snapid, tag); + sd_parse_uri(s, filename, s->name, &snapid, tag, &err); } else { - ret =3D parse_vdiname(s, filename, s->name, &snapid, tag); + parse_vdiname(s, filename, s->name, &snapid, tag, &err); } - if (ret < 0) { - error_setg(errp, "Can't parse filename"); + if (err) { + error_propagate(errp, err); goto out; } =20 --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491721825986.0695981551509; Thu, 2 Mar 2017 13:55:21 -0800 (PST) Received: from localhost ([::1]:54868 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYgx-0005lG-L0 for importer@patchew.org; Thu, 02 Mar 2017 16:55:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35160) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWH-0005Yr-Lm for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWG-0002s0-BO for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55506) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lU-6T; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3CFA361B8A; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li9HQ002898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8C19311385E1; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:43:59 +0100 Message-Id: <1488491046-2549-9-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 08/15] sheepdog: Use SocketAddress and socket_connect() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" sd_parse_uri() builds a string from host and port parts for inet_connect(). inet_connect() parses it into host, port and options. Whether this gets exactly the same host, port and no options for all inputs is not obvious. Cut out the string middleman and build a SocketAddress for socket_connect() instead. Signed-off-by: Markus Armbruster Reviewed-by: Kevin Wolf --- block/sheepdog.c | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index ac62225..43317b3 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -374,8 +374,7 @@ struct BDRVSheepdogState { uint32_t cache_flags; bool discard_supported; =20 - char *host_spec; - bool is_unix; + SocketAddress *addr; int fd; =20 CoMutex lock; @@ -532,16 +531,12 @@ static int connect_to_sdog(BDRVSheepdogState *s, Erro= r **errp) { int fd; =20 - if (s->is_unix) { - fd =3D unix_connect(s->host_spec, errp); - } else { - fd =3D inet_connect(s->host_spec, errp); + fd =3D socket_connect(s->addr, errp, NULL, NULL); =20 - if (fd >=3D 0) { - int ret =3D socket_set_nodelay(fd); - if (ret < 0) { - error_report("%s", strerror(errno)); - } + if (s->addr->type =3D=3D SOCKET_ADDRESS_KIND_INET && fd >=3D 0) { + int ret =3D socket_set_nodelay(fd); + if (ret < 0) { + error_report("%s", strerror(errno)); } } =20 @@ -820,8 +815,7 @@ static void coroutine_fn aio_read_response(void *opaque) case AIOCB_DISCARD_OBJ: switch (rsp.result) { case SD_RES_INVALID_PARMS: - error_report("sheep(%s) doesn't support discard command", - s->host_spec); + error_report("server doesn't support discard command"); rsp.result =3D SD_RES_SUCCESS; s->discard_supported =3D false; break; @@ -962,8 +956,10 @@ static void sd_parse_uri(BDRVSheepdogState *s, const c= har *filename, Error **errp) { Error *err =3D NULL; - URI *uri; QueryParams *qp =3D NULL; + SocketAddress *addr =3D NULL; + bool is_unix; + URI *uri; =20 uri =3D uri_parse(filename); if (!uri) { @@ -973,11 +969,11 @@ static void sd_parse_uri(BDRVSheepdogState *s, const = char *filename, =20 /* transport */ if (!strcmp(uri->scheme, "sheepdog")) { - s->is_unix =3D false; + is_unix =3D false; } else if (!strcmp(uri->scheme, "sheepdog+tcp")) { - s->is_unix =3D false; + is_unix =3D false; } else if (!strcmp(uri->scheme, "sheepdog+unix")) { - s->is_unix =3D true; + is_unix =3D true; } else { error_setg(&err, "URI scheme must be 'sheepdog', 'sheepdog+tcp'," " or 'sheepdog+unix'"); @@ -994,8 +990,9 @@ static void sd_parse_uri(BDRVSheepdogState *s, const ch= ar *filename, } =20 qp =3D query_params_parse(uri->query); + addr =3D g_new0(SocketAddress, 1); =20 - if (s->is_unix) { + if (is_unix) { /* sheepdog+unix:///vdiname?socket=3Dpath */ if (uri->server || uri->port) { error_setg(&err, "URI scheme %s doesn't accept a server addres= s", @@ -1012,15 +1009,20 @@ static void sd_parse_uri(BDRVSheepdogState *s, cons= t char *filename, error_setg(&err, "unexpected query parameters"); goto out; } - s->host_spec =3D g_strdup(qp->p[0].value); + addr->type =3D SOCKET_ADDRESS_KIND_UNIX; + addr->u.q_unix.data =3D g_new0(UnixSocketAddress, 1); + addr->u.q_unix.data->path =3D g_strdup(qp->p[0].value); } else { /* sheepdog[+tcp]://[host:port]/vdiname */ if (qp->n) { error_setg(&err, "unexpected query parameters"); goto out; } - s->host_spec =3D g_strdup_printf("%s:%d", uri->server ?: SD_DEFAUL= T_ADDR, - uri->port ?: SD_DEFAULT_PORT); + addr->type =3D SOCKET_ADDRESS_KIND_INET; + addr->u.inet.data =3D g_new0(InetSocketAddress, 1); + addr->u.inet.data->host =3D g_strdup(uri->server ?: SD_DEFAULT_ADD= R); + addr->u.inet.data->port =3D g_strdup_printf("%d", + uri->port ?: SD_DEFAULT_PORT); } =20 /* snapshot tag */ @@ -1035,7 +1037,12 @@ static void sd_parse_uri(BDRVSheepdogState *s, const= char *filename, } =20 out: - error_propagate(errp, err); + if (err) { + error_propagate(errp, err); + qapi_free_SocketAddress(addr); + } else { + s->addr =3D addr; + } if (qp) { query_params_free(qp); } @@ -1998,7 +2005,7 @@ static void sd_close(BlockDriverState *bs) aio_set_fd_handler(bdrv_get_aio_context(bs), s->fd, false, NULL, NULL, NULL, NULL); closesocket(s->fd); - g_free(s->host_spec); + qapi_free_SocketAddress(s->addr); } =20 static int64_t sd_getlength(BlockDriverState *bs) --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491454198867.303735826985; Thu, 2 Mar 2017 13:50:54 -0800 (PST) Received: from localhost ([::1]:54839 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYcf-0001ha-0n for importer@patchew.org; Thu, 02 Mar 2017 16:50:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35226) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWL-0005e3-HH for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWI-0002th-PU for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52486) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002ln-K8; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B428280F63; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li9rT015610 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8F1A711385ED; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:00 +0100 Message-Id: <1488491046-2549-10-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 09/15] sheepdog: Implement bdrv_parse_filename() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" This permits configuration with driver-specific options in addition to pseudo-filename parsed as URI. For instance, --drive driver=3Dsheepdog,host=3Dfido,vdi=3Ddolly instead of --drive driver=3Dsheepdog,file=3Dsheepdog://fido/dolly It's also a first step towards supporting blockdev-add. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/sheepdog.c | 233 +++++++++++++++++++++++++++++++++++++++++----------= ---- 1 file changed, 176 insertions(+), 57 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 43317b3..087c4d6 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -14,6 +14,8 @@ =20 #include "qemu/osdep.h" #include "qapi/error.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qint.h" #include "qemu/uri.h" #include "qemu/error-report.h" #include "qemu/sockets.h" @@ -526,6 +528,25 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheep= dogState *s, QLIST_INSERT_HEAD(&s->inflight_aiocb_head, acb, aiocb_siblings); } =20 +static SocketAddress *sd_socket_address(const char *path, + const char *host, const char *port) +{ + SocketAddress *addr =3D g_new0(SocketAddress, 1); + + if (path) { + addr->type =3D SOCKET_ADDRESS_KIND_UNIX; + addr->u.q_unix.data =3D g_new0(UnixSocketAddress, 1); + addr->u.q_unix.data->path =3D g_strdup(path); + } else { + addr->type =3D SOCKET_ADDRESS_KIND_INET; + addr->u.inet.data =3D g_new0(InetSocketAddress, 1); + addr->u.inet.data->host =3D g_strdup(host ?: SD_DEFAULT_ADDR); + addr->u.inet.data->port =3D g_strdup(port ?: stringify(SD_DEFAULT_= PORT)); + } + + return addr; +} + /* Return -EIO in case of error, file descriptor on success */ static int connect_to_sdog(BDRVSheepdogState *s, Error **errp) { @@ -951,17 +972,37 @@ static bool sd_parse_snapid_or_tag(const char *str, return true; } =20 -static void sd_parse_uri(BDRVSheepdogState *s, const char *filename, - char *vdi, uint32_t *snapid, char *tag, +typedef struct { + const char *path; /* non-null iff transport is tcp */ + const char *host; /* valid when transport is tcp */ + int port; /* valid when transport is tcp */ + char vdi[SD_MAX_VDI_LEN]; + char tag[SD_MAX_VDI_TAG_LEN]; + uint32_t snap_id; + /* Remainder is only for sd_config_done() */ + URI *uri; + QueryParams *qp; +} SheepdogConfig; + +static void sd_config_done(SheepdogConfig *cfg) +{ + if (cfg->qp) { + query_params_free(cfg->qp); + } + uri_free(cfg->uri); +} + +static void sd_parse_uri(SheepdogConfig *cfg, const char *filename, Error **errp) { Error *err =3D NULL; QueryParams *qp =3D NULL; - SocketAddress *addr =3D NULL; bool is_unix; URI *uri; =20 - uri =3D uri_parse(filename); + memset(cfg, 0, sizeof(*cfg)); + + cfg->uri =3D uri =3D uri_parse(filename); if (!uri) { error_setg(&err, "invalid URI"); goto out; @@ -984,13 +1025,13 @@ static void sd_parse_uri(BDRVSheepdogState *s, const= char *filename, error_setg(&err, "missing file path in URI"); goto out; } - if (g_strlcpy(vdi, uri->path + 1, SD_MAX_VDI_LEN) >=3D SD_MAX_VDI_LEN)= { + if (g_strlcpy(cfg->vdi, uri->path + 1, SD_MAX_VDI_LEN) + >=3D SD_MAX_VDI_LEN) { error_setg(&err, "VDI name is too long"); goto out; } =20 - qp =3D query_params_parse(uri->query); - addr =3D g_new0(SocketAddress, 1); + cfg->qp =3D qp =3D query_params_parse(uri->query); =20 if (is_unix) { /* sheepdog+unix:///vdiname?socket=3Dpath */ @@ -1009,44 +1050,34 @@ static void sd_parse_uri(BDRVSheepdogState *s, cons= t char *filename, error_setg(&err, "unexpected query parameters"); goto out; } - addr->type =3D SOCKET_ADDRESS_KIND_UNIX; - addr->u.q_unix.data =3D g_new0(UnixSocketAddress, 1); - addr->u.q_unix.data->path =3D g_strdup(qp->p[0].value); + cfg->path =3D qp->p[0].value; } else { /* sheepdog[+tcp]://[host:port]/vdiname */ if (qp->n) { error_setg(&err, "unexpected query parameters"); goto out; } - addr->type =3D SOCKET_ADDRESS_KIND_INET; - addr->u.inet.data =3D g_new0(InetSocketAddress, 1); - addr->u.inet.data->host =3D g_strdup(uri->server ?: SD_DEFAULT_ADD= R); - addr->u.inet.data->port =3D g_strdup_printf("%d", - uri->port ?: SD_DEFAULT_PORT); + cfg->host =3D uri->server; + cfg->port =3D uri->port; } =20 /* snapshot tag */ if (uri->fragment) { - if (!sd_parse_snapid_or_tag(uri->fragment, snapid, tag)) { + if (!sd_parse_snapid_or_tag(uri->fragment, + &cfg->snap_id, cfg->tag)) { error_setg(&err, "'%s' is not a valid snapshot ID", uri->fragment); goto out; } } else { - *snapid =3D CURRENT_VDI_ID; /* search current vdi */ + cfg->snap_id =3D CURRENT_VDI_ID; /* search current vdi */ } =20 out: if (err) { error_propagate(errp, err); - qapi_free_SocketAddress(addr); - } else { - s->addr =3D addr; + sd_config_done(cfg); } - if (qp) { - query_params_free(qp); - } - uri_free(uri); } =20 /* @@ -1066,8 +1097,7 @@ out: * You can run VMs outside the Sheepdog cluster by specifying * `hostname' and `port' (experimental). */ -static void parse_vdiname(BDRVSheepdogState *s, const char *filename, - char *vdi, uint32_t *snapid, char *tag, +static void parse_vdiname(SheepdogConfig *cfg, const char *filename, Error **errp) { Error *err =3D NULL; @@ -1112,7 +1142,7 @@ static void parse_vdiname(BDRVSheepdogState *s, const= char *filename, * FIXME We to escape URI meta-characters, e.g. "x?y=3Dz" * produces "sheepdog://x?y=3Dz". Because of that ... */ - sd_parse_uri(s, uri, vdi, snapid, tag, &err); + sd_parse_uri(cfg, uri, &err); if (err) { /* * ... this can fail, but the error message is misleading. @@ -1127,6 +1157,43 @@ static void parse_vdiname(BDRVSheepdogState *s, cons= t char *filename, g_free(uri); } =20 +static void sd_parse_filename(const char *filename, QDict *options, + Error **errp) +{ + Error *err =3D NULL; + SheepdogConfig cfg; + char buf[32]; + + if (strstr(filename, "://")) { + sd_parse_uri(&cfg, filename, &err); + } else { + parse_vdiname(&cfg, filename, &err); + } + if (err) { + error_propagate(errp, err); + return; + } + + if (cfg.host) { + qdict_set_default_str(options, "host", cfg.host); + } + if (cfg.port) { + snprintf(buf, sizeof(buf), "%d", cfg.port); + qdict_set_default_str(options, "port", buf); + } + if (cfg.path) { + qdict_set_default_str(options, "path", cfg.path); + } + qdict_set_default_str(options, "vdi", cfg.vdi); + qdict_set_default_str(options, "tag", cfg.tag); + if (cfg.snap_id) { + snprintf(buf, sizeof(buf), "%d", cfg.snap_id); + qdict_set_default_str(options, "snap-id", buf); + } + + sd_config_done(&cfg); +} + static int find_vdi_name(BDRVSheepdogState *s, const char *filename, uint32_t snapid, const char *tag, uint32_t *vid, bool lock, Error **errp) @@ -1438,15 +1505,33 @@ static void sd_attach_aio_context(BlockDriverState = *bs, co_read_response, NULL, NULL, s); } =20 -/* TODO Convert to fine grained options */ static QemuOptsList runtime_opts =3D { .name =3D "sheepdog", .head =3D QTAILQ_HEAD_INITIALIZER(runtime_opts.head), .desc =3D { { - .name =3D "filename", + .name =3D "host", + .type =3D QEMU_OPT_STRING, + }, + { + .name =3D "port", + .type =3D QEMU_OPT_STRING, + }, + { + .name =3D "path", + .type =3D QEMU_OPT_STRING, + }, + { + .name =3D "vdi", + .type =3D QEMU_OPT_STRING, + }, + { + .name =3D "snap-id", + .type =3D QEMU_OPT_NUMBER, + }, + { + .name =3D "tag", .type =3D QEMU_OPT_STRING, - .help =3D "URL to the sheepdog image", }, { /* end of list */ } }, @@ -1458,12 +1543,11 @@ static int sd_open(BlockDriverState *bs, QDict *opt= ions, int flags, int ret, fd; uint32_t vid =3D 0; BDRVSheepdogState *s =3D bs->opaque; - char vdi[SD_MAX_VDI_LEN], tag[SD_MAX_VDI_TAG_LEN]; - uint32_t snapid; + const char *host, *port, *path, *vdi, *snap_id_str, *tag; + uint64_t snap_id; char *buf =3D NULL; QemuOpts *opts; Error *local_err =3D NULL; - const char *filename; =20 s->bs =3D bs; s->aio_context =3D bdrv_get_aio_context(bs); @@ -1476,32 +1560,63 @@ static int sd_open(BlockDriverState *bs, QDict *opt= ions, int flags, goto out_no_fd; } =20 - filename =3D qemu_opt_get(opts, "filename"); + host =3D qemu_opt_get(opts, "host"); + port =3D qemu_opt_get(opts, "port"); + path =3D qemu_opt_get(opts, "path"); + vdi =3D qemu_opt_get(opts, "vdi"); + snap_id_str =3D qemu_opt_get(opts, "snap-id"); + snap_id =3D qemu_opt_get_number(opts, "snap-id", CURRENT_VDI_ID); + tag =3D qemu_opt_get(opts, "tag"); + + if ((host || port) && path) { + error_setg(errp, "can't use 'path' together with 'host' or 'port'"= ); + ret =3D -EINVAL; + goto out_no_fd; + } + + if (!vdi) { + error_setg(errp, "parameter 'vdi' is missing"); + ret =3D -EINVAL; + goto out_no_fd; + } + if (strlen(vdi) >=3D SD_MAX_VDI_LEN) { + error_setg(errp, "value of parameter 'vdi' is too long"); + ret =3D -EINVAL; + goto out_no_fd; + } + + if (snap_id > UINT32_MAX) { + snap_id =3D 0; + } + if (snap_id_str && !snap_id) { + error_setg(errp, "'snap-id=3D%s' is not a valid snapshot ID", + snap_id_str); + ret =3D -EINVAL; + goto out_no_fd; + } + + if (!tag) { + tag =3D ""; + } + if (tag && strlen(tag) >=3D SD_MAX_VDI_TAG_LEN) { + error_setg(errp, "value of parameter 'tag' is too long"); + ret =3D -EINVAL; + goto out_no_fd; + } + + s->addr =3D sd_socket_address(path, host, port); =20 QLIST_INIT(&s->inflight_aio_head); QLIST_INIT(&s->failed_aio_head); QLIST_INIT(&s->inflight_aiocb_head); - s->fd =3D -1; =20 - memset(vdi, 0, sizeof(vdi)); - memset(tag, 0, sizeof(tag)); - - if (strstr(filename, "://")) { - sd_parse_uri(s, filename, vdi, &snapid, tag, &local_err); - } else { - parse_vdiname(s, filename, vdi, &snapid, tag, &local_err); - } - if (local_err) { - error_propagate(errp, local_err); - goto out_no_fd; - } s->fd =3D get_sheep_fd(s, errp); if (s->fd < 0) { ret =3D s->fd; goto out_no_fd; } =20 - ret =3D find_vdi_name(s, vdi, snapid, tag, &vid, true, errp); + ret =3D find_vdi_name(s, vdi, (uint32_t)snap_id, tag, &vid, true, errp= ); if (ret) { goto out; } @@ -1516,7 +1631,7 @@ static int sd_open(BlockDriverState *bs, QDict *optio= ns, int flags, } s->discard_supported =3D true; =20 - if (snapid || tag[0] !=3D '\0') { + if (snap_id || tag[0]) { DPRINTF("%" PRIx32 " snapshot inode was open.\n", vid); s->is_snapshot =3D true; } @@ -1827,24 +1942,28 @@ static int sd_create(const char *filename, QemuOpts= *opts, char *backing_file =3D NULL; char *buf =3D NULL; BDRVSheepdogState *s; - char tag[SD_MAX_VDI_TAG_LEN]; - uint32_t snapid; + SheepdogConfig cfg; uint64_t max_vdi_size; bool prealloc =3D false; =20 s =3D g_new0(BDRVSheepdogState, 1); =20 - memset(tag, 0, sizeof(tag)); if (strstr(filename, "://")) { - sd_parse_uri(s, filename, s->name, &snapid, tag, &err); + sd_parse_uri(&cfg, filename, &err); } else { - parse_vdiname(s, filename, s->name, &snapid, tag, &err); + parse_vdiname(&cfg, filename, &err); } if (err) { error_propagate(errp, err); goto out; } =20 + buf =3D cfg.port ? g_strdup_printf("%d", cfg.port) : NULL; + s->addr =3D sd_socket_address(cfg.path, cfg.host, buf); + g_free(buf); + strcpy(s->name, cfg.vdi); + sd_config_done(&cfg); + s->inode.vdi_size =3D ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_S= IZE, 0), BDRV_SECTOR_SIZE); backing_file =3D qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE); @@ -2921,7 +3040,7 @@ static BlockDriver bdrv_sheepdog =3D { .format_name =3D "sheepdog", .protocol_name =3D "sheepdog", .instance_size =3D sizeof(BDRVSheepdogState), - .bdrv_needs_filename =3D true, + .bdrv_parse_filename =3D sd_parse_filename, .bdrv_file_open =3D sd_open, .bdrv_reopen_prepare =3D sd_reopen_prepare, .bdrv_reopen_commit =3D sd_reopen_commit, @@ -2957,7 +3076,7 @@ static BlockDriver bdrv_sheepdog_tcp =3D { .format_name =3D "sheepdog", .protocol_name =3D "sheepdog+tcp", .instance_size =3D sizeof(BDRVSheepdogState), - .bdrv_needs_filename =3D true, + .bdrv_parse_filename =3D sd_parse_filename, .bdrv_file_open =3D sd_open, .bdrv_reopen_prepare =3D sd_reopen_prepare, .bdrv_reopen_commit =3D sd_reopen_commit, @@ -2993,7 +3112,7 @@ static BlockDriver bdrv_sheepdog_unix =3D { .format_name =3D "sheepdog", .protocol_name =3D "sheepdog+unix", .instance_size =3D sizeof(BDRVSheepdogState), - .bdrv_needs_filename =3D true, + .bdrv_parse_filename =3D sd_parse_filename, .bdrv_file_open =3D sd_open, .bdrv_reopen_prepare =3D sd_reopen_prepare, .bdrv_reopen_commit =3D sd_reopen_commit, --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491144024952.7355111755825; Thu, 2 Mar 2017 13:45:44 -0800 (PST) Received: from localhost ([::1]:54813 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYXe-0005xg-QY for importer@patchew.org; Thu, 02 Mar 2017 16:45:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35071) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWF-0005Va-NO for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002q3-GB for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53156) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lP-4R; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 38805C057FA4; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li9Di012429 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 91DD011385F0; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:01 +0100 Message-Id: <1488491046-2549-11-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 10/15] gluster: Drop assumptions on SocketTransport names 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" qemu_gluster_glfs_init() passes the names of QAPI enumeration type SocketTransport to glfs_set_volfile_server(). Works, because they were chosen to match. But the coupling is artificial. Use the appropriate literal strings instead. Signed-off-by: Markus Armbruster Reviewed-by: Niels de Vos --- block/gluster.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 56b4abe..7236d59 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -412,8 +412,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, =20 for (server =3D gconf->server; server; server =3D server->next) { if (server->value->type =3D=3D GLUSTER_TRANSPORT_UNIX) { - ret =3D glfs_set_volfile_server(glfs, - GlusterTransport_lookup[server->value->= type], + ret =3D glfs_set_volfile_server(glfs, "unix", server->value->u.q_unix.path, 0); } else { if (parse_uint_full(server->value->u.tcp.port, &port, 10) < 0 = || @@ -423,8 +422,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, errno =3D EINVAL; goto out; } - ret =3D glfs_set_volfile_server(glfs, - GlusterTransport_lookup[server->value->= type], + ret =3D glfs_set_volfile_server(glfs, "tcp", server->value->u.tcp.host, (int)port); } --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491443810363.7623087766822; Thu, 2 Mar 2017 13:50:43 -0800 (PST) Received: from localhost ([::1]:54834 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYcS-0001bl-LL for importer@patchew.org; Thu, 02 Mar 2017 16:50:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWG-0005WY-87 for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002qP-M4 for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55496) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lO-4x; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 36F6E61B86; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li97R012432 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 964D111385FC; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:02 +0100 Message-Id: <1488491046-2549-12-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 11/15] gluster: Don't duplicate qapi-util.c's qapi_enum_parse() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" Signed-off-by: Markus Armbruster Reviewed-by: Niels de Vos --- block/gluster.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 7236d59..6fbcf9e 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -12,6 +12,7 @@ #include "block/block_int.h" #include "qapi/error.h" #include "qapi/qmp/qerror.h" +#include "qapi/util.h" #include "qemu/uri.h" #include "qemu/error-report.h" #include "qemu/cutils.h" @@ -472,23 +473,6 @@ out: return NULL; } =20 -static int qapi_enum_parse(const char *opt) -{ - int i; - - if (!opt) { - return GLUSTER_TRANSPORT__MAX; - } - - for (i =3D 0; i < GLUSTER_TRANSPORT__MAX; i++) { - if (!strcmp(opt, GlusterTransport_lookup[i])) { - return i; - } - } - - return i; -} - /* * Convert the json formatted command line into qapi. */ @@ -546,16 +530,20 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, =20 ptr =3D qemu_opt_get(opts, GLUSTER_OPT_TYPE); gsconf =3D g_new0(GlusterServer, 1); - gsconf->type =3D qapi_enum_parse(ptr); + gsconf->type =3D qapi_enum_parse(GlusterTransport_lookup, ptr, + GLUSTER_TRANSPORT__MAX, + GLUSTER_TRANSPORT__MAX, + &local_err); if (!ptr) { error_setg(&local_err, QERR_MISSING_PARAMETER, GLUSTER_OPT_TYP= E); error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; =20 } - if (gsconf->type =3D=3D GLUSTER_TRANSPORT__MAX) { - error_setg(&local_err, QERR_INVALID_PARAMETER_VALUE, - GLUSTER_OPT_TYPE, "tcp or unix"); + if (local_err) { + error_append_hint(&local_err, + "Parameter '%s' may be 'tcp' or 'unix'\n", + GLUSTER_OPT_TYPE); error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; } --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491449119879.5327094825087; Thu, 2 Mar 2017 13:50:49 -0800 (PST) Received: from localhost ([::1]:54838 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYcZ-0001eE-TK for importer@patchew.org; Thu, 02 Mar 2017 16:50:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35073) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWF-0005Vj-Ro for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWE-0002pe-7B for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45282) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWA-0002lI-UK; Thu, 02 Mar 2017 16:44:11 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 056221B174E; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BF3FA15A81; Thu, 2 Mar 2017 21:44:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 980231138604; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:03 +0100 Message-Id: <1488491046-2549-13-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 12/15] gluster: Plug memory leaks in qemu_gluster_parse_json() 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" To reproduce, run $ valgrind qemu-system-x86_64 --nodefaults -S --drive driver=3Dgluster,= volume=3Dtestvol,path=3D/a/b/c,server.0.type=3Dxxx Signed-off-by: Markus Armbruster --- block/gluster.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 6fbcf9e..35a7abb 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -480,7 +480,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, QDict *options, Error **errp) { QemuOpts *opts; - GlusterServer *gsconf; + GlusterServer *gsconf =3D NULL; GlusterServerList *curr =3D NULL; QDict *backing_options =3D NULL; Error *local_err =3D NULL; @@ -529,17 +529,16 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, } =20 ptr =3D qemu_opt_get(opts, GLUSTER_OPT_TYPE); + if (!ptr) { + error_setg(&local_err, QERR_MISSING_PARAMETER, GLUSTER_OPT_TYP= E); + error_append_hint(&local_err, GERR_INDEX_HINT, i); + goto out; + + } gsconf =3D g_new0(GlusterServer, 1); gsconf->type =3D qapi_enum_parse(GlusterTransport_lookup, ptr, - GLUSTER_TRANSPORT__MAX, - GLUSTER_TRANSPORT__MAX, + GLUSTER_TRANSPORT__MAX, 0, &local_err); - if (!ptr) { - error_setg(&local_err, QERR_MISSING_PARAMETER, GLUSTER_OPT_TYP= E); - error_append_hint(&local_err, GERR_INDEX_HINT, i); - goto out; - - } if (local_err) { error_append_hint(&local_err, "Parameter '%s' may be 'tcp' or 'unix'\n", @@ -626,8 +625,10 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlus= ter *gconf, curr->next->value =3D gsconf; curr =3D curr->next; } + gsconf =3D NULL; =20 - qdict_del(backing_options, str); + QDECREF(backing_options); + backing_options =3D NULL; g_free(str); str =3D NULL; } @@ -636,11 +637,10 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, =20 out: error_propagate(errp, local_err); + qapi_free_GlusterServer(gsconf); qemu_opts_del(opts); - if (str) { - qdict_del(backing_options, str); - g_free(str); - } + g_free(str); + QDECREF(backing_options); errno =3D EINVAL; return -errno; } --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491573706600.038224755111; Thu, 2 Mar 2017 13:52:53 -0800 (PST) Received: from localhost ([::1]:54849 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYea-0003Nh-B3 for importer@patchew.org; Thu, 02 Mar 2017 16:52:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35208) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWJ-0005b0-97 for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWH-0002t4-QG for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55742) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lb-CV; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7857D7E9D1; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li90x014225 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9B0471138607; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:04 +0100 Message-Id: <1488491046-2549-14-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 13/15] qapi-schema: Rename GlusterServer to SocketAddressFlat 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" As its documentation says, it's not specific to Gluster. Rename it, as I'm going to use it for something else. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/gluster.c | 38 +++++++++++++++++++------------------- qapi-schema.json | 38 ++++++++++++++++++++++++++++++++++++++ qapi/block-core.json | 46 +--------------------------------------------- 3 files changed, 58 insertions(+), 64 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 35a7abb..77ce45b 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -321,7 +321,7 @@ static int parse_volume_options(BlockdevOptionsGluster = *gconf, char *path) static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf, const char *filename) { - GlusterServer *gsconf; + SocketAddressFlat *gsconf; URI *uri; QueryParams *qp =3D NULL; bool is_unix =3D false; @@ -332,19 +332,19 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGlus= ter *gconf, return -EINVAL; } =20 - gconf->server =3D g_new0(GlusterServerList, 1); - gconf->server->value =3D gsconf =3D g_new0(GlusterServer, 1); + gconf->server =3D g_new0(SocketAddressFlatList, 1); + gconf->server->value =3D gsconf =3D g_new0(SocketAddressFlat, 1); =20 /* transport */ if (!uri->scheme || !strcmp(uri->scheme, "gluster")) { - gsconf->type =3D GLUSTER_TRANSPORT_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; } else if (!strcmp(uri->scheme, "gluster+tcp")) { - gsconf->type =3D GLUSTER_TRANSPORT_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; } else if (!strcmp(uri->scheme, "gluster+unix")) { - gsconf->type =3D GLUSTER_TRANSPORT_UNIX; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_UNIX; is_unix =3D true; } else if (!strcmp(uri->scheme, "gluster+rdma")) { - gsconf->type =3D GLUSTER_TRANSPORT_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; error_report("Warning: rdma feature is not supported, falling " "back to tcp"); } else { @@ -396,7 +396,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, struct glfs *glfs; int ret; int old_errno; - GlusterServerList *server; + SocketAddressFlatList *server; unsigned long long port; =20 glfs =3D glfs_find_preopened(gconf->volume); @@ -412,7 +412,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, glfs_set_preopened(gconf->volume, glfs); =20 for (server =3D gconf->server; server; server =3D server->next) { - if (server->value->type =3D=3D GLUSTER_TRANSPORT_UNIX) { + if (server->value->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_UNIX) { ret =3D glfs_set_volfile_server(glfs, "unix", server->value->u.q_unix.path, 0); } else { @@ -443,7 +443,7 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, error_setg(errp, "Gluster connection for volume %s, path %s failed" " to connect", gconf->volume, gconf->path); for (server =3D gconf->server; server; server =3D server->next) { - if (server->value->type =3D=3D GLUSTER_TRANSPORT_UNIX) { + if (server->value->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_UNIX)= { error_append_hint(errp, "hint: failed on socket %s ", server->value->u.q_unix.path); } else { @@ -480,8 +480,8 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, QDict *options, Error **errp) { QemuOpts *opts; - GlusterServer *gsconf =3D NULL; - GlusterServerList *curr =3D NULL; + SocketAddressFlat *gsconf =3D NULL; + SocketAddressFlatList *curr =3D NULL; QDict *backing_options =3D NULL; Error *local_err =3D NULL; char *str =3D NULL; @@ -535,9 +535,9 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, goto out; =20 } - gsconf =3D g_new0(GlusterServer, 1); - gsconf->type =3D qapi_enum_parse(GlusterTransport_lookup, ptr, - GLUSTER_TRANSPORT__MAX, 0, + gsconf =3D g_new0(SocketAddressFlat, 1); + gsconf->type =3D qapi_enum_parse(SocketAddressFlatType_lookup, ptr, + SOCKET_ADDRESS_FLAT_TYPE__MAX, 0, &local_err); if (local_err) { error_append_hint(&local_err, @@ -548,7 +548,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, } qemu_opts_del(opts); =20 - if (gsconf->type =3D=3D GLUSTER_TRANSPORT_TCP) { + if (gsconf->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_TCP) { /* create opts info from runtime_tcp_opts list */ opts =3D qemu_opts_create(&runtime_tcp_opts, NULL, 0, &error_a= bort); qemu_opts_absorb_qdict(opts, backing_options, &local_err); @@ -617,11 +617,11 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, } =20 if (gconf->server =3D=3D NULL) { - gconf->server =3D g_new0(GlusterServerList, 1); + gconf->server =3D g_new0(SocketAddressFlatList, 1); gconf->server->value =3D gsconf; curr =3D gconf->server; } else { - curr->next =3D g_new0(GlusterServerList, 1); + curr->next =3D g_new0(SocketAddressFlatList, 1); curr->next->value =3D gsconf; curr =3D curr->next; } @@ -637,7 +637,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, =20 out: error_propagate(errp, local_err); - qapi_free_GlusterServer(gsconf); + qapi_free_SocketAddressFlat(gsconf); qemu_opts_del(opts); g_free(str); QDECREF(backing_options); diff --git a/qapi-schema.json b/qapi-schema.json index 150ee98..a57afeb 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -4101,6 +4101,44 @@ 'fd': 'String' } } =20 ## +# @SocketAddressFlatType: +# +# Available SocketAddressFlat types +# +# @tcp: Internet address +# +# @unix: Unix domain socket +# +# Since: 2.9 +## +{ 'enum': 'SocketAddressFlatType', + 'data': [ 'unix', 'tcp' ] } + +## +# @SocketAddressFlat: +# +# Captures the address of a socket +# +# @type: Transport type +# +# This is similar to SocketAddress, only distinction: +# +# 1. SocketAddressFlat is a flat union, SocketAddress is a simple union. +# A flat union is nicer than simple because it avoids nesting +# (i.e. more {}) on the wire. +# +# 2. SocketAddressFlat supports only types 'unix' and 'tcp', because +# that's what its current users need. +# +# Since: 2.9 +## +{ 'union': 'SocketAddressFlat', + 'base': { 'type': 'SocketAddressFlatType' }, + 'discriminator': 'type', + 'data': { 'unix': 'UnixSocketAddress', + 'tcp': 'InetSocketAddress' } } + +## # @getfd: # # Receive a file descriptor via SCM rights and assign it a name diff --git a/qapi/block-core.json b/qapi/block-core.json index cf24c04..28f1b10 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2533,50 +2533,6 @@ '*read-pattern': 'QuorumReadPattern' } } =20 ## -# @GlusterTransport: -# -# An enumeration of Gluster transport types -# -# @tcp: TCP - Transmission Control Protocol -# -# @unix: UNIX - Unix domain socket -# -# Since: 2.7 -## -{ 'enum': 'GlusterTransport', - 'data': [ 'unix', 'tcp' ] } - - -## -# @GlusterServer: -# -# Captures the address of a socket -# -# Details for connecting to a gluster server -# -# @type: Transport type used for gluster connection -# -# This is similar to SocketAddress, only distinction: -# -# 1. GlusterServer is a flat union, SocketAddress is a simple union. -# A flat union is nicer than simple because it avoids nesting -# (i.e. more {}) on the wire. -# -# 2. GlusterServer lacks case 'fd', since gluster doesn't let you -# pass in a file descriptor. -# -# GlusterServer is actually not Gluster-specific, its a -# compatibility evolved into an alternate for SocketAddress. -# -# Since: 2.7 -## -{ 'union': 'GlusterServer', - 'base': { 'type': 'GlusterTransport' }, - 'discriminator': 'type', - 'data': { 'unix': 'UnixSocketAddress', - 'tcp': 'InetSocketAddress' } } - -## # @BlockdevOptionsGluster: # # Driver specific block device options for Gluster @@ -2597,7 +2553,7 @@ { 'struct': 'BlockdevOptionsGluster', 'data': { 'volume': 'str', 'path': 'str', - 'server': ['GlusterServer'], + 'server': ['SocketAddressFlat'], '*debug': 'int', '*logfile': 'str' } } =20 --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491599956855.9329223801674; Thu, 2 Mar 2017 13:53:19 -0800 (PST) Received: from localhost ([::1]:54857 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYf0-0003mf-Ml for importer@patchew.org; Thu, 02 Mar 2017 16:53:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35207) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWJ-0005aw-8o for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWH-0002su-OJ for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53162) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWB-0002lg-Gg; Thu, 02 Mar 2017 16:44:11 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8A11BC056793; Thu, 2 Mar 2017 21:44:11 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22Li9GD015614 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:10 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9E034113860A; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:05 +0100 Message-Id: <1488491046-2549-15-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 02 Mar 2017 21:44:11 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 14/15] qapi-schema: Rename SocketAddressFlat's variant tcp to inet 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" QAPI type SocketAddressFlat differs from SocketAddress pointlessly: the discriminator value for variant InetSocketAddress is 'tcp' instead of 'inet'. Rename. The type is far only used by the Gluster block drivers. Take care to keep 'tcp' working there. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- block/gluster.c | 59 +++++++++++++++++++++++++++++-----------------------= ---- qapi-schema.json | 8 ++++---- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index 77ce45b..0155188 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -152,7 +152,7 @@ static QemuOptsList runtime_type_opts =3D { { .name =3D GLUSTER_OPT_TYPE, .type =3D QEMU_OPT_STRING, - .help =3D "tcp|unix", + .help =3D "inet|unix", }, { /* end of list */ } }, @@ -171,14 +171,14 @@ static QemuOptsList runtime_unix_opts =3D { }, }; =20 -static QemuOptsList runtime_tcp_opts =3D { - .name =3D "gluster_tcp", - .head =3D QTAILQ_HEAD_INITIALIZER(runtime_tcp_opts.head), +static QemuOptsList runtime_inet_opts =3D { + .name =3D "gluster_inet", + .head =3D QTAILQ_HEAD_INITIALIZER(runtime_inet_opts.head), .desc =3D { { .name =3D GLUSTER_OPT_TYPE, .type =3D QEMU_OPT_STRING, - .help =3D "tcp|unix", + .help =3D "inet|unix", }, { .name =3D GLUSTER_OPT_HOST, @@ -337,14 +337,14 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGlus= ter *gconf, =20 /* transport */ if (!uri->scheme || !strcmp(uri->scheme, "gluster")) { - gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_INET; } else if (!strcmp(uri->scheme, "gluster+tcp")) { - gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_INET; } else if (!strcmp(uri->scheme, "gluster+unix")) { gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_UNIX; is_unix =3D true; } else if (!strcmp(uri->scheme, "gluster+rdma")) { - gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_TCP; + gsconf->type =3D SOCKET_ADDRESS_FLAT_TYPE_INET; error_report("Warning: rdma feature is not supported, falling " "back to tcp"); } else { @@ -374,11 +374,11 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGlus= ter *gconf, } gsconf->u.q_unix.path =3D g_strdup(qp->p[0].value); } else { - gsconf->u.tcp.host =3D g_strdup(uri->server ? uri->server : "local= host"); + gsconf->u.inet.host =3D g_strdup(uri->server ? uri->server : "loca= lhost"); if (uri->port) { - gsconf->u.tcp.port =3D g_strdup_printf("%d", uri->port); + gsconf->u.inet.port =3D g_strdup_printf("%d", uri->port); } else { - gsconf->u.tcp.port =3D g_strdup_printf("%d", GLUSTER_DEFAULT_P= ORT); + gsconf->u.inet.port =3D g_strdup_printf("%d", GLUSTER_DEFAULT_= PORT); } } =20 @@ -416,15 +416,15 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOp= tionsGluster *gconf, ret =3D glfs_set_volfile_server(glfs, "unix", server->value->u.q_unix.path, 0); } else { - if (parse_uint_full(server->value->u.tcp.port, &port, 10) < 0 = || + if (parse_uint_full(server->value->u.inet.port, &port, 10) < 0= || port > 65535) { error_setg(errp, "'%s' is not a valid port number", - server->value->u.tcp.port); + server->value->u.inet.port); errno =3D EINVAL; goto out; } ret =3D glfs_set_volfile_server(glfs, "tcp", - server->value->u.tcp.host, + server->value->u.inet.host, (int)port); } =20 @@ -448,8 +448,8 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, server->value->u.q_unix.path); } else { error_append_hint(errp, "hint: failed on host %s and port = %s ", - server->value->u.tcp.host, - server->value->u.tcp.port); + server->value->u.inet.host, + server->value->u.inet.port); } } =20 @@ -536,21 +536,24 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, =20 } gsconf =3D g_new0(SocketAddressFlat, 1); + if (!strcmp(ptr, "tcp")) { + ptr =3D "inet"; /* accept legacy "tcp" */ + } gsconf->type =3D qapi_enum_parse(SocketAddressFlatType_lookup, ptr, SOCKET_ADDRESS_FLAT_TYPE__MAX, 0, &local_err); if (local_err) { error_append_hint(&local_err, - "Parameter '%s' may be 'tcp' or 'unix'\n", + "Parameter '%s' may be 'inet' or 'unix'\n", GLUSTER_OPT_TYPE); error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; } qemu_opts_del(opts); =20 - if (gsconf->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_TCP) { - /* create opts info from runtime_tcp_opts list */ - opts =3D qemu_opts_create(&runtime_tcp_opts, NULL, 0, &error_a= bort); + if (gsconf->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_INET) { + /* create opts info from runtime_inet_opts list */ + opts =3D qemu_opts_create(&runtime_inet_opts, NULL, 0, &error_= abort); qemu_opts_absorb_qdict(opts, backing_options, &local_err); if (local_err) { goto out; @@ -563,7 +566,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; } - gsconf->u.tcp.host =3D g_strdup(ptr); + gsconf->u.inet.host =3D g_strdup(ptr); ptr =3D qemu_opt_get(opts, GLUSTER_OPT_PORT); if (!ptr) { error_setg(&local_err, QERR_MISSING_PARAMETER, @@ -571,28 +574,28 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; } - gsconf->u.tcp.port =3D g_strdup(ptr); + gsconf->u.inet.port =3D g_strdup(ptr); =20 /* defend for unsupported fields in InetSocketAddress, * i.e. @ipv4, @ipv6 and @to */ ptr =3D qemu_opt_get(opts, GLUSTER_OPT_TO); if (ptr) { - gsconf->u.tcp.has_to =3D true; + gsconf->u.inet.has_to =3D true; } ptr =3D qemu_opt_get(opts, GLUSTER_OPT_IPV4); if (ptr) { - gsconf->u.tcp.has_ipv4 =3D true; + gsconf->u.inet.has_ipv4 =3D true; } ptr =3D qemu_opt_get(opts, GLUSTER_OPT_IPV6); if (ptr) { - gsconf->u.tcp.has_ipv6 =3D true; + gsconf->u.inet.has_ipv6 =3D true; } - if (gsconf->u.tcp.has_to) { + if (gsconf->u.inet.has_to) { error_setg(&local_err, "Parameter 'to' not supported"); goto out; } - if (gsconf->u.tcp.has_ipv4 || gsconf->u.tcp.has_ipv6) { + if (gsconf->u.inet.has_ipv4 || gsconf->u.inet.has_ipv6) { error_setg(&local_err, "Parameters 'ipv4/ipv6' not support= ed"); goto out; } @@ -669,7 +672,7 @@ static struct glfs *qemu_gluster_init(BlockdevOptionsGl= uster *gconf, "file.volume=3Dtestvol,file.path=3D/path/a.qc= ow2" "[,file.debug=3D9]" "[,file.logfile=3D/path/filename.log]," - "file.server.0.type=3Dtcp," + "file.server.0.type=3Dinet," "file.server.0.host=3D1.2.3.4," "file.server.0.port=3D24007," "file.server.1.transport=3Dunix," diff --git a/qapi-schema.json b/qapi-schema.json index a57afeb..dfaebce 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -4105,14 +4105,14 @@ # # Available SocketAddressFlat types # -# @tcp: Internet address +# @inet: Internet address # # @unix: Unix domain socket # # Since: 2.9 ## { 'enum': 'SocketAddressFlatType', - 'data': [ 'unix', 'tcp' ] } + 'data': [ 'unix', 'inet' ] } =20 ## # @SocketAddressFlat: @@ -4127,7 +4127,7 @@ # A flat union is nicer than simple because it avoids nesting # (i.e. more {}) on the wire. # -# 2. SocketAddressFlat supports only types 'unix' and 'tcp', because +# 2. SocketAddressFlat supports only types 'unix' and 'inet', because # that's what its current users need. # # Since: 2.9 @@ -4136,7 +4136,7 @@ 'base': { 'type': 'SocketAddressFlatType' }, 'discriminator': 'type', 'data': { 'unix': 'UnixSocketAddress', - 'tcp': 'InetSocketAddress' } } + 'inet': 'InetSocketAddress' } } =20 ## # @getfd: --=20 2.7.4 From nobody Mon Apr 29 08:28:19 2024 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488491595539232.22700877051443; Thu, 2 Mar 2017 13:53:15 -0800 (PST) Received: from localhost ([::1]:54853 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYew-0003hK-1I for importer@patchew.org; Thu, 02 Mar 2017 16:53:14 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35188) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjYWI-0005a6-Hy for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjYWH-0002so-Kc for qemu-devel@nongnu.org; Thu, 02 Mar 2017 16:44:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35818) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjYWC-0002ny-MR; Thu, 02 Mar 2017 16:44:12 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B82E6461C3; Thu, 2 Mar 2017 21:44:12 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v22LiB6c014227 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 2 Mar 2017 16:44:12 -0500 Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A0E32113860D; Thu, 2 Mar 2017 22:44:06 +0100 (CET) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 22:44:06 +0100 Message-Id: <1488491046-2549-16-git-send-email-armbru@redhat.com> In-Reply-To: <1488491046-2549-1-git-send-email-armbru@redhat.com> References: <1488491046-2549-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 02 Mar 2017 21:44:12 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 15/15] sheepdog: Support blockdev-add 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, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, qemu-block@nongnu.org, 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" Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- qapi/block-core.json | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 28f1b10..3b1e4ad 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2111,6 +2111,7 @@ # @replication: Since 2.8 # @ssh: Since 2.8 # @iscsi: Since 2.9 +# @sheepdog: Since 2.9 # # Since: 2.0 ## @@ -2119,8 +2120,8 @@ 'dmg', 'file', 'ftp', 'ftps', 'gluster', 'host_cdrom', 'host_device', 'http', 'https', 'iscsi', 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'parallels', 'qcow', 'qcow2', 'qed', - 'quorum', 'raw', 'replication', 'ssh', 'vdi', 'vhdx', 'vmdk', - 'vpc', 'vvfat' ] } + 'quorum', 'raw', 'replication', 'sheepdog', 'ssh', 'vdi', + 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } =20 ## # @BlockdevOptionsFile: @@ -2622,6 +2623,26 @@ '*timeout': 'int' } } =20 ## +# @BlockdevOptionsSheepdog: +# +# Driver specific block device options for sheepdog +# +# @vdi: Virtual disk image name +# @addr: The Sheepdog server to connect to +# @snap-id: Snapshot ID +# @tag: Snapshot tag name +# +# Only one of @snap-id and @tag may be present. +# +# Since: 2.9 +## +{ 'struct': 'BlockdevOptionsSheepdog', + 'data': { 'addr': 'SocketAddressFlat', + 'vdi': 'str', + '*snap-id': 'uint32', + '*tag': 'str' } } + +## # @ReplicationMode: # # An enumeration of replication modes. @@ -2821,7 +2842,7 @@ 'raw': 'BlockdevOptionsRaw', # TODO rbd: Wait for structured options 'replication':'BlockdevOptionsReplication', -# TODO sheepdog: Wait for structured options + 'sheepdog': 'BlockdevOptionsSheepdog', 'ssh': 'BlockdevOptionsSsh', 'vdi': 'BlockdevOptionsGenericFormat', 'vhdx': 'BlockdevOptionsGenericFormat', --=20 2.7.4