]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nfs/localio: remove redundant code and simplify LOCALIO enablement
authorMike Snitzer <snitzer@kernel.org>
Sat, 16 Nov 2024 01:41:04 +0000 (20:41 -0500)
committerAnna Schumaker <anna.schumaker@oracle.com>
Tue, 14 Jan 2025 22:05:10 +0000 (17:05 -0500)
Remove nfs_local_enable and nfs_local_disable, instead use
nfs_localio_enable_client and nfs_localio_disable_client.

Discontinue use of the NFS_CS_LOCAL_IO bit in the nfs_client struct's
cl_flags to reflect that LOCALIO is enabled; instead just test if the
net member of the nfs_uuid_t struct is set.

Also remove NFS_CS_LOCAL_IO.

Lastly, remove trace_nfs_local_enable and trace_nfs_local_disable
because comparable traces are available from nfs_localio.ko.

Suggested-by: NeilBrown <neilb@suse.de>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/client.c
fs/nfs/internal.h
fs/nfs/localio.c
fs/nfs/nfstrace.h
fs/nfs_common/nfslocalio.c
include/linux/nfs_fs_sb.h
include/linux/nfslocalio.h

index e83e1ce0461305ca2cb95ed708c33cf82f439066..16530c71fd1524f326fc2255796c9a4fd7e5a143 100644 (file)
@@ -38,7 +38,7 @@
 #include <linux/sunrpc/bc_xprt.h>
 #include <linux/nsproxy.h>
 #include <linux/pid_namespace.h>
-
+#include <linux/nfslocalio.h>
 
 #include "nfs4_fs.h"
 #include "callback.h"
@@ -243,7 +243,7 @@ static void pnfs_init_server(struct nfs_server *server)
  */
 void nfs_free_client(struct nfs_client *clp)
 {
-       nfs_local_disable(clp);
+       nfs_localio_disable_client(clp);
 
        /* -EIO all pending I/O */
        if (!IS_ERR(clp->cl_rpcclient))
index febf289a9e4c4889c8da2ccc0bf270848e599da7..aea8bcfb221bc9de1cd524264b19418eef36dfaf 100644 (file)
@@ -455,7 +455,6 @@ extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode);
 
 #if IS_ENABLED(CONFIG_NFS_LOCALIO)
 /* localio.c */
