Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/ceph/debugfs.c
15109 views
1
#include <linux/ceph/ceph_debug.h>
2
3
#include <linux/device.h>
4
#include <linux/slab.h>
5
#include <linux/module.h>
6
#include <linux/ctype.h>
7
#include <linux/debugfs.h>
8
#include <linux/seq_file.h>
9
10
#include <linux/ceph/libceph.h>
11
#include <linux/ceph/mon_client.h>
12
#include <linux/ceph/auth.h>
13
#include <linux/ceph/debugfs.h>
14
15
#include "super.h"
16
17
#ifdef CONFIG_DEBUG_FS
18
19
#include "mds_client.h"
20
21
static int mdsmap_show(struct seq_file *s, void *p)
22
{
23
int i;
24
struct ceph_fs_client *fsc = s->private;
25
26
if (fsc->mdsc == NULL || fsc->mdsc->mdsmap == NULL)
27
return 0;
28
seq_printf(s, "epoch %d\n", fsc->mdsc->mdsmap->m_epoch);
29
seq_printf(s, "root %d\n", fsc->mdsc->mdsmap->m_root);
30
seq_printf(s, "session_timeout %d\n",
31
fsc->mdsc->mdsmap->m_session_timeout);
32
seq_printf(s, "session_autoclose %d\n",
33
fsc->mdsc->mdsmap->m_session_autoclose);
34
for (i = 0; i < fsc->mdsc->mdsmap->m_max_mds; i++) {
35
struct ceph_entity_addr *addr =
36
&fsc->mdsc->mdsmap->m_info[i].addr;
37
int state = fsc->mdsc->mdsmap->m_info[i].state;
38
39
seq_printf(s, "\tmds%d\t%s\t(%s)\n", i,
40
ceph_pr_addr(&addr->in_addr),
41
ceph_mds_state_name(state));
42
}
43
return 0;
44
}
45
46
/*
47
* mdsc debugfs
48
*/
49
static int mdsc_show(struct seq_file *s, void *p)
50
{
51
struct ceph_fs_client *fsc = s->private;
52
struct ceph_mds_client *mdsc = fsc->mdsc;
53
struct ceph_mds_request *req;
54
struct rb_node *rp;
55
int pathlen;
56
u64 pathbase;
57
char *path;
58
59
mutex_lock(&mdsc->mutex);
60
for (rp = rb_first(&mdsc->request_tree); rp; rp = rb_next(rp)) {
61
req = rb_entry(rp, struct ceph_mds_request, r_node);
62
63
if (req->r_request && req->r_session)
64
seq_printf(s, "%lld\tmds%d\t", req->r_tid,
65
req->r_session->s_mds);
66
else if (!req->r_request)
67
seq_printf(s, "%lld\t(no request)\t", req->r_tid);
68
else
69
seq_printf(s, "%lld\t(no session)\t", req->r_tid);
70
71
seq_printf(s, "%s", ceph_mds_op_name(req->r_op));
72
73
if (req->r_got_unsafe)
74
seq_printf(s, "\t(unsafe)");
75
else
76
seq_printf(s, "\t");
77
78
if (req->r_inode) {
79
seq_printf(s, " #%llx", ceph_ino(req->r_inode));
80
} else if (req->r_dentry) {
81
path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
82
&pathbase, 0);
83
if (IS_ERR(path))
84
path = NULL;
85
spin_lock(&req->r_dentry->d_lock);
86
seq_printf(s, " #%llx/%.*s (%s)",
87
ceph_ino(req->r_dentry->d_parent->d_inode),
88
req->r_dentry->d_name.len,
89
req->r_dentry->d_name.name,
90
path ? path : "");
91
spin_unlock(&req->r_dentry->d_lock);
92
kfree(path);
93
} else if (req->r_path1) {
94
seq_printf(s, " #%llx/%s", req->r_ino1.ino,
95
req->r_path1);
96
}
97
98
if (req->r_old_dentry) {
99
path = ceph_mdsc_build_path(req->r_old_dentry, &pathlen,
100
&pathbase, 0);
101
if (IS_ERR(path))
102
path = NULL;
103
spin_lock(&req->r_old_dentry->d_lock);
104
seq_printf(s, " #%llx/%.*s (%s)",
105
ceph_ino(req->r_old_dentry->d_parent->d_inode),
106
req->r_old_dentry->d_name.len,
107
req->r_old_dentry->d_name.name,
108
path ? path : "");
109
spin_unlock(&req->r_old_dentry->d_lock);
110
kfree(path);
111
} else if (req->r_path2) {
112
if (req->r_ino2.ino)
113
seq_printf(s, " #%llx/%s", req->r_ino2.ino,
114
req->r_path2);
115
else
116
seq_printf(s, " %s", req->r_path2);
117
}
118
119
seq_printf(s, "\n");
120
}
121
mutex_unlock(&mdsc->mutex);
122
123
return 0;
124
}
125
126
static int caps_show(struct seq_file *s, void *p)
127
{
128
struct ceph_fs_client *fsc = s->private;
129
int total, avail, used, reserved, min;
130
131
ceph_reservation_status(fsc, &total, &avail, &used, &reserved, &min);
132
seq_printf(s, "total\t\t%d\n"
133
"avail\t\t%d\n"
134
"used\t\t%d\n"
135
"reserved\t%d\n"
136
"min\t%d\n",
137
total, avail, used, reserved, min);
138
return 0;
139
}
140
141
static int dentry_lru_show(struct seq_file *s, void *ptr)
142
{
143
struct ceph_fs_client *fsc = s->private;
144
struct ceph_mds_client *mdsc = fsc->mdsc;
145
struct ceph_dentry_info *di;
146
147
spin_lock(&mdsc->dentry_lru_lock);
148
list_for_each_entry(di, &mdsc->dentry_lru, lru) {
149
struct dentry *dentry = di->dentry;
150
seq_printf(s, "%p %p\t%.*s\n",
151
di, dentry, dentry->d_name.len, dentry->d_name.name);
152
}
153
spin_unlock(&mdsc->dentry_lru_lock);
154
155
return 0;
156
}
157
158
CEPH_DEFINE_SHOW_FUNC(mdsmap_show)
159
CEPH_DEFINE_SHOW_FUNC(mdsc_show)
160
CEPH_DEFINE_SHOW_FUNC(caps_show)
161
CEPH_DEFINE_SHOW_FUNC(dentry_lru_show)
162
163
164
/*
165
* debugfs
166
*/
167
static int congestion_kb_set(void *data, u64 val)
168
{
169
struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
170
171
fsc->mount_options->congestion_kb = (int)val;
172
return 0;
173
}
174
175
static int congestion_kb_get(void *data, u64 *val)
176
{
177
struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
178
179
*val = (u64)fsc->mount_options->congestion_kb;
180
return 0;
181
}
182
183
DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get,
184
congestion_kb_set, "%llu\n");
185
186
187
void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
188
{
189
dout("ceph_fs_debugfs_cleanup\n");
190
debugfs_remove(fsc->debugfs_bdi);
191
debugfs_remove(fsc->debugfs_congestion_kb);
192
debugfs_remove(fsc->debugfs_mdsmap);
193
debugfs_remove(fsc->debugfs_caps);
194
debugfs_remove(fsc->debugfs_mdsc);
195
debugfs_remove(fsc->debugfs_dentry_lru);
196
}
197
198
int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
199
{
200
char name[100];
201
int err = -ENOMEM;
202
203
dout("ceph_fs_debugfs_init\n");
204
fsc->debugfs_congestion_kb =
205
debugfs_create_file("writeback_congestion_kb",
206
0600,
207
fsc->client->debugfs_dir,
208
fsc,
209
&congestion_kb_fops);
210
if (!fsc->debugfs_congestion_kb)
211
goto out;
212
213
snprintf(name, sizeof(name), "../../bdi/%s",
214
dev_name(fsc->backing_dev_info.dev));
215
fsc->debugfs_bdi =
216
debugfs_create_symlink("bdi",
217
fsc->client->debugfs_dir,
218
name);
219
if (!fsc->debugfs_bdi)
220
goto out;
221
222
fsc->debugfs_mdsmap = debugfs_create_file("mdsmap",
223
0600,
224
fsc->client->debugfs_dir,
225
fsc,
226
&mdsmap_show_fops);
227
if (!fsc->debugfs_mdsmap)
228
goto out;
229
230
fsc->debugfs_mdsc = debugfs_create_file("mdsc",
231
0600,
232
fsc->client->debugfs_dir,
233
fsc,
234
&mdsc_show_fops);
235
if (!fsc->debugfs_mdsc)
236
goto out;
237
238
fsc->debugfs_caps = debugfs_create_file("caps",
239
0400,
240
fsc->client->debugfs_dir,
241
fsc,
242
&caps_show_fops);
243
if (!fsc->debugfs_caps)
244
goto out;
245
246
fsc->debugfs_dentry_lru = debugfs_create_file("dentry_lru",
247
0600,
248
fsc->client->debugfs_dir,
249
fsc,
250
&dentry_lru_show_fops);
251
if (!fsc->debugfs_dentry_lru)
252
goto out;
253
254
return 0;
255
256
out:
257
ceph_fs_debugfs_cleanup(fsc);
258
return err;
259
}
260
261
262
#else /* CONFIG_DEBUG_FS */
263
264
int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
265
{
266
return 0;
267
}
268
269
void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
270
{
271
}
272
273
#endif /* CONFIG_DEBUG_FS */
274
275