NFS: Add sysfs links to sunrpc clients for nfs_clients

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>
This commit is contained in:
Benjamin Coddington 2023-06-15 14:07:27 -04:00 committed by Trond Myklebust
parent 1c7251187d
commit e13b549319
6 changed files with 35 additions and 8 deletions

View File

@ -628,6 +628,7 @@ int nfs_init_server_rpcclient(struct nfs_server *server,
if (server->flags & NFS_MOUNT_SOFT) if (server->flags & NFS_MOUNT_SOFT)
server->client->cl_softrtry = 1; server->client->cl_softrtry = 1;
nfs_sysfs_link_rpc_client(server, server->client, NULL);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient); EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient);
@ -699,6 +700,7 @@ static int nfs_init_server(struct nfs_server *server,
server->nfs_client = clp; server->nfs_client = clp;
nfs_sysfs_add_server(server); nfs_sysfs_add_server(server);
nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state");
/* Initialise the client representation from the mount data */ /* Initialise the client representation from the mount data */
server->flags = ctx->flags; 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_add_server(server);
nfs_sysfs_link_rpc_client(server,
server->nfs_client->cl_rpcclient, "_state");
error = nfs_init_server_rpcclient(server, error = nfs_init_server_rpcclient(server,
source->client->cl_timeout, source->client->cl_timeout,
flavor); flavor);

View File

@ -954,6 +954,7 @@ static int nfs4_set_client(struct nfs_server *server,
server->nfs_client = clp; server->nfs_client = clp;
nfs_sysfs_add_server(server); nfs_sysfs_add_server(server);
nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state");
return 0; return 0;
} }

View 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) static void nfs_sysfs_sb_release(struct kobject *kobj)
{ {
/* no-op: why? see lib/kobject.c kobject_cleanup() */ /* no-op: why? see lib/kobject.c kobject_cleanup() */

View 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_setup(struct nfs_net *netns, struct net *net);
void nfs_netns_sysfs_destroy(struct nfs_net *netns); 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_add_server(struct nfs_server *s);
void nfs_sysfs_move_server_to_sb(struct super_block *s); void nfs_sysfs_move_server_to_sb(struct super_block *s);
void nfs_sysfs_move_sb_to_server(struct nfs_server *s); void nfs_sysfs_move_sb_to_server(struct nfs_server *s);

View File

@ -30,7 +30,13 @@
#include <linux/sunrpc/xprtmultipath.h> #include <linux/sunrpc/xprtmultipath.h>
struct rpc_inode; 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 * The high-level client handle

View File

@ -5,13 +5,6 @@
#ifndef __SUNRPC_SYSFS_H #ifndef __SUNRPC_SYSFS_H
#define __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 rpc_sysfs_xprt_switch {
struct kobject kobject; struct kobject kobject;
struct net *net; struct net *net;