NFS: Add sysfs links to sunrpc clients for nfs_clients
authorBenjamin Coddington <bcodding@redhat.com>
Thu, 15 Jun 2023 18:07:27 +0000 (14:07 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 19 Jun 2023 19:04:13 +0000 (15:04 -0400)
For the general and state management nfs_client under each mount, create
symlinks to their respective rpc_client sysfs entries.

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/client.c
fs/nfs/nfs4client.c
fs/nfs/sysfs.c
fs/nfs/sysfs.h
include/linux/sunrpc/clnt.h
net/sunrpc/sysfs.h

index e95672a9bcd671199ad5ca4bca4b55d0fde45955..745c661429f216fc22578e790103252de28e4797 100644 (file)
@@ -628,6 +628,7 @@ int nfs_init_server_rpcclient(struct nfs_server *server,
        if (server->flags & NFS_MOUNT_SOFT)
                server->client->cl_softrtry = 1;
 
+       nfs_sysfs_link_rpc_client(server, server->client, NULL);
        return 0;
 }
 EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient);
@@ -699,6 +700,7 @@ static int nfs_init_server(struct nfs_server *server,
 
        server->nfs_client = clp;
        nfs_sysfs_add_server(server);
+       nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state");
 
        /* Initialise the client representation from the mount data */
        server->flags = ctx->flags;
@@ -1125,6 +1127,9 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
 
        nfs_sysfs_add_server(server);
 
+       nfs_sysfs_link_rpc_client(server,
+               server->nfs_client->cl_rpcclient, "_state");
+
        error = nfs_init_server_rpcclient(server,
                        source->client->cl_timeout,
                        flavor);
index a098a41811d63c13995df02af7df0d787b23fc4a..d9114a754db73c094f44d0527bba9c4492089eae 100644 (file)
@@ -954,6 +954,7 @@ static int nfs4_set_client(struct nfs_server *server,
 
        server->nfs_client = clp;
        nfs_sysfs_add_server(server);
+       nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state");
 
        return 0;
 }
index 0ff24f133a0275ad076691588edc02a6c26454b2..7009de149158a6feda7ae4620f10a807214ae95e 100644 (file)
@@ -216,6 +216,26 @@ void nfs_netns_sysfs_destroy(struct nfs_net *netns)
        }
 }
 
+#define RPC_CLIENT_NAME_SIZE 64
+
+void nfs_sysfs_link_rpc_client(struct nfs_server *server,
+                       struct rpc_clnt *clnt, const char *uniq)
+{
+       char name[RPC_CLIENT_NAME_SIZE];
+       int ret;
+
+       strcpy(name, clnt->cl_program->name);
+       strcat(name, uniq ? uniq : "");
+       strcat(name, "_client");
+
+       ret = sysfs_create_link_nowarn(&server->kobj,
+                                               &clnt->cl_sysfs->kobject, name);
+       if (ret < 0)
+               pr_warn("NFS: can't create link to %s in sysfs (%d)\n",
+                       name, ret);
+}
+EXPORT_SYMBOL_GPL(nfs_sysfs_link_rpc_client);
+
 static void nfs_sysfs_sb_release(struct kobject *kobj)
 {
        /* no-op: why? see lib/kobject.c kobject_cleanup() */
index c9f5e3677eb59c81ed058922c36e5adbc5f20cc1..c5d1990cade50a00c650d4217b5b7c6d5cb08930 100644 (file)
@@ -23,6 +23,8 @@ extern void nfs_sysfs_exit(void);
 void nfs_netns_sysfs_setup(struct nfs_net *netns, struct net *net);
 void nfs_netns_sysfs_destroy(struct nfs_net *netns);
 
+void nfs_sysfs_link_rpc_client(struct nfs_server *server,
+                       struct rpc_clnt *clnt, const char *sysfs_prefix);
 void nfs_sysfs_add_server(struct nfs_server *s);
 void nfs_sysfs_move_server_to_sb(struct super_block *s);
 void nfs_sysfs_move_sb_to_server(struct nfs_server *s);
index 063692cd2a600992d7826816491ec41f1266b599..88cdf6e3012af6f5414960da9a25018c331f9d90 100644 (file)
 #include <linux/sunrpc/xprtmultipath.h>
 
 struct rpc_inode;
-struct rpc_sysfs_client;
+struct rpc_sysfs_client {
+       struct kobject kobject;
+       struct net *net;
+       struct rpc_clnt *clnt;
+       struct rpc_xprt_switch *xprt_switch;
+};
+
 
 /*
  * The high-level client handle
index 6620cebd1037503370008a0022c5641ad1529fa6..d2dd77a0a0e9424ffa681364ae025e59b0f16f21 100644 (file)
@@ -5,13 +5,6 @@
 #ifndef __SUNRPC_SYSFS_H
 #define __SUNRPC_SYSFS_H
 
-struct rpc_sysfs_client {
-       struct kobject kobject;
-       struct net *net;
-       struct rpc_clnt *clnt;
-       struct rpc_xprt_switch *xprt_switch;
-};
-
 struct rpc_sysfs_xprt_switch {
        struct kobject kobject;
        struct net *net;