sunrpc: add a symlink from rpc-client directory to the xprt_switch
authorOlga Kornievskaia <kolga@netapp.com>
Tue, 8 Jun 2021 19:59:17 +0000 (15:59 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 8 Jul 2021 18:03:23 +0000 (14:03 -0400)
An rpc client uses a transport switch and one ore more transports
associated with that switch. Since transports are shared among
rpc clients, create a symlink into the xprt_switch directory
instead of duplicating entries under each rpc client.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/clnt.c
net/sunrpc/sysfs.c
net/sunrpc/sysfs.h

index 6f3f840..9bf820b 100644 (file)
@@ -301,7 +301,6 @@ static int rpc_client_register(struct rpc_clnt *clnt,
        int err;
 
        rpc_clnt_debugfs_register(clnt);
-       rpc_sysfs_client_setup(clnt, net);
 
        pipefs_sb = rpc_get_sb_net(net);
        if (pipefs_sb) {
@@ -426,6 +425,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
        /* save the nodename */
        rpc_clnt_set_nodename(clnt, nodename);
 
+       rpc_sysfs_client_setup(clnt, xps, rpc_net_ns(clnt));
        err = rpc_client_register(clnt, args->authflavor, args->client_name);
        if (err)
                goto out_no_path;
index ed9f713..0aa6374 100644 (file)
@@ -151,14 +151,29 @@ rpc_sysfs_xprt_switch_alloc(struct kobject *parent,
        return NULL;
 }
 
-void rpc_sysfs_client_setup(struct rpc_clnt *clnt, struct net *net)
+void rpc_sysfs_client_setup(struct rpc_clnt *clnt,
+                           struct rpc_xprt_switch *xprt_switch,
+                           struct net *net)
 {
        struct rpc_sysfs_client *rpc_client;
 
-       rpc_client = rpc_sysfs_client_alloc(rpc_sunrpc_client_kobj, net, clnt->cl_clid);
+       rpc_client = rpc_sysfs_client_alloc(rpc_sunrpc_client_kobj,
+                                           net, clnt->cl_clid);
        if (rpc_client) {
+               char name[] = "switch";
+               struct rpc_sysfs_xprt_switch *xswitch =
+                       (struct rpc_sysfs_xprt_switch *)xprt_switch->xps_sysfs;
+               int ret;
+
                clnt->cl_sysfs = rpc_client;
+               rpc_client->clnt = clnt;
+               rpc_client->xprt_switch = xprt_switch;
                kobject_uevent(&rpc_client->kobject, KOBJ_ADD);
+               ret = sysfs_create_link_nowarn(&rpc_client->kobject,
+                                              &xswitch->kobject, name);
+               if (ret)
+                       pr_warn("can't create link to %s in sysfs (%d)\n",
+                               name, ret);
        }
 }
 
@@ -189,6 +204,9 @@ void rpc_sysfs_client_destroy(struct rpc_clnt *clnt)
        struct rpc_sysfs_client *rpc_client = clnt->cl_sysfs;
 
        if (rpc_client) {
+               char name[] = "switch";
+
+               sysfs_remove_link(&rpc_client->kobject, name);
                kobject_uevent(&rpc_client->kobject, KOBJ_REMOVE);
                kobject_del(&rpc_client->kobject);
                kobject_put(&rpc_client->kobject);
index 52ec472..760f058 100644 (file)
@@ -8,6 +8,8 @@
 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 {
@@ -20,7 +22,9 @@ struct rpc_sysfs_xprt_switch {
 int rpc_sysfs_init(void);
 void rpc_sysfs_exit(void);
 
-void rpc_sysfs_client_setup(struct rpc_clnt *clnt, struct net *net);
+void rpc_sysfs_client_setup(struct rpc_clnt *clnt,
+                           struct rpc_xprt_switch *xprt_switch,
+                           struct net *net);
 void rpc_sysfs_client_destroy(struct rpc_clnt *clnt);
 void rpc_sysfs_xprt_switch_setup(struct rpc_xprt_switch *xprt_switch,
                                 struct rpc_xprt *xprt, gfp_t gfp_flags);