aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/debugfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/debugfs.c')
-rw-r--r--net/sunrpc/debugfs.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/net/sunrpc/debugfs.c b/net/sunrpc/debugfs.c
index 95ebd76b132d..228bc7e8bca0 100644
--- a/net/sunrpc/debugfs.c
+++ b/net/sunrpc/debugfs.c
@@ -118,12 +118,38 @@ static const struct file_operations tasks_fops = {
118 .release = tasks_release, 118 .release = tasks_release,
119}; 119};
120 120
121static int do_xprt_debugfs(struct rpc_clnt *clnt, struct rpc_xprt *xprt, void *numv)
122{
123 int len;
124 char name[24]; /* enough for "../../rpc_xprt/ + 8 hex digits + NULL */
125 char link[9]; /* enough for 8 hex digits + NULL */
126 int *nump = numv;
127
128 if (IS_ERR_OR_NULL(xprt->debugfs))
129 return 0;
130 len = snprintf(name, sizeof(name), "../../rpc_xprt/%s",
131 xprt->debugfs->d_name.name);
132 if (len > sizeof(name))
133 return -1;
134 if (*nump == 0)
135 strcpy(link, "xprt");
136 else {
137 len = snprintf(link, sizeof(link), "xprt%d", *nump);
138 if (len > sizeof(link))
139 return -1;
140 }
141 if (!debugfs_create_symlink(link, clnt->cl_debugfs, name))
142 return -1;
143 (*nump)++;
144 return 0;
145}
146
121void 147void
122rpc_clnt_debugfs_register(struct rpc_clnt *clnt) 148rpc_clnt_debugfs_register(struct rpc_clnt *clnt)
123{ 149{
124 int len; 150 int len;
125 char name[24]; /* enough for "../../rpc_xprt/ + 8 hex digits + NULL */ 151 char name[9]; /* enough for 8 hex digits + NULL */
126 struct rpc_xprt *xprt; 152 int xprtnum = 0;
127 153
128 /* Already registered? */ 154 /* Already registered? */
129 if (clnt->cl_debugfs || !rpc_clnt_dir) 155 if (clnt->cl_debugfs || !rpc_clnt_dir)
@@ -143,21 +169,7 @@ rpc_clnt_debugfs_register(struct rpc_clnt *clnt)
143 clnt, &tasks_fops)) 169 clnt, &tasks_fops))
144 goto out_err; 170 goto out_err;
145 171
146 rcu_read_lock(); 172 if (rpc_clnt_iterate_for_each_xprt(clnt, do_xprt_debugfs, &xprtnum) < 0)
147 xprt = rcu_dereference(clnt->cl_xprt);
148 /* no "debugfs" dentry? Don't bother with the symlink. */
149 if (IS_ERR_OR_NULL(xprt->debugfs)) {
150 rcu_read_unlock();
151 return;
152 }
153 len = snprintf(name, sizeof(name), "../../rpc_xprt/%s",
154 xprt->debugfs->d_name.name);
155 rcu_read_unlock();
156
157 if (len >= sizeof(name))
158 goto out_err;
159
160 if (!debugfs_create_symlink("xprt", clnt->cl_debugfs, name))
161 goto out_err; 173 goto out_err;
162 174
163 return; 175 return;