Received: by 2002:ab2:6203:0:b0:1f5:f2ab:c469 with SMTP id o3csp2942453lqt; Tue, 23 Apr 2024 06:29:05 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXiT0l/ukuPWNoEqDog960jxL5sjZuGWE47iu8fL3CNQaILHTEzWM9+XLbYgpjjX1qxhCMxd0JbsTMSzIckyZrkwzVRc6pXRTrexvgugQ== X-Google-Smtp-Source: AGHT+IFapQglViRKFdgdKt8mBRap06bDX2kiEgw7FrNzJP57Gre2UquIRT/991VK6lECNXlNCE2L X-Received: by 2002:a05:6a00:3d52:b0:6ea:bd59:9389 with SMTP id lp18-20020a056a003d5200b006eabd599389mr14946378pfb.8.1713878945209; Tue, 23 Apr 2024 06:29:05 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1713878945; cv=pass; d=google.com; s=arc-20160816; b=JsyPgD2q0y/uKxlOPe2eYoime0UArcYf3KHmqxYsxzu3N4i65kW5gvSvAuv178GQYL brAMIR0ZTRKh8Ov4dacmPOp6CnQpvj9KykkrCcofyV4/T+KvJdkShEGxeujcrUxNIofi 0O5U2kEs4TtpoaxYbI5Xrex8fl5esCEuDoaS0qe0nX963CXAozrbCxSRq6fxYznN7ms7 d111WV7e1V1yshOTGgmV1WCF046+3Dp/2IkqNLktdbVND4tBrgI1JBQR7pKDWSD3MLiY 6DbebR+CPL+aQ+rUbxzyzNk93ZTv23SjMJ9SLZ6i70N+v1iojrpy/MQY4WZYn7/Po0lh djqQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=6qewd/AscMVCtulQbDt4yVAm8JMU92LhpXBhHCD8OIU=; fh=DMCDS8gUzVrNgxbf14gHb/h+T7HG77KdNqMH/8ibnkw=; b=BMOHmL5b4Am15O8xZclmWnFX8zaokCXphhJNPniCt4YdicpdxHip8E5XDIafEQYY2p edNAozdA7zKkMZzDFaBSDr36CId1Mpaa5hYtApjzI/deY+nXomKf9KRRkmk6EHWHpBqm pK42+XDy8UHsns4CfJi0ruGXkDldl1ubUUV4tKB57wBg3i2Rbaf3ra7/drrdr6TplmpW 83ZWlD/TG+SIDBX0xAB21Uu5g+4oLIIWlCfxJwRwJ/KKiFxyp0Y8z/U3UtStCRDJ0gCt hCiDREWwzg6mK1n+mDy40XD/MwDbDjgNd157BPX+8aoEt2icWKULwvHGvZdcupwHf2LM GAwQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tWbhXGBX; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-nfs+bounces-2952-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-nfs+bounces-2952-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id k11-20020a635a4b000000b00600b3546fffsi3108680pgm.662.2024.04.23.06.29.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Apr 2024 06:29:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs+bounces-2952-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tWbhXGBX; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-nfs+bounces-2952-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-nfs+bounces-2952-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 056FC289AC4 for ; Tue, 23 Apr 2024 13:26:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2F4CA136657; Tue, 23 Apr 2024 13:26:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tWbhXGBX" X-Original-To: linux-nfs@vger.kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05B79136652; Tue, 23 Apr 2024 13:26:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713878777; cv=none; b=ebq97dqkRqgVw6+2UQm9//rkp9fWcVw3fEpC6z60eNBH9dOg3Ih2yCoShaI1UjMU973HzIl229sdEY/f2vmNbtO7aSbRbpa0QyCgXmr0S7Ln5XDOBO8zZPGD/An/rk6pwVUK9GTGD7R3BSOK0qCf3T4bqRi7XTDBO1LUjTRN7GI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713878777; c=relaxed/simple; bh=/DTZXF8udDvRjKg2a8s3S2ZTaSHcPM7bxXD0dLq6SFs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n76dImEBUhnFndvhn9umA+RAXJq7xCIkEl7dQPgn6bMmNnf4Bboejevx8kJsLIx03muptG+tHLPLWLaY5zcFXwPnM0Hrr6tQwAkjcoS7aDGoJ71WFVe5mltMhf2hr0HxjWEjvnqo5AMJPBNXieALblic3hACKXW4CY+1Pi+3N5c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tWbhXGBX; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4A0D6C116B1; Tue, 23 Apr 2024 13:26:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1713878776; bh=/DTZXF8udDvRjKg2a8s3S2ZTaSHcPM7bxXD0dLq6SFs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tWbhXGBXxQJcZyUUEDCUzVIfJBRdspdhmRmzjqKiICwO0VK7NKpQssgwiE2o4qVpv b1xvIP2h/JqZ6F0SaccFnyR+BrKEsS4ExU4mmANTN8Tlfgq+bF+l2HYOv7d+3vyYuu BZ1BmCKW5ceYaUPjebBXYTc31yXdRDgXr8gtW3SkX/BKvhIak71visWcqGirs6l7V+ ch+tZ6PdHUGCKHrDDjwq+bsO+TyVoTuNxEsfGDj+nOvXURvnMg7eV0kNIEXFd87M+a 8CYMsQ0b42fkK125RXR7AcdjeUZoUXVTzI38AOQXoVO13RgBemE/jk3Zp7Vbn4iyJy n3j5o3LBFiGmg== From: Lorenzo Bianconi To: linux-nfs@vger.kernel.org Cc: neilb@suse.de, lorenzo.bianconi@redhat.com, chuck.lever@oracle.com, netdev@vger.kernel.org, kuba@kernel.org, jlayton@kernel.org Subject: [PATCH v9 5/7] SUNRPC: introduce svc_xprt_create_from_sa utility routine Date: Tue, 23 Apr 2024 15:25:42 +0200 Message-ID: <56f5faa7ad389f9f49c658ccd3299dd7e19d56c4.1713878413.git.lorenzo@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add svc_xprt_create_from_sa utility routine and refactor svc_xprt_create() codebase in order to introduce the capability to create a svc port from socket address. Reviewed-by: Jeff Layton Tested-by: Jeff Layton Signed-off-by: Lorenzo Bianconi --- include/linux/sunrpc/svc_xprt.h | 3 + net/sunrpc/svc_xprt.c | 133 ++++++++++++++++++-------------- 2 files changed, 78 insertions(+), 58 deletions(-) diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 8e20cd60e2e7..0d9b10dbe07d 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -135,6 +135,9 @@ int svc_reg_xprt_class(struct svc_xprt_class *); void svc_unreg_xprt_class(struct svc_xprt_class *); void svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *, struct svc_serv *); +int svc_xprt_create_from_sa(struct svc_serv *serv, const char *xprt_name, + struct net *net, struct sockaddr *sap, + int flags, const struct cred *cred); int svc_xprt_create(struct svc_serv *serv, const char *xprt_name, struct net *net, const int family, const unsigned short port, int flags, diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index b4a85a227bd7..463fe544ae28 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -211,51 +211,6 @@ void svc_xprt_init(struct net *net, struct svc_xprt_class *xcl, } EXPORT_SYMBOL_GPL(svc_xprt_init); -static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, - struct svc_serv *serv, - struct net *net, - const int family, - const unsigned short port, - int flags) -{ - struct sockaddr_in sin = { - .sin_family = AF_INET, - .sin_addr.s_addr = htonl(INADDR_ANY), - .sin_port = htons(port), - }; -#if IS_ENABLED(CONFIG_IPV6) - struct sockaddr_in6 sin6 = { - .sin6_family = AF_INET6, - .sin6_addr = IN6ADDR_ANY_INIT, - .sin6_port = htons(port), - }; -#endif - struct svc_xprt *xprt; - struct sockaddr *sap; - size_t len; - - switch (family) { - case PF_INET: - sap = (struct sockaddr *)&sin; - len = sizeof(sin); - break; -#if IS_ENABLED(CONFIG_IPV6) - case PF_INET6: - sap = (struct sockaddr *)&sin6; - len = sizeof(sin6); - break; -#endif - default: - return ERR_PTR(-EAFNOSUPPORT); - } - - xprt = xcl->xcl_ops->xpo_create(serv, net, sap, len, flags); - if (IS_ERR(xprt)) - trace_svc_xprt_create_err(serv->sv_program->pg_name, - xcl->xcl_name, sap, len, xprt); - return xprt; -} - /** * svc_xprt_received - start next receiver thread * @xprt: controlling transport @@ -294,9 +249,8 @@ void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new) } static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name, - struct net *net, const int family, - const unsigned short port, int flags, - const struct cred *cred) + struct net *net, struct sockaddr *sap, + size_t len, int flags, const struct cred *cred) { struct svc_xprt_class *xcl; @@ -312,8 +266,11 @@ static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name, goto err; spin_unlock(&svc_xprt_class_lock); - newxprt = __svc_xpo_create(xcl, serv, net, family, port, flags); + newxprt = xcl->xcl_ops->xpo_create(serv, net, sap, len, flags); if (IS_ERR(newxprt)) { + trace_svc_xprt_create_err(serv->sv_program->pg_name, + xcl->xcl_name, sap, len, + newxprt); module_put(xcl->xcl_owner); return PTR_ERR(newxprt); } @@ -329,6 +286,48 @@ static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name, return -EPROTONOSUPPORT; } +/** + * svc_xprt_create_from_sa - Add a new listener to @serv from socket address + * @serv: target RPC service + * @xprt_name: transport class name + * @net: network namespace + * @sap: socket address pointer + * @flags: SVC_SOCK flags + * @cred: credential to bind to this transport + * + * Return local xprt port on success or %-EPROTONOSUPPORT on failure + */ +int svc_xprt_create_from_sa(struct svc_serv *serv, const char *xprt_name, + struct net *net, struct sockaddr *sap, + int flags, const struct cred *cred) +{ + size_t len; + int err; + + switch (sap->sa_family) { + case AF_INET: + len = sizeof(struct sockaddr_in); + break; +#if IS_ENABLED(CONFIG_IPV6) + case AF_INET6: + len = sizeof(struct sockaddr_in6); + break; +#endif + default: + return -EAFNOSUPPORT; + } + + err = _svc_xprt_create(serv, xprt_name, net, sap, len, flags, cred); + if (err == -EPROTONOSUPPORT) { + request_module("svc%s", xprt_name); + err = _svc_xprt_create(serv, xprt_name, net, sap, len, flags, + cred); + } + + return err; +} +EXPORT_SYMBOL_GPL(svc_xprt_create_from_sa); + /** * svc_xprt_create - Add a new listener to @serv * @serv: target RPC service @@ -339,23 +338,41 @@ static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name, * @flags: SVC_SOCK flags * @cred: credential to bind to this transport * - * Return values: - * %0: New listener added successfully - * %-EPROTONOSUPPORT: Requested transport type not supported + * Return local xprt port on success or %-EPROTONOSUPPORT on failure */ int svc_xprt_create(struct svc_serv *serv, const char *xprt_name, struct net *net, const int family, const unsigned short port, int flags, const struct cred *cred) { - int err; + struct sockaddr_in sin = { + .sin_family = AF_INET, + .sin_addr.s_addr = htonl(INADDR_ANY), + .sin_port = htons(port), + }; +#if IS_ENABLED(CONFIG_IPV6) + struct sockaddr_in6 sin6 = { + .sin6_family = AF_INET6, + .sin6_addr = IN6ADDR_ANY_INIT, + .sin6_port = htons(port), + }; +#endif + struct sockaddr *sap; - err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred); - if (err == -EPROTONOSUPPORT) { - request_module("svc%s", xprt_name); - err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred); + switch (family) { + case PF_INET: + sap = (struct sockaddr *)&sin; + break; +#if IS_ENABLED(CONFIG_IPV6) + case PF_INET6: + sap = (struct sockaddr *)&sin6; + break; +#endif + default: + return -EAFNOSUPPORT; } - return err; + + return svc_xprt_create_from_sa(serv, xprt_name, net, sap, flags, cred); } EXPORT_SYMBOL_GPL(svc_xprt_create); -- 2.44.0