From: Mike Snitzer <snitzer@kernel.org>
To: linux-nfs@vger.kernel.org
Cc: Jeff Layton <jlayton@kernel.org>,
Chuck Lever <chuck.lever@oracle.com>,
Trond Myklebust <trondmy@hammerspace.com>,
snitzer@hammerspace.com
Subject: [for-6.11 PATCH 20/29] nfs/localio: discontinue network address based localio setup
Date: Fri, 7 Jun 2024 10:26:37 -0400 [thread overview]
Message-ID: <20240607142646.20924-21-snitzer@kernel.org> (raw)
In-Reply-To: <20240607142646.20924-1-snitzer@kernel.org>
Prepares for determining localio via client and server handshake.
The primary reason to avoid the current approach of probing all local
network interfaces for the client (during nfs_alloc_client) to use as
the basis for _inferring_ that client's server is local
(in nfs_local_probe) is: matching IP addresses is brittle, especially
so when you have network namespaces (i.e. containers), or when you
play games with NAT or iptables.
This commit also reverts an earlier commit ("sunrpc: add and export
rpc_ntop6_addr_noscopeid") which was only needed/useful in the context
of localio's sockaddr based matching.
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
---
fs/nfs/client.c | 9 --
fs/nfs/flexfilelayout/flexfilelayoutdev.c | 21 +---
fs/nfs/internal.h | 7 --
fs/nfs/localio.c | 145 +---------------------
include/linux/nfs_fs_sb.h | 1 -
include/linux/sunrpc/addr.h | 9 --
net/sunrpc/addr.c | 19 +--
7 files changed, 8 insertions(+), 203 deletions(-)
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 288de750fd3b..c42faaed508c 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -170,7 +170,6 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
}
INIT_LIST_HEAD(&clp->cl_superblocks);
- INIT_LIST_HEAD(&clp->cl_local_addrs);
clp->cl_rpcclient = ERR_PTR(-EINVAL);
clp->cl_flags = cl_init->init_flags;
@@ -184,7 +183,6 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
clp->cl_principal = "*";
clp->cl_xprtsec = cl_init->xprtsec;
- nfs_probe_local_addr(clp);
return clp;
error_cleanup:
@@ -238,19 +236,12 @@ static void pnfs_init_server(struct nfs_server *server)
*/
void nfs_free_client(struct nfs_client *clp)
{
- struct nfs_local_addr *addr, *tmp;
-
nfs_local_disable(clp);
/* -EIO all pending I/O */
if (!IS_ERR(clp->cl_rpcclient))
rpc_shutdown_client(clp->cl_rpcclient);
- list_for_each_entry_safe(addr, tmp, &clp->cl_local_addrs, cl_addrs) {
- list_del(&addr->cl_addrs);
- kfree(addr);
- }
-
put_net(clp->cl_net);
put_nfs_version(clp->cl_nfs_mod);
kfree(clp->cl_hostname);
diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
index af329d9b7d1e..e58bedfb1dcc 100644
--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
@@ -348,22 +348,6 @@ ff_layout_init_mirror_ds(struct pnfs_layout_hdr *lo,
return false;
}
-static bool ff_layout_ds_is_local(struct nfs4_pnfs_ds *ds)
-{
- struct nfs_local_addr *addr;
- struct sockaddr *sap;
- struct nfs4_pnfs_ds_addr *da;
-
- list_for_each_entry(da, &ds->ds_addrs, da_node) {
- sap = (struct sockaddr *)&da->da_addr;
- list_for_each_entry(addr, &ds->ds_clp->cl_local_addrs, cl_addrs)
- if (rpc_cmp_addr((struct sockaddr *)&addr->address, sap))
- return true;
- }
-
- return false;
-}
-
/**
* nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call
* @lseg: the layout segment we're operating on
@@ -416,10 +400,7 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,
* keep ds_clp even if DS is local, so that if local IO cannot
* proceed somehow, we can fall back to NFS whenever we want.
*/
- if (ff_layout_ds_is_local(ds)) {
- dprintk("%s: found local DS\n", __func__);
- nfs_local_enable(ds->ds_clp);
- }
+ nfs_local_probe(ds->ds_clp);
max_payload =
nfs_block_size(rpc_max_payload(ds->ds_clp->cl_rpcclient),
NULL);
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 0927a1704bbb..6d75466ad356 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -204,12 +204,6 @@ struct nfs_mount_request {
struct net *net;
};
-struct nfs_local_addr {
- struct list_head cl_addrs;
- struct sockaddr_storage address;
- size_t addrlen;
-};
-
extern int nfs_mount(struct nfs_mount_request *info, int timeo, int retrans);
extern void nfs_umount(const struct nfs_mount_request *info);
@@ -475,7 +469,6 @@ extern int nfs_local_doio(struct nfs_client *, struct file *,
extern int nfs_local_commit(struct nfs_client *, struct file *,
struct nfs_commit_data *,
const struct rpc_call_ops *, int);
-extern void nfs_probe_local_addr(struct nfs_client *clnt);
extern bool nfs_server_is_local(const struct nfs_client *clp);
/* super.c */
diff --git a/fs/nfs/localio.c b/fs/nfs/localio.c
index d724f8d4dd65..96349b6e7585 100644
--- a/fs/nfs/localio.c
+++ b/fs/nfs/localio.c
@@ -20,8 +20,6 @@
#include <linux/nfs_fs.h>
#include <linux/nfs_xdr.h>
-#include <uapi/linux/if_arp.h>
-
#include "internal.h"
#include "pnfs.h"
#include "nfstrace.h"
@@ -216,7 +214,6 @@ nfs_local_enable(struct nfs_client *clp)
trace_nfs_local_enable(clp);
}
}
-EXPORT_SYMBOL_GPL(nfs_local_enable);
/*
* nfs_local_disable - disable local i/o for an nfs_client
@@ -236,50 +233,12 @@ nfs_local_disable(struct nfs_client *clp)
void
nfs_local_probe(struct nfs_client *clp)
{
- struct sockaddr_in *sin;
- struct sockaddr_in6 *sin6;
- struct nfs_local_addr *addr;
- struct sockaddr *sap;
bool enable = false;
- switch (clp->cl_addr.ss_family) {
- case AF_INET:
- sin = (struct sockaddr_in *)&clp->cl_addr;
- if (ipv4_is_loopback(sin->sin_addr.s_addr)) {
- dprintk("%s: detected IPv4 loopback address\n",
- __func__);
- enable = true;
- }
- break;
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)&clp->cl_addr;
- if (memcmp(&sin6->sin6_addr, &in6addr_loopback,
- sizeof(struct in6_addr)) == 0) {
- dprintk("%s: detected IPv6 loopback address\n",
- __func__);
- enable = true;
- }
- break;
- default:
- break;
- }
-
- if (enable)
- goto out;
-
- list_for_each_entry(addr, &clp->cl_local_addrs, cl_addrs) {
- sap = (struct sockaddr *)&addr->address;
- if (rpc_cmp_addr((struct sockaddr *)&clp->cl_addr, sap)) {
- dprintk("%s: detected local server.\n", __func__);
- enable = true;
- break;
- }
- }
-
-out:
if (enable)
nfs_local_enable(clp);
}
+EXPORT_SYMBOL_GPL(nfs_local_probe);
/*
* nfs_local_open_fh - open a local filehandle
@@ -880,105 +839,3 @@ nfs_local_commit(struct nfs_client *clp, struct file *filp,
nfs_local_fsync_ctx_put(ctx);
return 0;
}
-
-static int
-nfs_client_add_addr(struct nfs_client *clnt, char *buf, gfp_t flags)
-{
- struct nfs_local_addr *addr;
- struct sockaddr *sap;
-
- dprintk("%s: adding new local IP %s\n", __func__, buf);
- addr = kmalloc(sizeof(*addr), flags);
- if (!addr) {
- printk(KERN_WARNING "NFS: cannot alloc new addr\n");
- return -ENOMEM;
- }
- sap = (struct sockaddr *)&addr->address;
- addr->addrlen = rpc_pton(clnt->cl_net, buf, strlen(buf),
- sap, sizeof(addr->address));
- if (!addr->addrlen) {
- printk(KERN_WARNING "NFS: cannot parse new addr %s\n",
- buf);
- kfree(addr);
- return -EINVAL;
- }
- list_add(&addr->cl_addrs, &clnt->cl_local_addrs);
-
- return 0;
-}
-
-static int
-nfs_client_add_v4_addr(struct nfs_client *clnt, struct in_device *indev,
- char *buf, size_t buflen)
-{
- struct in_ifaddr *ifa;
- int ret;
-
- in_dev_for_each_ifa_rtnl(ifa, indev) {
- snprintf(buf, buflen, "%pI4", &ifa->ifa_local);
- ret = nfs_client_add_addr(clnt, buf, GFP_KERNEL);
- if (ret < 0)
- return ret;
- }
-
- return 0;
-}
-
-#if IS_ENABLED(CONFIG_IPV6)
-static int
-nfs_client_add_v6_addr(struct nfs_client *clnt, struct inet6_dev *in6dev,
- char *buf, size_t buflen)
-{
- struct inet6_ifaddr *ifp;
- int ret = 0;
-
- read_lock_bh(&in6dev->lock);
- list_for_each_entry(ifp, &in6dev->addr_list, if_list) {
- rpc_ntop6_addr_noscopeid(&ifp->addr, buf, buflen);
- ret = nfs_client_add_addr(clnt, buf, GFP_ATOMIC);
- if (ret < 0)
- goto out;
- }
-out:
- read_unlock_bh(&in6dev->lock);
- return ret;
-}
-#else /* CONFIG_IPV6 */
-static int
-nfs_client_add_v6_addr(struct nfs_client *clnt, struct inet6_dev *in6dev,
- char *buf, size_t buflen)
-{
- return 0;
-}
-#endif
-
-/* Find out all local IP addresses. Ignore errors
- * because local IO can be optional.
- */
-void
-nfs_probe_local_addr(struct nfs_client *clnt)
-{
- struct net_device *dev;
- struct in_device *indev;
- struct inet6_dev *in6dev;
- char buf[INET6_ADDRSTRLEN + IPV6_SCOPE_ID_LEN];
- size_t buflen = sizeof(buf);
-
- rtnl_lock();
-
- for_each_netdev(clnt->cl_net, dev) {
- if (dev->type == ARPHRD_LOOPBACK ||
- !(dev->flags & IFF_UP))
- continue;
- indev = __in_dev_get_rtnl(dev);
- if (indev &&
- nfs_client_add_v4_addr(clnt, indev, buf, buflen) < 0)
- break;
- in6dev = __in6_dev_get(dev);
- if (in6dev &&
- nfs_client_add_v6_addr(clnt, in6dev, buf, buflen) < 0)
- break;
- }
-
- rtnl_unlock();
-}
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index 6b603b0247f1..00fe469bc72e 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -56,7 +56,6 @@ struct nfs_client {
char * cl_acceptor; /* GSSAPI acceptor name */
struct list_head cl_share_link; /* link in global client list */
struct list_head cl_superblocks; /* List of nfs_server structs */
- struct list_head cl_local_addrs; /* List of local addresses */
struct rpc_clnt * cl_rpcclient;
const struct nfs_rpc_ops *rpc_ops; /* NFS protocol vector */
diff --git a/include/linux/sunrpc/addr.h b/include/linux/sunrpc/addr.h
index e1007bddc3c4..07d454873b6d 100644
--- a/include/linux/sunrpc/addr.h
+++ b/include/linux/sunrpc/addr.h
@@ -68,9 +68,6 @@ static inline bool __rpc_copy_addr4(struct sockaddr *dst,
}
#if IS_ENABLED(CONFIG_IPV6)
-extern size_t rpc_ntop6_addr_noscopeid(const struct in6_addr *addr,
- char *buf, const int buflen);
-
static inline bool rpc_cmp_addr6(const struct sockaddr *sap1,
const struct sockaddr *sap2)
{
@@ -97,12 +94,6 @@ static inline bool __rpc_copy_addr6(struct sockaddr *dst,
return true;
}
#else /* !(IS_ENABLED(CONFIG_IPV6) */
-static size_t rpc_ntop6_addr_noscopeid(const struct in6_addr *addr,
- char *buf, const int buflen)
-{
- return 0;
-}
-
static inline bool rpc_cmp_addr6(const struct sockaddr *sap1,
const struct sockaddr *sap2)
{
diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c
index 78a123a7c39b..97ff11973c49 100644
--- a/net/sunrpc/addr.c
+++ b/net/sunrpc/addr.c
@@ -25,9 +25,12 @@
#if IS_ENABLED(CONFIG_IPV6)
-size_t rpc_ntop6_addr_noscopeid(const struct in6_addr *addr,
- char *buf, const int buflen)
+static size_t rpc_ntop6_noscopeid(const struct sockaddr *sap,
+ char *buf, const int buflen)
{
+ const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ const struct in6_addr *addr = &sin6->sin6_addr;
+
/*
* RFC 4291, Section 2.2.2
*
@@ -52,23 +55,13 @@ size_t rpc_ntop6_addr_noscopeid(const struct in6_addr *addr,
*/
if (ipv6_addr_v4mapped(addr))
return snprintf(buf, buflen, "::ffff:%pI4",
- &addr->s6_addr32[3]);
+ &addr->s6_addr32[3]);
/*
* RFC 4291, Section 2.2.1
*/
return snprintf(buf, buflen, "%pI6c", addr);
}
-EXPORT_SYMBOL_GPL(rpc_ntop6_addr_noscopeid);
-
-static size_t rpc_ntop6_noscopeid(const struct sockaddr *sap,
- char *buf, const int buflen)
-{
- const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
- const struct in6_addr *addr = &sin6->sin6_addr;
-
- return rpc_ntop6_addr_noscopeid(addr, buf, buflen);
-}
static size_t rpc_ntop6(const struct sockaddr *sap,
char *buf, const size_t buflen)
--
2.44.0
next prev parent reply other threads:[~2024-06-07 14:27 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-07 14:26 [for-6.11 PATCH 00/29] nfs/nfsd: add support for localio bypass Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 01/29] nfs: pass nfs_client to nfs_initiate_pgio Mike Snitzer
2024-06-10 12:02 ` Jeff Layton
2024-06-07 14:26 ` [for-6.11 PATCH 02/29] nfs: pass nfs_client to nfs_initiate_commit Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 03/29] nfs: pass descriptor thru nfs_initiate_pgio path Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 04/29] sunrpc: handle NULL req->defer in cache_defer_req Mike Snitzer
2024-06-10 12:21 ` Jeff Layton
2024-06-11 1:03 ` NeilBrown
2024-06-11 2:57 ` Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 05/29] sunrpc: export svc_defer Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 06/29] sunrpc: add rpcauth_map_to_svc_cred Mike Snitzer
2024-06-10 12:19 ` Jeff Layton
2024-06-07 14:26 ` [for-6.11 PATCH 07/29] sunrpc: add and export rpc_ntop6_addr_noscopeid Mike Snitzer
2024-06-09 12:36 ` Jeff Layton
2024-06-10 16:33 ` Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 08/29] nfs: move nfs_stat_to_errno to nfs.h Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 09/29] NFS: Manage boot verifier correctly in the case of localio Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 10/29] nfs/nfsd: add "local io" support Mike Snitzer
2024-06-10 12:43 ` Jeff Layton
2024-06-10 16:42 ` Mike Snitzer
2024-06-12 2:25 ` Mike Snitzer
2024-06-12 3:17 ` NeilBrown
2024-06-12 3:41 ` Mike Snitzer
2024-06-12 4:09 ` NeilBrown
2024-06-12 4:48 ` Mike Snitzer
2024-06-12 6:30 ` NeilBrown
2024-06-07 14:26 ` [for-6.11 PATCH 11/29] NFS: Enable localio for non-pNFS I/O Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 12/29] nfs/flexfiles: check local DS when making DS connections Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 13/29] pnfs/flexfiles: Enable localio for flexfiles I/O Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 14/29] NFS: Add tracepoints for nfs_local_enable and nfs_local_disable Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 15/29] NFS: Don't call filesystem write() routines directly Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 16/29] NFS: Don't call filesystem read() " Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 17/29] NFS: Use completion rather than flush_work() in nfs_local_commit() Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 18/29] NFS: localio writes need to use a normal workqueue Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 19/29] nfs/write: fix nfs_initiate_commit to return error from nfs_local_commit Mike Snitzer
2024-06-07 14:26 ` Mike Snitzer [this message]
2024-06-07 14:26 ` [for-6.11 PATCH 21/29] nfs_common: add NFS v3 LOCALIO protocol extension enablement Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 22/29] nfs: implement v3 client support for NFS_LOCALIO_PROGRAM Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 23/29] nfsd: implement v3 server " Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 24/29] nfs_common: add NFS v4 LOCALIO protocol extension enablement Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 25/29] nfs: implement v4 client support for NFS_LOCALIO_PROGRAM Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 26/29] nfsd: implement v4 server " Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 27/29] nfs/nfsd: switch GETUUID to using {encode,decode}_opaque_fixed Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 28/29] nfs/nfsd: consolidate {encode,decode}_opaque_fixed in nfs_xdr.h Mike Snitzer
2024-06-07 14:26 ` [for-6.11 PATCH 29/29] nfs/localio: move managing nfsd_open_local_fh symbol to nfs_common Mike Snitzer
2024-06-07 18:06 ` [for-6.11 PATCH 30/29] nfs/nfsd: ensure localio server always uses its network namespace Mike Snitzer
2024-06-09 15:44 ` Chuck Lever
2024-06-10 16:50 ` Mike Snitzer
2024-06-10 22:37 ` Mike Snitzer
2024-06-07 18:09 ` [for-6.11 PATCH 00/29] nfs/nfsd: add support for localio bypass Mike Snitzer
2024-06-10 12:47 ` Jeff Layton
2024-06-10 16:47 ` Mike Snitzer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240607142646.20924-21-snitzer@kernel.org \
--to=snitzer@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=snitzer@hammerspace.com \
--cc=trondmy@hammerspace.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox