1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <linux/ceph/ceph_debug.h>
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <linux/device.h>
5*4882a593Smuzhiyun #include <linux/slab.h>
6*4882a593Smuzhiyun #include <linux/module.h>
7*4882a593Smuzhiyun #include <linux/ctype.h>
8*4882a593Smuzhiyun #include <linux/debugfs.h>
9*4882a593Smuzhiyun #include <linux/seq_file.h>
10*4882a593Smuzhiyun #include <linux/math64.h>
11*4882a593Smuzhiyun #include <linux/ktime.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/ceph/libceph.h>
14*4882a593Smuzhiyun #include <linux/ceph/mon_client.h>
15*4882a593Smuzhiyun #include <linux/ceph/auth.h>
16*4882a593Smuzhiyun #include <linux/ceph/debugfs.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include "super.h"
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include "mds_client.h"
23*4882a593Smuzhiyun #include "metric.h"
24*4882a593Smuzhiyun
mdsmap_show(struct seq_file * s,void * p)25*4882a593Smuzhiyun static int mdsmap_show(struct seq_file *s, void *p)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun int i;
28*4882a593Smuzhiyun struct ceph_fs_client *fsc = s->private;
29*4882a593Smuzhiyun struct ceph_mdsmap *mdsmap;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun if (!fsc->mdsc || !fsc->mdsc->mdsmap)
32*4882a593Smuzhiyun return 0;
33*4882a593Smuzhiyun mdsmap = fsc->mdsc->mdsmap;
34*4882a593Smuzhiyun seq_printf(s, "epoch %d\n", mdsmap->m_epoch);
35*4882a593Smuzhiyun seq_printf(s, "root %d\n", mdsmap->m_root);
36*4882a593Smuzhiyun seq_printf(s, "max_mds %d\n", mdsmap->m_max_mds);
37*4882a593Smuzhiyun seq_printf(s, "session_timeout %d\n", mdsmap->m_session_timeout);
38*4882a593Smuzhiyun seq_printf(s, "session_autoclose %d\n", mdsmap->m_session_autoclose);
39*4882a593Smuzhiyun for (i = 0; i < mdsmap->possible_max_rank; i++) {
40*4882a593Smuzhiyun struct ceph_entity_addr *addr = &mdsmap->m_info[i].addr;
41*4882a593Smuzhiyun int state = mdsmap->m_info[i].state;
42*4882a593Smuzhiyun seq_printf(s, "\tmds%d\t%s\t(%s)\n", i,
43*4882a593Smuzhiyun ceph_pr_addr(addr),
44*4882a593Smuzhiyun ceph_mds_state_name(state));
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun return 0;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun * mdsc debugfs
51*4882a593Smuzhiyun */
mdsc_show(struct seq_file * s,void * p)52*4882a593Smuzhiyun static int mdsc_show(struct seq_file *s, void *p)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun struct ceph_fs_client *fsc = s->private;
55*4882a593Smuzhiyun struct ceph_mds_client *mdsc = fsc->mdsc;
56*4882a593Smuzhiyun struct ceph_mds_request *req;
57*4882a593Smuzhiyun struct rb_node *rp;
58*4882a593Smuzhiyun int pathlen = 0;
59*4882a593Smuzhiyun u64 pathbase;
60*4882a593Smuzhiyun char *path;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun mutex_lock(&mdsc->mutex);
63*4882a593Smuzhiyun for (rp = rb_first(&mdsc->request_tree); rp; rp = rb_next(rp)) {
64*4882a593Smuzhiyun req = rb_entry(rp, struct ceph_mds_request, r_node);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun if (req->r_request && req->r_session)
67*4882a593Smuzhiyun seq_printf(s, "%lld\tmds%d\t", req->r_tid,
68*4882a593Smuzhiyun req->r_session->s_mds);
69*4882a593Smuzhiyun else if (!req->r_request)
70*4882a593Smuzhiyun seq_printf(s, "%lld\t(no request)\t", req->r_tid);
71*4882a593Smuzhiyun else
72*4882a593Smuzhiyun seq_printf(s, "%lld\t(no session)\t", req->r_tid);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun seq_printf(s, "%s", ceph_mds_op_name(req->r_op));
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags))
77*4882a593Smuzhiyun seq_puts(s, "\t(unsafe)");
78*4882a593Smuzhiyun else
79*4882a593Smuzhiyun seq_puts(s, "\t");
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun if (req->r_inode) {
82*4882a593Smuzhiyun seq_printf(s, " #%llx", ceph_ino(req->r_inode));
83*4882a593Smuzhiyun } else if (req->r_dentry) {
84*4882a593Smuzhiyun path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
85*4882a593Smuzhiyun &pathbase, 0);
86*4882a593Smuzhiyun if (IS_ERR(path))
87*4882a593Smuzhiyun path = NULL;
88*4882a593Smuzhiyun spin_lock(&req->r_dentry->d_lock);
89*4882a593Smuzhiyun seq_printf(s, " #%llx/%pd (%s)",
90*4882a593Smuzhiyun ceph_ino(d_inode(req->r_dentry->d_parent)),
91*4882a593Smuzhiyun req->r_dentry,
92*4882a593Smuzhiyun path ? path : "");
93*4882a593Smuzhiyun spin_unlock(&req->r_dentry->d_lock);
94*4882a593Smuzhiyun ceph_mdsc_free_path(path, pathlen);
95*4882a593Smuzhiyun } else if (req->r_path1) {
96*4882a593Smuzhiyun seq_printf(s, " #%llx/%s", req->r_ino1.ino,
97*4882a593Smuzhiyun req->r_path1);
98*4882a593Smuzhiyun } else {
99*4882a593Smuzhiyun seq_printf(s, " #%llx", req->r_ino1.ino);
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun if (req->r_old_dentry) {
103*4882a593Smuzhiyun path = ceph_mdsc_build_path(req->r_old_dentry, &pathlen,
104*4882a593Smuzhiyun &pathbase, 0);
105*4882a593Smuzhiyun if (IS_ERR(path))
106*4882a593Smuzhiyun path = NULL;
107*4882a593Smuzhiyun spin_lock(&req->r_old_dentry->d_lock);
108*4882a593Smuzhiyun seq_printf(s, " #%llx/%pd (%s)",
109*4882a593Smuzhiyun req->r_old_dentry_dir ?
110*4882a593Smuzhiyun ceph_ino(req->r_old_dentry_dir) : 0,
111*4882a593Smuzhiyun req->r_old_dentry,
112*4882a593Smuzhiyun path ? path : "");
113*4882a593Smuzhiyun spin_unlock(&req->r_old_dentry->d_lock);
114*4882a593Smuzhiyun ceph_mdsc_free_path(path, pathlen);
115*4882a593Smuzhiyun } else if (req->r_path2 && req->r_op != CEPH_MDS_OP_SYMLINK) {
116*4882a593Smuzhiyun if (req->r_ino2.ino)
117*4882a593Smuzhiyun seq_printf(s, " #%llx/%s", req->r_ino2.ino,
118*4882a593Smuzhiyun req->r_path2);
119*4882a593Smuzhiyun else
120*4882a593Smuzhiyun seq_printf(s, " %s", req->r_path2);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun seq_puts(s, "\n");
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun mutex_unlock(&mdsc->mutex);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun return 0;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun #define CEPH_METRIC_SHOW(name, total, avg, min, max, sq) { \
131*4882a593Smuzhiyun s64 _total, _avg, _min, _max, _sq, _st; \
132*4882a593Smuzhiyun _avg = ktime_to_us(avg); \
133*4882a593Smuzhiyun _min = ktime_to_us(min == KTIME_MAX ? 0 : min); \
134*4882a593Smuzhiyun _max = ktime_to_us(max); \
135*4882a593Smuzhiyun _total = total - 1; \
136*4882a593Smuzhiyun _sq = _total > 0 ? DIV64_U64_ROUND_CLOSEST(sq, _total) : 0; \
137*4882a593Smuzhiyun _st = int_sqrt64(_sq); \
138*4882a593Smuzhiyun _st = ktime_to_us(_st); \
139*4882a593Smuzhiyun seq_printf(s, "%-14s%-12lld%-16lld%-16lld%-16lld%lld\n", \
140*4882a593Smuzhiyun name, total, _avg, _min, _max, _st); \
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
metric_show(struct seq_file * s,void * p)143*4882a593Smuzhiyun static int metric_show(struct seq_file *s, void *p)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun struct ceph_fs_client *fsc = s->private;
146*4882a593Smuzhiyun struct ceph_mds_client *mdsc = fsc->mdsc;
147*4882a593Smuzhiyun struct ceph_client_metric *m = &mdsc->metric;
148*4882a593Smuzhiyun int nr_caps = 0;
149*4882a593Smuzhiyun s64 total, sum, avg, min, max, sq;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun sum = percpu_counter_sum(&m->total_inodes);
152*4882a593Smuzhiyun seq_printf(s, "item total\n");
153*4882a593Smuzhiyun seq_printf(s, "------------------------------------------\n");
154*4882a593Smuzhiyun seq_printf(s, "%-35s%lld / %lld\n", "opened files / total inodes",
155*4882a593Smuzhiyun atomic64_read(&m->opened_files), sum);
156*4882a593Smuzhiyun seq_printf(s, "%-35s%lld / %lld\n", "pinned i_caps / total inodes",
157*4882a593Smuzhiyun atomic64_read(&m->total_caps), sum);
158*4882a593Smuzhiyun seq_printf(s, "%-35s%lld / %lld\n", "opened inodes / total inodes",
159*4882a593Smuzhiyun percpu_counter_sum(&m->opened_inodes), sum);
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun seq_printf(s, "\n");
162*4882a593Smuzhiyun seq_printf(s, "item total avg_lat(us) min_lat(us) max_lat(us) stdev(us)\n");
163*4882a593Smuzhiyun seq_printf(s, "-----------------------------------------------------------------------------------\n");
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun spin_lock(&m->read_latency_lock);
166*4882a593Smuzhiyun total = m->total_reads;
167*4882a593Smuzhiyun sum = m->read_latency_sum;
168*4882a593Smuzhiyun avg = total > 0 ? DIV64_U64_ROUND_CLOSEST(sum, total) : 0;
169*4882a593Smuzhiyun min = m->read_latency_min;
170*4882a593Smuzhiyun max = m->read_latency_max;
171*4882a593Smuzhiyun sq = m->read_latency_sq_sum;
172*4882a593Smuzhiyun spin_unlock(&m->read_latency_lock);
173*4882a593Smuzhiyun CEPH_METRIC_SHOW("read", total, avg, min, max, sq);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun spin_lock(&m->write_latency_lock);
176*4882a593Smuzhiyun total = m->total_writes;
177*4882a593Smuzhiyun sum = m->write_latency_sum;
178*4882a593Smuzhiyun avg = total > 0 ? DIV64_U64_ROUND_CLOSEST(sum, total) : 0;
179*4882a593Smuzhiyun min = m->write_latency_min;
180*4882a593Smuzhiyun max = m->write_latency_max;
181*4882a593Smuzhiyun sq = m->write_latency_sq_sum;
182*4882a593Smuzhiyun spin_unlock(&m->write_latency_lock);
183*4882a593Smuzhiyun CEPH_METRIC_SHOW("write", total, avg, min, max, sq);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun spin_lock(&m->metadata_latency_lock);
186*4882a593Smuzhiyun total = m->total_metadatas;
187*4882a593Smuzhiyun sum = m->metadata_latency_sum;
188*4882a593Smuzhiyun avg = total > 0 ? DIV64_U64_ROUND_CLOSEST(sum, total) : 0;
189*4882a593Smuzhiyun min = m->metadata_latency_min;
190*4882a593Smuzhiyun max = m->metadata_latency_max;
191*4882a593Smuzhiyun sq = m->metadata_latency_sq_sum;
192*4882a593Smuzhiyun spin_unlock(&m->metadata_latency_lock);
193*4882a593Smuzhiyun CEPH_METRIC_SHOW("metadata", total, avg, min, max, sq);
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun seq_printf(s, "\n");
196*4882a593Smuzhiyun seq_printf(s, "item total miss hit\n");
197*4882a593Smuzhiyun seq_printf(s, "-------------------------------------------------\n");
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun seq_printf(s, "%-14s%-16lld%-16lld%lld\n", "d_lease",
200*4882a593Smuzhiyun atomic64_read(&m->total_dentries),
201*4882a593Smuzhiyun percpu_counter_sum(&m->d_lease_mis),
202*4882a593Smuzhiyun percpu_counter_sum(&m->d_lease_hit));
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun nr_caps = atomic64_read(&m->total_caps);
205*4882a593Smuzhiyun seq_printf(s, "%-14s%-16d%-16lld%lld\n", "caps", nr_caps,
206*4882a593Smuzhiyun percpu_counter_sum(&m->i_caps_mis),
207*4882a593Smuzhiyun percpu_counter_sum(&m->i_caps_hit));
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun return 0;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
caps_show_cb(struct inode * inode,struct ceph_cap * cap,void * p)212*4882a593Smuzhiyun static int caps_show_cb(struct inode *inode, struct ceph_cap *cap, void *p)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun struct seq_file *s = p;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun seq_printf(s, "0x%-17llx%-3d%-17s%-17s\n", ceph_ino(inode),
217*4882a593Smuzhiyun cap->session->s_mds,
218*4882a593Smuzhiyun ceph_cap_string(cap->issued),
219*4882a593Smuzhiyun ceph_cap_string(cap->implemented));
220*4882a593Smuzhiyun return 0;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
caps_show(struct seq_file * s,void * p)223*4882a593Smuzhiyun static int caps_show(struct seq_file *s, void *p)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun struct ceph_fs_client *fsc = s->private;
226*4882a593Smuzhiyun struct ceph_mds_client *mdsc = fsc->mdsc;
227*4882a593Smuzhiyun int total, avail, used, reserved, min, i;
228*4882a593Smuzhiyun struct cap_wait *cw;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun ceph_reservation_status(fsc, &total, &avail, &used, &reserved, &min);
231*4882a593Smuzhiyun seq_printf(s, "total\t\t%d\n"
232*4882a593Smuzhiyun "avail\t\t%d\n"
233*4882a593Smuzhiyun "used\t\t%d\n"
234*4882a593Smuzhiyun "reserved\t%d\n"
235*4882a593Smuzhiyun "min\t\t%d\n\n",
236*4882a593Smuzhiyun total, avail, used, reserved, min);
237*4882a593Smuzhiyun seq_printf(s, "ino mds issued implemented\n");
238*4882a593Smuzhiyun seq_printf(s, "--------------------------------------------------\n");
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun mutex_lock(&mdsc->mutex);
241*4882a593Smuzhiyun for (i = 0; i < mdsc->max_sessions; i++) {
242*4882a593Smuzhiyun struct ceph_mds_session *session;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun session = __ceph_lookup_mds_session(mdsc, i);
245*4882a593Smuzhiyun if (!session)
246*4882a593Smuzhiyun continue;
247*4882a593Smuzhiyun mutex_unlock(&mdsc->mutex);
248*4882a593Smuzhiyun mutex_lock(&session->s_mutex);
249*4882a593Smuzhiyun ceph_iterate_session_caps(session, caps_show_cb, s);
250*4882a593Smuzhiyun mutex_unlock(&session->s_mutex);
251*4882a593Smuzhiyun ceph_put_mds_session(session);
252*4882a593Smuzhiyun mutex_lock(&mdsc->mutex);
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun mutex_unlock(&mdsc->mutex);
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun seq_printf(s, "\n\nWaiters:\n--------\n");
257*4882a593Smuzhiyun seq_printf(s, "tgid ino need want\n");
258*4882a593Smuzhiyun seq_printf(s, "-----------------------------------------------------\n");
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun spin_lock(&mdsc->caps_list_lock);
261*4882a593Smuzhiyun list_for_each_entry(cw, &mdsc->cap_wait_list, list) {
262*4882a593Smuzhiyun seq_printf(s, "%-13d0x%-17llx%-17s%-17s\n", cw->tgid, cw->ino,
263*4882a593Smuzhiyun ceph_cap_string(cw->need),
264*4882a593Smuzhiyun ceph_cap_string(cw->want));
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun spin_unlock(&mdsc->caps_list_lock);
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun return 0;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun
mds_sessions_show(struct seq_file * s,void * ptr)271*4882a593Smuzhiyun static int mds_sessions_show(struct seq_file *s, void *ptr)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun struct ceph_fs_client *fsc = s->private;
274*4882a593Smuzhiyun struct ceph_mds_client *mdsc = fsc->mdsc;
275*4882a593Smuzhiyun struct ceph_auth_client *ac = fsc->client->monc.auth;
276*4882a593Smuzhiyun struct ceph_options *opt = fsc->client->options;
277*4882a593Smuzhiyun int mds;
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun mutex_lock(&mdsc->mutex);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /* The 'num' portion of an 'entity name' */
282*4882a593Smuzhiyun seq_printf(s, "global_id %llu\n", ac->global_id);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /* The -o name mount argument */
285*4882a593Smuzhiyun seq_printf(s, "name \"%s\"\n", opt->name ? opt->name : "");
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun /* The list of MDS session rank+state */
288*4882a593Smuzhiyun for (mds = 0; mds < mdsc->max_sessions; mds++) {
289*4882a593Smuzhiyun struct ceph_mds_session *session =
290*4882a593Smuzhiyun __ceph_lookup_mds_session(mdsc, mds);
291*4882a593Smuzhiyun if (!session) {
292*4882a593Smuzhiyun continue;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun mutex_unlock(&mdsc->mutex);
295*4882a593Smuzhiyun seq_printf(s, "mds.%d %s\n",
296*4882a593Smuzhiyun session->s_mds,
297*4882a593Smuzhiyun ceph_session_state_name(session->s_state));
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun ceph_put_mds_session(session);
300*4882a593Smuzhiyun mutex_lock(&mdsc->mutex);
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun mutex_unlock(&mdsc->mutex);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun return 0;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(mdsmap);
308*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(mdsc);
309*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(caps);
310*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(mds_sessions);
311*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(metric);
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /*
315*4882a593Smuzhiyun * debugfs
316*4882a593Smuzhiyun */
congestion_kb_set(void * data,u64 val)317*4882a593Smuzhiyun static int congestion_kb_set(void *data, u64 val)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun fsc->mount_options->congestion_kb = (int)val;
322*4882a593Smuzhiyun return 0;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
congestion_kb_get(void * data,u64 * val)325*4882a593Smuzhiyun static int congestion_kb_get(void *data, u64 *val)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun struct ceph_fs_client *fsc = (struct ceph_fs_client *)data;
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun *val = (u64)fsc->mount_options->congestion_kb;
330*4882a593Smuzhiyun return 0;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get,
334*4882a593Smuzhiyun congestion_kb_set, "%llu\n");
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun
ceph_fs_debugfs_cleanup(struct ceph_fs_client * fsc)337*4882a593Smuzhiyun void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun dout("ceph_fs_debugfs_cleanup\n");
340*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_bdi);
341*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_congestion_kb);
342*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_mdsmap);
343*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_mds_sessions);
344*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_caps);
345*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_metric);
346*4882a593Smuzhiyun debugfs_remove(fsc->debugfs_mdsc);
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
ceph_fs_debugfs_init(struct ceph_fs_client * fsc)349*4882a593Smuzhiyun void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun char name[100];
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun dout("ceph_fs_debugfs_init\n");
354*4882a593Smuzhiyun fsc->debugfs_congestion_kb =
355*4882a593Smuzhiyun debugfs_create_file("writeback_congestion_kb",
356*4882a593Smuzhiyun 0600,
357*4882a593Smuzhiyun fsc->client->debugfs_dir,
358*4882a593Smuzhiyun fsc,
359*4882a593Smuzhiyun &congestion_kb_fops);
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun snprintf(name, sizeof(name), "../../bdi/%s",
362*4882a593Smuzhiyun bdi_dev_name(fsc->sb->s_bdi));
363*4882a593Smuzhiyun fsc->debugfs_bdi =
364*4882a593Smuzhiyun debugfs_create_symlink("bdi",
365*4882a593Smuzhiyun fsc->client->debugfs_dir,
366*4882a593Smuzhiyun name);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun fsc->debugfs_mdsmap = debugfs_create_file("mdsmap",
369*4882a593Smuzhiyun 0400,
370*4882a593Smuzhiyun fsc->client->debugfs_dir,
371*4882a593Smuzhiyun fsc,
372*4882a593Smuzhiyun &mdsmap_fops);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun fsc->debugfs_mds_sessions = debugfs_create_file("mds_sessions",
375*4882a593Smuzhiyun 0400,
376*4882a593Smuzhiyun fsc->client->debugfs_dir,
377*4882a593Smuzhiyun fsc,
378*4882a593Smuzhiyun &mds_sessions_fops);
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun fsc->debugfs_mdsc = debugfs_create_file("mdsc",
381*4882a593Smuzhiyun 0400,
382*4882a593Smuzhiyun fsc->client->debugfs_dir,
383*4882a593Smuzhiyun fsc,
384*4882a593Smuzhiyun &mdsc_fops);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun fsc->debugfs_metric = debugfs_create_file("metrics",
387*4882a593Smuzhiyun 0400,
388*4882a593Smuzhiyun fsc->client->debugfs_dir,
389*4882a593Smuzhiyun fsc,
390*4882a593Smuzhiyun &metric_fops);
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun fsc->debugfs_caps = debugfs_create_file("caps",
393*4882a593Smuzhiyun 0400,
394*4882a593Smuzhiyun fsc->client->debugfs_dir,
395*4882a593Smuzhiyun fsc,
396*4882a593Smuzhiyun &caps_fops);
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun #else /* CONFIG_DEBUG_FS */
401*4882a593Smuzhiyun
ceph_fs_debugfs_init(struct ceph_fs_client * fsc)402*4882a593Smuzhiyun void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
403*4882a593Smuzhiyun {
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
ceph_fs_debugfs_cleanup(struct ceph_fs_client * fsc)406*4882a593Smuzhiyun void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun #endif /* CONFIG_DEBUG_FS */
411