From nobody Sun Oct 26 00:03:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1521636145499317.49756143807554; Wed, 21 Mar 2018 05:42:25 -0700 (PDT) Received: from localhost ([::1]:54636 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eyd4S-0002wF-LL for importer@patchew.org; Wed, 21 Mar 2018 08:42:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54980) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eycib-00061d-3m for qemu-devel@nongnu.org; Wed, 21 Mar 2018 08:19:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eyciW-0005ij-WB for qemu-devel@nongnu.org; Wed, 21 Mar 2018 08:19:49 -0400 Received: from relay.sw.ru ([185.231.240.75]:54948) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eyciW-0005hn-NY; Wed, 21 Mar 2018 08:19:44 -0400 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.90_1) (envelope-from ) id 1eyciT-00064u-Ai; Wed, 21 Mar 2018 15:19:41 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Wed, 21 Mar 2018 15:19:37 +0300 Message-Id: <20180321121940.39426-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180321121940.39426-1-vsementsov@virtuozzo.com> References: <20180321121940.39426-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 1/4] nbd/server: refactor nbd_negotiate_meta_query for several namespaces 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, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org, pbonzini@redhat.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: Vladimir Sementsov-Ogievskiy --- nbd/server.c | 60 +++++++++++++++++++++++++++++++++++++++++++-------------= ---- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index cea158913b..b830997114 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -771,13 +771,19 @@ static int nbd_meta_base_query(NBDClient *client, NBD= ExportMetaContexts *meta, return 1; } =20 +struct { + const char *ns; + int (*func)(NBDClient *, NBDExportMetaContexts *, uint32_t, Error **); +} meta_namespace_handlers[] =3D { + /* namespaces should go in non-decreasing order by name length */ + {.ns =3D "base:", .func =3D nbd_meta_base_query}, +}; + /* nbd_negotiate_meta_query * * Parse namespace name and call corresponding function to parse body of t= he * query. * - * The only supported namespace now is 'base'. - * * The function aims not wasting time and memory to read long unknown name= space * names. * @@ -787,9 +793,12 @@ static int nbd_negotiate_meta_query(NBDClient *client, NBDExportMetaContexts *meta, Error **e= rrp) { int ret; - char query[sizeof("base:") - 1]; - size_t baselen =3D strlen("base:"); + int i; uint32_t len; + int bytes_done =3D 0; + char *query; + int nb_ns =3D sizeof(meta_namespace_handlers) / + sizeof(meta_namespace_handlers[0]); =20 ret =3D nbd_opt_read(client, &len, sizeof(len), errp); if (ret <=3D 0) { @@ -797,22 +806,39 @@ static int nbd_negotiate_meta_query(NBDClient *client, } cpu_to_be32s(&len); =20 - /* The only supported namespace for now is 'base'. So query should sta= rt - * with 'base:'. Otherwise, we can ignore it and skip the remainder. */ - if (len < baselen) { - return nbd_opt_skip(client, len, errp); - } + query =3D g_malloc(strlen(meta_namespace_handlers[nb_ns - 1].ns)); =20 - len -=3D baselen; - ret =3D nbd_opt_read(client, query, baselen, errp); - if (ret <=3D 0) { - return ret; - } - if (strncmp(query, "base:", baselen) !=3D 0) { - return nbd_opt_skip(client, len, errp); + for (i =3D 0; i < nb_ns; i++) { + const char *ns =3D meta_namespace_handlers[i].ns; + int ns_len =3D strlen(ns); + int diff_len =3D strlen(ns) - bytes_done; + + assert(diff_len >=3D 0); + + if (diff_len > 0) { + if (len < diff_len) { + ret =3D nbd_opt_skip(client, len, errp); + goto out; + } + + len -=3D diff_len; + ret =3D nbd_opt_read(client, query + bytes_done, diff_len, err= p); + if (ret <=3D 0) { + goto out; + } + } + + if (!strncmp(query, ns, ns_len)) { + ret =3D meta_namespace_handlers[i].func(client, meta, len, err= p); + goto out; + } } =20 - return nbd_meta_base_query(client, meta, len, errp); + ret =3D nbd_opt_skip(client, len, errp); + +out: + g_free(query); + return ret; } =20 /* nbd_negotiate_meta_queries --=20 2.11.1