diff options
author | NeilBrown <neilb@suse.com> | 2019-05-29 20:41:28 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-07-06 14:54:51 -0400 |
commit | 2f34b8bfae19a244993e2b6cd0a8514f3ffd3fa8 (patch) | |
tree | 41c6bd148152a2610c13c6b570d2916ed6669a2d | |
parent | 10db56917bcb80e70bbcd443d78bbfcb0b1e0652 (diff) |
SUNRPC: add links for all client xprts to debugfs
Now that a client can have multiple xprts, we need to add
them all to debugs.
The first one is still "xprt"
Subsequent xprts are "xprt1", "xprt2", etc.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r-- | net/sunrpc/debugfs.c | 46 |
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 | ||
121 | static 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 | |||
121 | void | 147 | void |
122 | rpc_clnt_debugfs_register(struct rpc_clnt *clnt) | 148 | rpc_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; |