hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/sunrpc/debugfs.c
....@@ -1,5 +1,5 @@
11 // SPDX-License-Identifier: GPL-2.0
2
-/**
2
+/*
33 * debugfs interface for sunrpc
44 *
55 * (c) 2014 Jeff Layton <jlayton@primarydata.com>
....@@ -11,7 +11,6 @@
1111 #include "netns.h"
1212
1313 static struct dentry *topdir;
14
-static struct dentry *rpc_fault_dir;
1514 static struct dentry *rpc_clnt_dir;
1615 static struct dentry *rpc_xprt_dir;
1716
....@@ -33,7 +32,7 @@
3332
3433 seq_printf(f, "%5u %04x %6d 0x%x 0x%x %8ld %ps %sv%u %s a:%ps q:%s\n",
3534 task->tk_pid, task->tk_flags, task->tk_status,
36
- clnt->cl_clid, xid, task->tk_timeout, task->tk_ops,
35
+ clnt->cl_clid, xid, rpc_task_timeout(task), task->tk_ops,
3736 clnt->cl_program->name, clnt->cl_vers, rpc_proc_name(task),
3837 task->tk_action, rpc_waitq);
3938 return 0;
....@@ -118,16 +117,37 @@
118117 .release = tasks_release,
119118 };
120119
120
+static int do_xprt_debugfs(struct rpc_clnt *clnt, struct rpc_xprt *xprt, void *numv)
121
+{
122
+ int len;
123
+ char name[24]; /* enough for "../../rpc_xprt/ + 8 hex digits + NULL */
124
+ char link[9]; /* enough for 8 hex digits + NULL */
125
+ int *nump = numv;
126
+
127
+ if (IS_ERR_OR_NULL(xprt->debugfs))
128
+ return 0;
129
+ len = snprintf(name, sizeof(name), "../../rpc_xprt/%s",
130
+ xprt->debugfs->d_name.name);
131
+ if (len >= sizeof(name))
132
+ return -1;
133
+ if (*nump == 0)
134
+ strcpy(link, "xprt");
135
+ else {
136
+ len = snprintf(link, sizeof(link), "xprt%d", *nump);
137
+ if (len >= sizeof(link))
138
+ return -1;
139
+ }
140
+ debugfs_create_symlink(link, clnt->cl_debugfs, name);
141
+ (*nump)++;
142
+ return 0;
143
+}
144
+
121145 void
122146 rpc_clnt_debugfs_register(struct rpc_clnt *clnt)
123147 {
124148 int len;
125
- char name[24]; /* enough for "../../rpc_xprt/ + 8 hex digits + NULL */
126
- struct rpc_xprt *xprt;
127
-
128
- /* Already registered? */
129
- if (clnt->cl_debugfs || !rpc_clnt_dir)
130
- return;
149
+ char name[9]; /* enough for 8 hex digits + NULL */
150
+ int xprtnum = 0;
131151
132152 len = snprintf(name, sizeof(name), "%x", clnt->cl_clid);
133153 if (len >= sizeof(name))
....@@ -135,35 +155,12 @@
135155
136156 /* make the per-client dir */
137157 clnt->cl_debugfs = debugfs_create_dir(name, rpc_clnt_dir);
138
- if (!clnt->cl_debugfs)
139
- return;
140158
141159 /* make tasks file */
142
- if (!debugfs_create_file("tasks", S_IFREG | 0400, clnt->cl_debugfs,
143
- clnt, &tasks_fops))
144
- goto out_err;
160
+ debugfs_create_file("tasks", S_IFREG | 0400, clnt->cl_debugfs, clnt,
161
+ &tasks_fops);
145162
146
- rcu_read_lock();
147
- xprt = rcu_dereference(clnt->cl_xprt);
148
- /* no "debugfs" dentry? Don't bother with the symlink. */
149
- if (!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;
162
-
163
- return;
164
-out_err:
165
- debugfs_remove_recursive(clnt->cl_debugfs);
166
- clnt->cl_debugfs = NULL;
163
+ rpc_clnt_iterate_for_each_xprt(clnt, do_xprt_debugfs, &xprtnum);
167164 }
168165
169166 void
....@@ -226,9 +223,6 @@
226223 static atomic_t cur_id;
227224 char name[9]; /* 8 hex digits + NULL term */
228225
229
- if (!rpc_xprt_dir)
230
- return;
231
-
232226 id = (unsigned int)atomic_inc_return(&cur_id);
233227
234228 len = snprintf(name, sizeof(name), "%x", id);
....@@ -237,15 +231,10 @@
237231
238232 /* make the per-client dir */
239233 xprt->debugfs = debugfs_create_dir(name, rpc_xprt_dir);
240
- if (!xprt->debugfs)
241
- return;
242234
243235 /* make tasks file */
244
- if (!debugfs_create_file("info", S_IFREG | 0400, xprt->debugfs,
245
- xprt, &xprt_info_fops)) {
246
- debugfs_remove_recursive(xprt->debugfs);
247
- xprt->debugfs = NULL;
248
- }
236
+ debugfs_create_file("info", S_IFREG | 0400, xprt->debugfs, xprt,
237
+ &xprt_info_fops);
249238
250239 atomic_set(&xprt->inject_disconnect, rpc_inject_disconnect);
251240 }
....@@ -308,28 +297,11 @@
308297 .release = fault_release,
309298 };
310299
311
-static struct dentry *
312
-inject_fault_dir(struct dentry *topdir)
313
-{
314
- struct dentry *faultdir;
315
-
316
- faultdir = debugfs_create_dir("inject_fault", topdir);
317
- if (!faultdir)
318
- return NULL;
319
-
320
- if (!debugfs_create_file("disconnect", S_IFREG | 0400, faultdir,
321
- NULL, &fault_disconnect_fops))
322
- return NULL;
323
-
324
- return faultdir;
325
-}
326
-
327300 void __exit
328301 sunrpc_debugfs_exit(void)
329302 {
330303 debugfs_remove_recursive(topdir);
331304 topdir = NULL;
332
- rpc_fault_dir = NULL;
333305 rpc_clnt_dir = NULL;
334306 rpc_xprt_dir = NULL;
335307 }
....@@ -337,26 +309,16 @@
337309 void __init
338310 sunrpc_debugfs_init(void)
339311 {
340
- topdir = debugfs_create_dir("sunrpc", NULL);
341
- if (!topdir)
342
- return;
312
+ struct dentry *rpc_fault_dir;
343313
344
- rpc_fault_dir = inject_fault_dir(topdir);
345
- if (!rpc_fault_dir)
346
- goto out_remove;
314
+ topdir = debugfs_create_dir("sunrpc", NULL);
347315
348316 rpc_clnt_dir = debugfs_create_dir("rpc_clnt", topdir);
349
- if (!rpc_clnt_dir)
350
- goto out_remove;
351317
352318 rpc_xprt_dir = debugfs_create_dir("rpc_xprt", topdir);
353
- if (!rpc_xprt_dir)
354
- goto out_remove;
355319
356
- return;
357
-out_remove:
358
- debugfs_remove_recursive(topdir);
359
- topdir = NULL;
360
- rpc_fault_dir = NULL;
361
- rpc_clnt_dir = NULL;
320
+ rpc_fault_dir = debugfs_create_dir("inject_fault", topdir);
321
+
322
+ debugfs_create_file("disconnect", S_IFREG | 0400, rpc_fault_dir, NULL,
323
+ &fault_disconnect_fops);
362324 }