-extern void nfs_local_disable(struct nfs_client *);
 extern void nfs_local_probe(struct nfs_client *);
 extern struct nfsd_file *nfs_local_open_fh(struct nfs_client *,
                                           const struct cred *,
@@ -472,7 +471,6 @@ extern int nfs_local_commit(struct nfsd_file *,
 extern bool nfs_server_is_local(const struct nfs_client *clp);
 
 #else /* CONFIG_NFS_LOCALIO */
-static inline void nfs_local_disable(struct nfs_client *clp) {}
 static inline void nfs_local_probe(struct nfs_client *clp) {}
 static inline struct nfsd_file *
 nfs_local_open_fh(struct nfs_client *clp, const struct cred *cred,
index 7e432057c3a1f530c2dc832ba32ecd4a96c169c5..4b6bf4ea7d7fc59f900368405576b4af70a96222 100644 (file)
@@ -56,7 +56,7 @@ MODULE_PARM_DESC(localio_O_DIRECT_semantics,
 
 static inline bool nfs_client_is_local(const struct nfs_client *clp)
 {
-       return !!test_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
+       return !!rcu_access_pointer(clp->cl_uuid.net);
 }
 
 bool nfs_server_is_local(const struct nfs_client *clp)
@@ -121,24 +121,6 @@ const struct rpc_program nfslocalio_program = {
        .stats                  = &nfslocalio_rpcstat,
 };
 
-/*
- * nfs_local_enable - enable local i/o for an nfs_client
- */
-static void nfs_local_enable(struct nfs_client *clp)
-{
-       trace_nfs_local_enable(clp);
-       nfs_localio_enable_client(clp);
-}
-
-/*
- * nfs_local_disable - disable local i/o for an nfs_client
- */
-void nfs_local_disable(struct nfs_client *clp)
-{
-       trace_nfs_local_disable(clp);
-       nfs_localio_disable_client(clp);
-}
-
 /*
  * nfs_init_localioclient - Initialise an NFS localio client connection
  */
@@ -194,19 +176,19 @@ void nfs_local_probe(struct nfs_client *clp)
        /* Disallow localio if disabled via sysfs or AUTH_SYS isn't used */
        if (!localio_enabled ||
            clp->cl_rpcclient->cl_auth->au_flavor != RPC_AUTH_UNIX) {
-               nfs_local_disable(clp);
+               nfs_localio_disable_client(clp);
                return;
        }
 
        if (nfs_client_is_local(clp)) {
                /* If already enabled, disable and re-enable */
-               nfs_local_disable(clp);
+               nfs_localio_disable_client(clp);
        }
 
        if (!nfs_uuid_begin(&clp->cl_uuid))
                return;
        if (nfs_server_uuid_is_local(clp))
-               nfs_local_enable(clp);
+               nfs_localio_enable_client(clp);
        nfs_uuid_end(&clp->cl_uuid);
 }
 EXPORT_SYMBOL_GPL(nfs_local_probe);
@@ -748,7 +730,7 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,
 
        if (status != 0) {
                if (status == -EAGAIN)
-                       nfs_local_disable(clp);
+                       nfs_localio_disable_client(clp);
                nfs_local_file_put(localio);
                hdr->task.tk_status = status;
                nfs_local_hdr_release(hdr, call_ops);
index 1eab98c277fab389f5dbdb02683c28fc97655f38..7a058bd8c566e2976e24136e2901fbaa7070daac 100644 (file)
@@ -1714,38 +1714,6 @@ TRACE_EVENT(nfs_local_open_fh,
                )
 );
 
-DECLARE_EVENT_CLASS(nfs_local_client_event,
-               TP_PROTO(
-                       const struct nfs_client *clp
-               ),
-
-               TP_ARGS(clp),
-
-               TP_STRUCT__entry(
-                       __field(unsigned int, protocol)
-                       __string(server, clp->cl_hostname)
-               ),
-
-               TP_fast_assign(
-                       __entry->protocol = clp->rpc_ops->version;
-                       __assign_str(server);
-               ),
-
-               TP_printk(
-                       "server=%s NFSv%u", __get_str(server), __entry->protocol
-               )
-);
-
-#define DEFINE_NFS_LOCAL_CLIENT_EVENT(name) \
-       DEFINE_EVENT(nfs_local_client_event, name, \
-                       TP_PROTO( \
-                               const struct nfs_client *clp \
-                       ), \
-                       TP_ARGS(clp))
-
-DEFINE_NFS_LOCAL_CLIENT_EVENT(nfs_local_enable);
-DEFINE_NFS_LOCAL_CLIENT_EVENT(nfs_local_disable);
-
 DECLARE_EVENT_CLASS(nfs_xdr_event,
                TP_PROTO(
                        const struct xdr_stream *xdr,
index 0decc2fe154c80b546b8d7e0c9adae044a334b41..bad7691e32b94d1a3104ebff2644c7e49b0ba85d 100644 (file)
@@ -37,7 +37,7 @@ static LIST_HEAD(nfs_uuids);
 
 void nfs_uuid_init(nfs_uuid_t *nfs_uuid)
 {
-       nfs_uuid->net = NULL;
+       RCU_INIT_POINTER(nfs_uuid->net, NULL);
        nfs_uuid->dom = NULL;
        nfs_uuid->list_lock = NULL;
        INIT_LIST_HEAD(&nfs_uuid->list);
@@ -49,7 +49,7 @@ EXPORT_SYMBOL_GPL(nfs_uuid_init);
 bool nfs_uuid_begin(nfs_uuid_t *nfs_uuid)
 {
        spin_lock(&nfs_uuid->lock);
-       if (nfs_uuid->net) {
+       if (rcu_access_pointer(nfs_uuid->net)) {
                /* This nfs_uuid is already in use */
                spin_unlock(&nfs_uuid->lock);
                return false;
@@ -74,9 +74,9 @@ EXPORT_SYMBOL_GPL(nfs_uuid_begin);
 
 void nfs_uuid_end(nfs_uuid_t *nfs_uuid)
 {
-       if (nfs_uuid->net == NULL) {
+       if (!rcu_access_pointer(nfs_uuid->net)) {
                spin_lock(&nfs_uuid->lock);
-               if (nfs_uuid->net == NULL) {
+               if (!rcu_access_pointer(nfs_uuid->net)) {
                        /* Not local, remove from nfs_uuids */
                        spin_lock(&nfs_uuids_lock);
                        list_del_init(&nfs_uuid->list);
@@ -139,12 +139,8 @@ EXPORT_SYMBOL_GPL(nfs_uuid_is_local);
 
 void nfs_localio_enable_client(struct nfs_client *clp)
 {
-       nfs_uuid_t *nfs_uuid = &clp->cl_uuid;
-
-       spin_lock(&nfs_uuid->lock);
-       set_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
+       /* nfs_uuid_is_local() does the actual enablement */
        trace_nfs_localio_enable_client(clp);
-       spin_unlock(&nfs_uuid->lock);
 }
 EXPORT_SYMBOL_GPL(nfs_localio_enable_client);
 
@@ -152,15 +148,15 @@ EXPORT_SYMBOL_GPL(nfs_localio_enable_client);
  * Cleanup the nfs_uuid_t embedded in an nfs_client.
  * This is the long-form of nfs_uuid_init().
  */
-static void nfs_uuid_put(nfs_uuid_t *nfs_uuid)
+static bool nfs_uuid_put(nfs_uuid_t *nfs_uuid)
 {
        LIST_HEAD(local_files);
        struct nfs_file_localio *nfl, *tmp;
 
        spin_lock(&nfs_uuid->lock);
-       if (unlikely(!nfs_uuid->net)) {
+       if (unlikely(!rcu_access_pointer(nfs_uuid->net))) {
                spin_unlock(&nfs_uuid->lock);
-               return;
+               return false;
        }
        RCU_INIT_POINTER(nfs_uuid->net, NULL);
 
@@ -192,22 +188,14 @@ static void nfs_uuid_put(nfs_uuid_t *nfs_uuid)
 
        module_put(nfsd_mod);
        spin_unlock(&nfs_uuid->lock);
+
+       return true;
 }
 
 void nfs_localio_disable_client(struct nfs_client *clp)
 {
-       nfs_uuid_t *nfs_uuid = NULL;
-
-       spin_lock(&clp->cl_uuid.lock); /* aka &nfs_uuid->lock */
-       if (test_and_clear_bit(NFS_CS_LOCAL_IO, &clp->cl_flags)) {
-               /* &clp->cl_uuid is always not NULL, using as bool here */
-               nfs_uuid = &clp->cl_uuid;
+       if (nfs_uuid_put(&clp->cl_uuid))
                trace_nfs_localio_disable_client(clp);
-       }
-       spin_unlock(&clp->cl_uuid.lock);
-
-       if (nfs_uuid)
-               nfs_uuid_put(nfs_uuid);
 }
 EXPORT_SYMBOL_GPL(nfs_localio_disable_client);
 
index 239d86ef166c0bd6ba412e13f142410a5ecdacc6..ed66df1093e893515f6e460c74e64ec03a30dd20 100644 (file)
@@ -50,7 +50,6 @@ struct nfs_client {
 #define NFS_CS_DS              7               /* - Server is a DS */
 #define NFS_CS_REUSEPORT       8               /* - reuse src port on reconnect */
 #define NFS_CS_PNFS            9               /* - Server used for pnfs */
-#define NFS_CS_LOCAL_IO                10              /* - client is local */
        struct sockaddr_storage cl_addr;        /* server identifier */
        size_t                  cl_addrlen;
        char *                  cl_hostname;    /* hostname of server */
index c68a529230c14565754ca234aa7bd5fcde5fb021..05817d6ef3d1e34efe91ec8bd28186bd4c18b829 100644 (file)
@@ -111,6 +111,10 @@ static inline void nfs_close_local_fh(struct nfs_file_localio *nfl)
 static inline void nfsd_localio_ops_init(void)
 {
 }
+struct nfs_client;
+static inline void nfs_localio_disable_client(struct nfs_client *clp)
+{
+}
 
 #endif  /* CONFIG_NFS_LOCALIO */