From patchwork Tue Nov 10 23:18:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895777 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8687B16C1 for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5E0CD207E8 for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="PmMlanlj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726737AbgKJX3V (ORCPT ); Tue, 10 Nov 2020 18:29:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:39142 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727275AbgKJX3T (ORCPT ); Tue, 10 Nov 2020 18:29:19 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 70FC7207BB for ; Tue, 10 Nov 2020 23:29:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050958; bh=em7z0a+ayOv2csAJKaei1xDrJ7Q9H8tax3tXxqIrrdo=; h=From:To:Subject:Date:In-Reply-To:References:From; b=PmMlanljfRNcX5/hXza8Awgv5Ej6WLyYQcUtArFmegZV2bt8hcNZ45xZlocl2weWG kSZaoOMpw37ngg10cIv7cEspyQX+Fy/DIsmFmBh0YuTW5FF5bnjkdWzTbkKcD/DbEk dvMH21iQyhKJ/LMKE0g3R3zWT/xoNppDTPkERr4A= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 01/11] SUNRPC: xprt_load_transport() needs to support the netid "rdma6" Date: Tue, 10 Nov 2020 18:18:56 -0500 Message-Id: <20201110231906.863446-2-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-1-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust According to RFC5666, the correct netid for an IPv6 addressed RDMA transport is "rdma6", which we've supported as a mount option since Linux-4.7. The problem is when we try to load the module "xprtrdma6", that will fail, since there is no modulealias of that name. Fixes: 181342c5ebe8 ("xprtrdma: Add rdma6 option to support NFS/RDMA IPv6") Signed-off-by: Trond Myklebust --- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/xprt.c | 65 +++++++++++++++++++++++++-------- net/sunrpc/xprtrdma/module.c | 1 + net/sunrpc/xprtrdma/transport.c | 1 + net/sunrpc/xprtsock.c | 4 ++ 5 files changed, 56 insertions(+), 16 deletions(-) diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index a603d48d2b2c..3ac5037d1c3d 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -330,6 +330,7 @@ struct xprt_class { struct rpc_xprt * (*setup)(struct xprt_create *); struct module *owner; char name[32]; + const char * netid[]; }; /* diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index f6c17e75f20e..1660a4b03352 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -151,31 +151,64 @@ int xprt_unregister_transport(struct xprt_class *transport) } EXPORT_SYMBOL_GPL(xprt_unregister_transport); +static void +xprt_class_release(const struct xprt_class *t) +{ + module_put(t->owner); +} + +static const struct xprt_class * +xprt_class_find_by_netid_locked(const char *netid) +{ + const struct xprt_class *t; + unsigned int i; + + list_for_each_entry(t, &xprt_list, list) { + for (i = 0; *t->netid[i] != '\0'; i++) { + if (strcmp(t->netid[i], netid) != 0) + continue; + if (!try_module_get(t->owner)) + continue; + return t; + } + } + return NULL; +} + +static const struct xprt_class * +xprt_class_find_by_netid(const char *netid) +{ + const struct xprt_class *t; + + spin_lock(&xprt_list_lock); + t = xprt_class_find_by_netid_locked(netid); + if (!t) { + spin_unlock(&xprt_list_lock); + request_module("rpc%s", netid); + spin_lock(&xprt_list_lock); + t = xprt_class_find_by_netid_locked(netid); + } + spin_unlock(&xprt_list_lock); + return t; +} + /** * xprt_load_transport - load a transport implementation - * @transport_name: transport to load + * @netid: transport to load * * Returns: * 0: transport successfully loaded * -ENOENT: transport module not available */ -int xprt_load_transport(const char *transport_name) +int xprt_load_transport(const char *netid) { - struct xprt_class *t; - int result; + const struct xprt_class *t; - result = 0; - spin_lock(&xprt_list_lock); - list_for_each_entry(t, &xprt_list, list) { - if (strcmp(t->name, transport_name) == 0) { - spin_unlock(&xprt_list_lock); - goto out; - } - } - spin_unlock(&xprt_list_lock); - result = request_module("xprt%s", transport_name); -out: - return result; + t = xprt_class_find_by_netid(netid); + if (!t) + return -ENOENT; + xprt_class_release(t); + return 0; } EXPORT_SYMBOL_GPL(xprt_load_transport); diff --git a/net/sunrpc/xprtrdma/module.c b/net/sunrpc/xprtrdma/module.c index 620327c01302..45c5b41ac8dc 100644 --- a/net/sunrpc/xprtrdma/module.c +++ b/net/sunrpc/xprtrdma/module.c @@ -24,6 +24,7 @@ MODULE_DESCRIPTION("RPC/RDMA Transport"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_ALIAS("svcrdma"); MODULE_ALIAS("xprtrdma"); +MODULE_ALIAS("rpcrdma6"); static void __exit rpc_rdma_cleanup(void) { diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 8915e42240d3..035060c05fd5 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c @@ -768,6 +768,7 @@ static struct xprt_class xprt_rdma = { .owner = THIS_MODULE, .ident = XPRT_TRANSPORT_RDMA, .setup = xprt_setup_rdma, + .netid = { "rdma", "rdma6", "" }, }; void xprt_rdma_cleanup(void) diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 7090bbee0ec5..c93ff70da3f9 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -3059,6 +3059,7 @@ static struct xprt_class xs_local_transport = { .owner = THIS_MODULE, .ident = XPRT_TRANSPORT_LOCAL, .setup = xs_setup_local, + .netid = { "" }, }; static struct xprt_class xs_udp_transport = { @@ -3067,6 +3068,7 @@ static struct xprt_class xs_udp_transport = { .owner = THIS_MODULE, .ident = XPRT_TRANSPORT_UDP, .setup = xs_setup_udp, + .netid = { "udp", "udp6", "" }, }; static struct xprt_class xs_tcp_transport = { @@ -3075,6 +3077,7 @@ static struct xprt_class xs_tcp_transport = { .owner = THIS_MODULE, .ident = XPRT_TRANSPORT_TCP, .setup = xs_setup_tcp, + .netid = { "tcp", "tcp6", "" }, }; static struct xprt_class xs_bc_tcp_transport = { @@ -3083,6 +3086,7 @@ static struct xprt_class xs_bc_tcp_transport = { .owner = THIS_MODULE, .ident = XPRT_TRANSPORT_BC_TCP, .setup = xs_setup_bc_tcp, + .netid = { "" }, }; /** From patchwork Tue Nov 10 23:18:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895779 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C4594138B for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 972B0207E8 for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="Gu/FvZin" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731954AbgKJX3V (ORCPT ); Tue, 10 Nov 2020 18:29:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:39148 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730894AbgKJX3U (ORCPT ); Tue, 10 Nov 2020 18:29:20 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 196D9207E8 for ; Tue, 10 Nov 2020 23:29:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050959; bh=3AgrCRS9cu4eXlK3NSXaYZ2fXESWqxnt3bb6UHVHQJU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Gu/FvZiniVEV2mcl7oOs7FHQXeTNxE0K0ZTaoIhPbOONU1OnYcdVr4gKoDPsEKSFc fgf3obF8GdHdTkvwuouBdnXrCudQa6EJhT+h2pBrj/SibcnGuxQeSPAIbFh1Y/rIJN pCir1pfnOGNODsWZW7Kg4fBkWezwkwUHD+0odQ+E= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 02/11] SUNRPC: Close a race with transport setup and module put Date: Tue, 10 Nov 2020 18:18:57 -0500 Message-Id: <20201110231906.863446-3-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-2-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust After we've looked up the transport module, we need to ensure it can't go away until we've finished running the transport setup code. Signed-off-by: Trond Myklebust --- net/sunrpc/xprt.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 1660a4b03352..29de33ea53d6 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -157,6 +157,32 @@ xprt_class_release(const struct xprt_class *t) module_put(t->owner); } +static const struct xprt_class * +xprt_class_find_by_ident_locked(int ident) +{ + const struct xprt_class *t; + + list_for_each_entry(t, &xprt_list, list) { + if (t->ident != ident) + continue; + if (!try_module_get(t->owner)) + continue; + return t; + } + return NULL; +} + +static const struct xprt_class * +xprt_class_find_by_ident(int ident) +{ + const struct xprt_class *t; + + spin_lock(&xprt_list_lock); + t = xprt_class_find_by_ident_locked(ident); + spin_unlock(&xprt_list_lock); + return t; +} + static const struct xprt_class * xprt_class_find_by_netid_locked(const char *netid) { @@ -1929,21 +1955,17 @@ static void xprt_init(struct rpc_xprt *xprt, struct net *net) struct rpc_xprt *xprt_create_transport(struct xprt_create *args) { struct rpc_xprt *xprt; - struct xprt_class *t; + const struct xprt_class *t; - spin_lock(&xprt_list_lock); - list_for_each_entry(t, &xprt_list, list) { - if (t->ident == args->ident) { - spin_unlock(&xprt_list_lock); - goto found; - } + t = xprt_class_find_by_ident(args->ident); + if (!t) { + dprintk("RPC: transport (%d) not supported\n", args->ident); + return ERR_PTR(-EIO); } - spin_unlock(&xprt_list_lock); - dprintk("RPC: transport (%d) not supported\n", args->ident); - return ERR_PTR(-EIO); -found: xprt = t->setup(args); + xprt_class_release(t); + if (IS_ERR(xprt)) goto out; if (args->flags & XPRT_CREATE_NO_IDLE_TIMEOUT) From patchwork Tue Nov 10 23:18:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895781 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0C9B8174A for ; Tue, 10 Nov 2020 23:29:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DAD71207E8 for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="grPKbWmm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727275AbgKJX3V (ORCPT ); Tue, 10 Nov 2020 18:29:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:39158 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731954AbgKJX3U (ORCPT ); Tue, 10 Nov 2020 18:29:20 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BE8D220809 for ; Tue, 10 Nov 2020 23:29:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050960; bh=lWgCuMfIWz0fzMo/imC0bvLSQ3HnAi5mh1XUrvwvNug=; h=From:To:Subject:Date:In-Reply-To:References:From; b=grPKbWmmvbeULyPcKo4rdJFopidJxEEeE9oIooHGtYSXVX0+Wb5aLIykzavGB1nU+ chaYAikKIit0CF0Jht1VaVaKwy0Kd4Ek4oydXnIimlk0qBS9Gp7ipkIjGt41q6ft0n CYQVRWFf6Kj0WiC3Gpcuv5nDyxi/hR9nKDBTnFEk= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 03/11] SUNRPC: Add a helper to return the transport identifier given a netid Date: Tue, 10 Nov 2020 18:18:58 -0500 Message-Id: <20201110231906.863446-4-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-3-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Signed-off-by: Trond Myklebust --- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/xprt.c | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 3ac5037d1c3d..f7b75c72f80e 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -386,6 +386,7 @@ xprt_disable_swap(struct rpc_xprt *xprt) int xprt_register_transport(struct xprt_class *type); int xprt_unregister_transport(struct xprt_class *type); int xprt_load_transport(const char *); +int xprt_find_transport_ident(const char *); void xprt_wait_for_reply_request_def(struct rpc_task *task); void xprt_wait_for_reply_request_rtt(struct rpc_task *task); void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 29de33ea53d6..1016265d5e53 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -219,22 +219,39 @@ xprt_class_find_by_netid(const char *netid) } /** - * xprt_load_transport - load a transport implementation + * xprt_find_transport_ident - convert a netid into a transport identifier * @netid: transport to load * * Returns: - * 0: transport successfully loaded + * > 0: transport identifier * -ENOENT: transport module not available */ -int xprt_load_transport(const char *netid) +int xprt_find_transport_ident(const char *netid) { const struct xprt_class *t; + int ret; t = xprt_class_find_by_netid(netid); if (!t) return -ENOENT; + ret = t->ident; xprt_class_release(t); - return 0; + return ret; +} +EXPORT_SYMBOL_GPL(xprt_find_transport_ident); + +/** + * xprt_load_transport - load a transport implementation + * @netid: transport to load + * + * Returns: + * 0: transport successfully loaded + * -ENOENT: transport module not available + */ +int xprt_load_transport(const char *netid) +{ + int ret = xprt_find_transport_ident(netid); + return ret < 0 ? ret : 0; } EXPORT_SYMBOL_GPL(xprt_load_transport); From patchwork Tue Nov 10 23:18:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895783 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 48FE1921 for ; Tue, 10 Nov 2020 23:29:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 29007207E8 for ; Tue, 10 Nov 2020 23:29:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="saJwjPV+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732052AbgKJX3W (ORCPT ); Tue, 10 Nov 2020 18:29:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:39164 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731982AbgKJX3V (ORCPT ); Tue, 10 Nov 2020 18:29:21 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 905352080A for ; Tue, 10 Nov 2020 23:29:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050961; bh=qf4KMfaV8KzGjVCK8mx8xTWaCJ7GabrbTSZkH8hH3HA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=saJwjPV+yDFbcxT9nPWDHcBxJNcgUcfnFz7XtwVAng//OcewDglW7h8oU7pY7pBpf LzWDYe5z7m+otWgqiGFUy9Q7uB7GTtWUxx3XEywkQF1H3lv/LU8H84U6S3RCTrOSMA drCX7f0UAG4BRQz9yDWxyUCqx20UJUMx+0Jf7eoY= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 04/11] NFS: Switch mount code to use xprt_find_transport_ident() Date: Tue, 10 Nov 2020 18:18:59 -0500 Message-Id: <20201110231906.863446-5-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-4-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Switch the mount code to use xprt_find_transport_ident() and to check the results before allowing the mount to proceed. Signed-off-by: Trond Myklebust --- fs/nfs/fs_context.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c index 29ec8b09a52d..06894bcdea2d 100644 --- a/fs/nfs/fs_context.c +++ b/fs/nfs/fs_context.c @@ -510,13 +510,12 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, ctx->nfs_server.protocol = XPRT_TRANSPORT_UDP; break; case Opt_tcp: - ctx->flags |= NFS_MOUNT_TCP; - ctx->nfs_server.protocol = XPRT_TRANSPORT_TCP; - break; case Opt_rdma: ctx->flags |= NFS_MOUNT_TCP; /* for side protocols */ - ctx->nfs_server.protocol = XPRT_TRANSPORT_RDMA; - xprt_load_transport(param->key); + ret = xprt_find_transport_ident(param->key); + if (ret < 0) + goto out_bad_transport; + ctx->nfs_server.protocol = ret; break; case Opt_acl: if (result.negated) @@ -670,11 +669,13 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, case Opt_xprt_rdma: /* vector side protocols to TCP */ ctx->flags |= NFS_MOUNT_TCP; - ctx->nfs_server.protocol = XPRT_TRANSPORT_RDMA; - xprt_load_transport(param->string); + ret = xprt_find_transport_ident(param->string); + if (ret < 0) + goto out_bad_transport; + ctx->nfs_server.protocol = ret; break; default: - return nfs_invalf(fc, "NFS: Unrecognized transport protocol"); + goto out_bad_transport; } ctx->protofamily = protofamily; @@ -697,7 +698,7 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, break; case Opt_xprt_rdma: /* not used for side protocols */ default: - return nfs_invalf(fc, "NFS: Unrecognized transport protocol"); + goto out_bad_transport; } ctx->mountfamily = mountfamily; break; @@ -787,6 +788,8 @@ static int nfs_fs_context_parse_param(struct fs_context *fc, return nfs_invalf(fc, "NFS: Bad IP address specified"); out_of_bounds: return nfs_invalf(fc, "NFS: Value for '%s' out of range", param->key); +out_bad_transport: + return nfs_invalf(fc, "NFS: Unrecognized transport protocol"); } /* From patchwork Tue Nov 10 23:19:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895785 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 43EDF921 for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1D618207E8 for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="CWW9EF2w" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731982AbgKJX3X (ORCPT ); Tue, 10 Nov 2020 18:29:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:39182 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730894AbgKJX3W (ORCPT ); Tue, 10 Nov 2020 18:29:22 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 71EE420781 for ; Tue, 10 Nov 2020 23:29:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050961; bh=meypuo39sRui2/YKEKb9r1QSXStbQSXx9s+M+PX//8g=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CWW9EF2w/uxEe7E2eVBeu4ncW0CS9uFPM/1UAfJpNQ8mkPOQPinqAoYzyx5A0Hdre IP+pP0khn5lTGIjAVQvO7bYFpcl+6eCwvJp8t5c/SKmbMTCq4XAVefSEB+67lyeOHJ LeTZlvy9dN0CzBe40qA7Wb8aYiZhVlNezFid7Le0= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 05/11] SUNRPC: Remove unused function xprt_load_transport() Date: Tue, 10 Nov 2020 18:19:00 -0500 Message-Id: <20201110231906.863446-6-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-5-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Signed-off-by: Trond Myklebust --- include/linux/sunrpc/xprt.h | 1 - net/sunrpc/xprt.c | 15 --------------- 2 files changed, 16 deletions(-) diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index f7b75c72f80e..d2e97ee802af 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -385,7 +385,6 @@ xprt_disable_swap(struct rpc_xprt *xprt) */ int xprt_register_transport(struct xprt_class *type); int xprt_unregister_transport(struct xprt_class *type); -int xprt_load_transport(const char *); int xprt_find_transport_ident(const char *); void xprt_wait_for_reply_request_def(struct rpc_task *task); void xprt_wait_for_reply_request_rtt(struct rpc_task *task); diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 1016265d5e53..9018d73575d6 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -240,21 +240,6 @@ int xprt_find_transport_ident(const char *netid) } EXPORT_SYMBOL_GPL(xprt_find_transport_ident); -/** - * xprt_load_transport - load a transport implementation - * @netid: transport to load - * - * Returns: - * 0: transport successfully loaded - * -ENOENT: transport module not available - */ -int xprt_load_transport(const char *netid) -{ - int ret = xprt_find_transport_ident(netid); - return ret < 0 ? ret : 0; -} -EXPORT_SYMBOL_GPL(xprt_load_transport); - static void xprt_clear_locked(struct rpc_xprt *xprt) { xprt->snd_task = NULL; From patchwork Tue Nov 10 23:19:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895787 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C6A7C138B for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 96D6A207E8 for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="lHFNosMy" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732260AbgKJX3X (ORCPT ); Tue, 10 Nov 2020 18:29:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:39206 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732194AbgKJX3X (ORCPT ); Tue, 10 Nov 2020 18:29:23 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 52558207BB for ; Tue, 10 Nov 2020 23:29:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050962; bh=qCUYhO5IYxLZUSYwh2QuIZ1ptTiACbnbUeP/URbieX4=; h=From:To:Subject:Date:In-Reply-To:References:From; b=lHFNosMylRkalx/Xtj5z+1UFB2ASBsA1jRcjAnxHcjUurJ3udO9p6SZBUIn1/Z0aA FJH/Q3JYYiIiWV1ZP6s9AL2TN/tzV7FWyv+L0ZFp6CATjHiUSApSFqFqC4N+43rQ1y kCxNG7+PCqmcivawbPGV5ab5CT3iWFuzB/qd5vT0= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 06/11] NFSv4/pNFS: Use connections to a DS that are all of the same protocol family Date: Tue, 10 Nov 2020 18:19:01 -0500 Message-Id: <20201110231906.863446-7-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-6-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust If the pNFS metadata server advertises multiple addresses for the same data server, we should try to connect to just one protocol family and transport type on the assumption that homogeneity will improve performance. Signed-off-by: Trond Myklebust --- fs/nfs/pnfs_nfs.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 679767ac258d..7027dac41cc7 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -860,6 +860,9 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv, .addrlen = da->da_addrlen, .servername = clp->cl_hostname, }; + + if (da->da_addr.ss_family != clp->cl_addr.ss_family) + continue; /* Add this address as an alias */ rpc_clnt_add_xprt(clp->cl_rpcclient, &xprt_args, rpc_clnt_test_and_add_xprt, NULL); @@ -920,6 +923,8 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, .data = &xprtdata, }; + if (da->da_addr.ss_family != clp->cl_addr.ss_family) + continue; /** * Test this address for session trunking and * add as an alias From patchwork Tue Nov 10 23:19:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895789 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 760AB16C1 for ; Tue, 10 Nov 2020 23:29:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4ED32207BB for ; Tue, 10 Nov 2020 23:29:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="SvCr5riA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732314AbgKJX3Y (ORCPT ); Tue, 10 Nov 2020 18:29:24 -0500 Received: from mail.kernel.org ([198.145.29.99]:39218 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730894AbgKJX3Y (ORCPT ); Tue, 10 Nov 2020 18:29:24 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 20C1520781 for ; Tue, 10 Nov 2020 23:29:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050963; bh=7ngd8Pccs51h78vSZOwcVyIh4qZHE9XTMMXXkvjhyEA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=SvCr5riAL4i8xaTg7YzFWoR5ncXsqckWlD4g2/iCSqqlALza9a8rKXgkrizcvC+rz mZXZcPEYZ6pXESoe+jm8mkKtlG+9+l1XETNcwZf187i5AWlsnxnbTFswXLkRu5gxib TjWxjyUCDBfcgov423RGyhdyzwCw6rgvQi0eYFZI= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 07/11] pNFS: Add helpers for allocation/free of struct nfs4_pnfs_ds_addr Date: Tue, 10 Nov 2020 18:19:02 -0500 Message-Id: <20201110231906.863446-8-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-7-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> <20201110231906.863446-7-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Signed-off-by: Trond Myklebust --- fs/nfs/pnfs_nfs.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 7027dac41cc7..8c5921be41f8 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -661,6 +661,20 @@ _data_server_lookup_locked(const struct list_head *dsaddrs) return NULL; } +static struct nfs4_pnfs_ds_addr *nfs4_pnfs_ds_addr_alloc(gfp_t gfp_flags) +{ + struct nfs4_pnfs_ds_addr *da = kzalloc(sizeof(*da), gfp_flags); + if (da) + INIT_LIST_HEAD(&da->da_node); + return da; +} + +static void nfs4_pnfs_ds_addr_free(struct nfs4_pnfs_ds_addr *da) +{ + kfree(da->da_remotestr); + kfree(da); +} + static void destroy_ds(struct nfs4_pnfs_ds *ds) { struct nfs4_pnfs_ds_addr *da; @@ -676,8 +690,7 @@ static void destroy_ds(struct nfs4_pnfs_ds *ds) struct nfs4_pnfs_ds_addr, da_node); list_del_init(&da->da_node); - kfree(da->da_remotestr); - kfree(da); + nfs4_pnfs_ds_addr_free(da); } kfree(ds->ds_remotestr); @@ -1094,12 +1107,10 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) } *portstr = '\0'; - da = kzalloc(sizeof(*da), gfp_flags); + da = nfs4_pnfs_ds_addr_alloc(gfp_flags); if (unlikely(!da)) goto out_free_buf; - INIT_LIST_HEAD(&da->da_node); - if (!rpc_pton(net, buf, portstr-buf, (struct sockaddr *)&da->da_addr, sizeof(da->da_addr))) { dprintk("%s: error parsing address %s\n", __func__, buf); From patchwork Tue Nov 10 23:19:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895793 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0C43116C1 for ; Tue, 10 Nov 2020 23:29:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DEBD020809 for ; Tue, 10 Nov 2020 23:29:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="mZDVG2DT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730894AbgKJX30 (ORCPT ); Tue, 10 Nov 2020 18:29:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:39230 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732194AbgKJX3Y (ORCPT ); Tue, 10 Nov 2020 18:29:24 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9C202207BB for ; Tue, 10 Nov 2020 23:29:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050963; bh=U4K+MAtbIQ8FbgZDcJpUpuzaDQ0jYolkmK4uY10ZvN4=; h=From:To:Subject:Date:In-Reply-To:References:From; b=mZDVG2DTB0vQEUQmPAEYloghC4eLVleSt2QbHhLMWYDeMPFeJFgiLLHcjPtVOTx5K f55wj5fiF7Ba5lGKNUgXbenyHS3yFY4vpig/PMPMkumYBPAiZyBbuaNeJoGCvRvZzm 11SLCFuUlgVzDRPynKQQ6ph5tnta7r+SKsPN5A9c= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 08/11] NFSv4/pNFS: Store the transport type in struct nfs4_pnfs_ds_addr Date: Tue, 10 Nov 2020 18:19:03 -0500 Message-Id: <20201110231906.863446-9-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-8-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> <20201110231906.863446-7-trondmy@kernel.org> <20201110231906.863446-8-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust We want to enable RDMA and UDP as valid transport methods if a GETDEVICEINFO call specifies it. Do so by adding a parser for the netid that translates it to an appropriate argument for the RPC transport layer. Signed-off-by: Trond Myklebust --- fs/nfs/pnfs.h | 2 ++ fs/nfs/pnfs_nfs.c | 34 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 2661c44c62db..f618c49697bb 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -51,6 +51,8 @@ struct nfs4_pnfs_ds_addr { size_t da_addrlen; struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */ char *da_remotestr; /* human readable addr+port */ + const char *da_netid; + int da_transport; }; struct nfs4_pnfs_ds { diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 8c5921be41f8..b96ecb395310 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -672,6 +672,7 @@ static struct nfs4_pnfs_ds_addr *nfs4_pnfs_ds_addr_alloc(gfp_t gfp_flags) static void nfs4_pnfs_ds_addr_free(struct nfs4_pnfs_ds_addr *da) { kfree(da->da_remotestr); + kfree(da->da_netid); kfree(da); } @@ -867,13 +868,15 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv, if (!IS_ERR(clp)) { struct xprt_create xprt_args = { - .ident = XPRT_TRANSPORT_TCP, + .ident = da->da_transport, .net = clp->cl_net, .dstaddr = (struct sockaddr *)&da->da_addr, .addrlen = da->da_addrlen, .servername = clp->cl_hostname, }; + if (da->da_transport != clp->cl_proto) + continue; if (da->da_addr.ss_family != clp->cl_addr.ss_family) continue; /* Add this address as an alias */ @@ -883,7 +886,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv, } clp = get_v3_ds_connect(mds_srv, (struct sockaddr *)&da->da_addr, - da->da_addrlen, IPPROTO_TCP, + da->da_addrlen, da->da_transport, timeo, retrans); if (IS_ERR(clp)) continue; @@ -921,7 +924,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, if (!IS_ERR(clp) && clp->cl_mvops->session_trunk) { struct xprt_create xprt_args = { - .ident = XPRT_TRANSPORT_TCP, + .ident = da->da_transport, .net = clp->cl_net, .dstaddr = (struct sockaddr *)&da->da_addr, .addrlen = da->da_addrlen, @@ -936,6 +939,8 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, .data = &xprtdata, }; + if (da->da_transport != clp->cl_proto) + continue; if (da->da_addr.ss_family != clp->cl_addr.ss_family) continue; /** @@ -950,8 +955,9 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, } else { clp = nfs4_set_ds_client(mds_srv, (struct sockaddr *)&da->da_addr, - da->da_addrlen, IPPROTO_TCP, - timeo, retrans, minor_version); + da->da_addrlen, + da->da_transport, timeo, + retrans, minor_version); if (IS_ERR(clp)) continue; @@ -1042,8 +1048,8 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) int nlen, rlen; int tmp[2]; __be32 *p; - char *netid, *match_netid; - size_t len, match_netid_len; + char *netid; + size_t len; char *startsep = ""; char *endsep = ""; @@ -1125,15 +1131,11 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) case AF_INET: ((struct sockaddr_in *)&da->da_addr)->sin_port = port; da->da_addrlen = sizeof(struct sockaddr_in); - match_netid = "tcp"; - match_netid_len = 3; break; case AF_INET6: ((struct sockaddr_in6 *)&da->da_addr)->sin6_port = port; da->da_addrlen = sizeof(struct sockaddr_in6); - match_netid = "tcp6"; - match_netid_len = 4; startsep = "["; endsep = "]"; break; @@ -1144,12 +1146,15 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) goto out_free_da; } - if (nlen != match_netid_len || strncmp(netid, match_netid, nlen)) { - dprintk("%s: ERROR: r_netid \"%s\" != \"%s\"\n", - __func__, netid, match_netid); + da->da_transport = xprt_find_transport_ident(netid); + if (da->da_transport < 0) { + dprintk("%s: ERROR: unknown r_netid \"%s\"\n", + __func__, netid); goto out_free_da; } + da->da_netid = netid; + /* save human readable address */ len = strlen(startsep) + strlen(buf) + strlen(endsep) + 7; da->da_remotestr = kzalloc(len, gfp_flags); @@ -1161,7 +1166,6 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) dprintk("%s: Parsed DS addr %s\n", __func__, da->da_remotestr); kfree(buf); - kfree(netid); return da; out_free_da: From patchwork Tue Nov 10 23:19:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895791 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AB3C7921 for ; Tue, 10 Nov 2020 23:29:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 88DE1207E8 for ; Tue, 10 Nov 2020 23:29:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="Qe3v/9mn" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732319AbgKJX3Z (ORCPT ); Tue, 10 Nov 2020 18:29:25 -0500 Received: from mail.kernel.org ([198.145.29.99]:39218 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730894AbgKJX3Z (ORCPT ); Tue, 10 Nov 2020 18:29:25 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2AB4B2080A for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050964; bh=Kuo8vxYYtb2g77xXco3cdBkx8fXmlpWOfVyr5XBjErA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Qe3v/9mngvpFnZnFbvl8+bJjCgFhOGOBWllab8C0/GAOLnUzoNiCAF+dM/HUJZ7DQ EGqQWxBeMHXHWnTlE4MUSr25r1ZOp5IwPvOA2I++fMTlpbA5YTe27kWPQirf6ZtEoL hD4TvEszkLoMKxuZU0hyPddxKX977sJsBGK3y8Js= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 09/11] pNFS/flexfiles: Fix up layoutstats reporting for non-TCP transports Date: Tue, 10 Nov 2020 18:19:04 -0500 Message-Id: <20201110231906.863446-10-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-9-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> <20201110231906.863446-7-trondmy@kernel.org> <20201110231906.863446-8-trondmy@kernel.org> <20201110231906.863446-9-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Ensure that we report the correct netid when using UDP or RDMA transports to the DSes. Signed-off-by: Trond Myklebust --- fs/nfs/flexfilelayout/flexfilelayout.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index a163533446fa..59ae36bf5cc0 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -2269,7 +2269,6 @@ ff_layout_encode_netaddr(struct xdr_stream *xdr, struct nfs4_pnfs_ds_addr *da) struct sockaddr *sap = (struct sockaddr *)&da->da_addr; char portbuf[RPCBIND_MAXUADDRPLEN]; char addrbuf[RPCBIND_MAXUADDRLEN]; - char *netid; unsigned short port; int len, netid_len; __be32 *p; @@ -2279,18 +2278,13 @@ ff_layout_encode_netaddr(struct xdr_stream *xdr, struct nfs4_pnfs_ds_addr *da) if (ff_layout_ntop4(sap, addrbuf, sizeof(addrbuf)) == 0) return; port = ntohs(((struct sockaddr_in *)sap)->sin_port); - netid = "tcp"; - netid_len = 3; break; case AF_INET6: if (ff_layout_ntop6_noscopeid(sap, addrbuf, sizeof(addrbuf)) == 0) return; port = ntohs(((struct sockaddr_in6 *)sap)->sin6_port); - netid = "tcp6"; - netid_len = 4; break; default: - /* we only support tcp and tcp6 */ WARN_ON_ONCE(1); return; } @@ -2298,8 +2292,9 @@ ff_layout_encode_netaddr(struct xdr_stream *xdr, struct nfs4_pnfs_ds_addr *da) snprintf(portbuf, sizeof(portbuf), ".%u.%u", port >> 8, port & 0xff); len = strlcat(addrbuf, portbuf, sizeof(addrbuf)); + netid_len = strlen(da->da_netid); p = xdr_reserve_space(xdr, 4 + netid_len); - xdr_encode_opaque(p, netid, netid_len); + xdr_encode_opaque(p, da->da_netid, netid_len); p = xdr_reserve_space(xdr, 4 + len); xdr_encode_opaque(p, addrbuf, len); From patchwork Tue Nov 10 23:19:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895797 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AEC8E921 for ; Tue, 10 Nov 2020 23:29:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 87F51207BB for ; Tue, 10 Nov 2020 23:29:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="Li3tj7HL" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732322AbgKJX30 (ORCPT ); Tue, 10 Nov 2020 18:29:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:39244 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732317AbgKJX3Z (ORCPT ); Tue, 10 Nov 2020 18:29:25 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A8C0220809 for ; Tue, 10 Nov 2020 23:29:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050964; bh=xnRrdrGpUEQovCEeWyw5kZVeKgbd9foXoynz1NLM12Q=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Li3tj7HLcqNrmahtmxAKD5jo8J80BnKu8HhWMZPOxlFO0KCIg5/Z85cCWRTHtBGL7 FcxrXBglHjX3mtqXMpvVrh7T7IALBAwa1Y5DOLmBTj8og4GCF+PkOil1JXLdkBikFy YZjjzip8vn7xvTliAkXXDvISaoLFxe500LDkGK/Q= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 10/11] SUNRPC: Fix up open coded kmemdup_nul() Date: Tue, 10 Nov 2020 18:19:05 -0500 Message-Id: <20201110231906.863446-11-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-10-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> <20201110231906.863446-7-trondmy@kernel.org> <20201110231906.863446-8-trondmy@kernel.org> <20201110231906.863446-9-trondmy@kernel.org> <20201110231906.863446-10-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Signed-off-by: Trond Myklebust --- net/sunrpc/xdr.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 71e03b930b70..b1cda6d85ded 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -1942,10 +1942,8 @@ ssize_t xdr_stream_decode_string_dup(struct xdr_stream *xdr, char **str, ret = xdr_stream_decode_opaque_inline(xdr, &p, maxlen); if (ret > 0) { - char *s = kmalloc(ret + 1, gfp_flags); + char *s = kmemdup_nul(p, ret, gfp_flags); if (s != NULL) { - memcpy(s, p, ret); - s[ret] = '\0'; *str = s; return strlen(s); } From patchwork Tue Nov 10 23:19:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: trondmy@kernel.org X-Patchwork-Id: 11895795 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 74E7B138B for ; Tue, 10 Nov 2020 23:29:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 51CB1207BB for ; Tue, 10 Nov 2020 23:29:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="CWxcKoXt" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732264AbgKJX30 (ORCPT ); Tue, 10 Nov 2020 18:29:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:39218 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731657AbgKJX30 (ORCPT ); Tue, 10 Nov 2020 18:29:26 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3617620781 for ; Tue, 10 Nov 2020 23:29:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605050965; bh=1+6bk7j9y7Q8iGihembwdMHIt1iNAhj0G9cagnoabus=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CWxcKoXtcLCjssu0I6Ea9YJgTp64c1lvfTRTGkN/tRHVGnc5DIHtIzwP1YcFmAUt5 PsRQ/mFqwoyo+H3Gq4iPqYfC8yJ8Srdqza56g04xmU8CsEx+hxRqSc9d5LmidusuBs M8FqpceOEC/E99WTctyWJnyl/3J7zQkx6+FpdRSU= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v3 11/11] pNFS: Clean up open coded xdr string decoding Date: Tue, 10 Nov 2020 18:19:06 -0500 Message-Id: <20201110231906.863446-12-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110231906.863446-11-trondmy@kernel.org> References: <20201110231906.863446-1-trondmy@kernel.org> <20201110231906.863446-2-trondmy@kernel.org> <20201110231906.863446-3-trondmy@kernel.org> <20201110231906.863446-4-trondmy@kernel.org> <20201110231906.863446-5-trondmy@kernel.org> <20201110231906.863446-6-trondmy@kernel.org> <20201110231906.863446-7-trondmy@kernel.org> <20201110231906.863446-8-trondmy@kernel.org> <20201110231906.863446-9-trondmy@kernel.org> <20201110231906.863446-10-trondmy@kernel.org> <20201110231906.863446-11-trondmy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Use the existing xdr_stream_decode_string_dup() to safely decode into kmalloced strings. Signed-off-by: Trond Myklebust --- fs/nfs/pnfs_nfs.c | 43 +++++++------------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index b96ecb395310..1babf56faf66 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -1045,9 +1045,8 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) struct nfs4_pnfs_ds_addr *da = NULL; char *buf, *portstr; __be16 port; - int nlen, rlen; + ssize_t nlen, rlen; int tmp[2]; - __be32 *p; char *netid; size_t len; char *startsep = ""; @@ -1055,45 +1054,17 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags) /* r_netid */ - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) + nlen = xdr_stream_decode_string_dup(xdr, &netid, XDR_MAX_NETOBJ, + gfp_flags); + if (unlikely(nlen < 0)) goto out_err; - nlen = be32_to_cpup(p++); - - p = xdr_inline_decode(xdr, nlen); - if (unlikely(!p)) - goto out_err; - - netid = kmalloc(nlen+1, gfp_flags); - if (unlikely(!netid)) - goto out_err; - - netid[nlen] = '\0'; - memcpy(netid, p, nlen); /* r_addr: ip/ip6addr with port in dec octets - see RFC 5665 */ - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) - goto out_free_netid; - rlen = be32_to_cpup(p); - - p = xdr_inline_decode(xdr, rlen); - if (unlikely(!p)) - goto out_free_netid; - /* port is ".ABC.DEF", 8 chars max */ - if (rlen > INET6_ADDRSTRLEN + IPV6_SCOPE_ID_LEN + 8) { - dprintk("%s: Invalid address, length %d\n", __func__, - rlen); + rlen = xdr_stream_decode_string_dup(xdr, &buf, INET6_ADDRSTRLEN + + IPV6_SCOPE_ID_LEN + 8, gfp_flags); + if (unlikely(rlen < 0)) goto out_free_netid; - } - buf = kmalloc(rlen + 1, gfp_flags); - if (!buf) { - dprintk("%s: Not enough memory\n", __func__); - goto out_free_netid; - } - buf[rlen] = '\0'; - memcpy(buf, p, rlen); /* replace port '.' with '-' */ portstr = strrchr(buf, '.');