162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/ceph/ceph_debug.h> 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/device.h> 562306a36Sopenharmony_ci#include <linux/slab.h> 662306a36Sopenharmony_ci#include <linux/module.h> 762306a36Sopenharmony_ci#include <linux/ctype.h> 862306a36Sopenharmony_ci#include <linux/debugfs.h> 962306a36Sopenharmony_ci#include <linux/seq_file.h> 1062306a36Sopenharmony_ci#include <linux/math64.h> 1162306a36Sopenharmony_ci#include <linux/ktime.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/ceph/libceph.h> 1462306a36Sopenharmony_ci#include <linux/ceph/mon_client.h> 1562306a36Sopenharmony_ci#include <linux/ceph/auth.h> 1662306a36Sopenharmony_ci#include <linux/ceph/debugfs.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "super.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include "mds_client.h" 2362306a36Sopenharmony_ci#include "metric.h" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic int mdsmap_show(struct seq_file *s, void *p) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci int i; 2862306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 2962306a36Sopenharmony_ci struct ceph_mdsmap *mdsmap; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci if (!fsc->mdsc || !fsc->mdsc->mdsmap) 3262306a36Sopenharmony_ci return 0; 3362306a36Sopenharmony_ci mdsmap = fsc->mdsc->mdsmap; 3462306a36Sopenharmony_ci seq_printf(s, "epoch %d\n", mdsmap->m_epoch); 3562306a36Sopenharmony_ci seq_printf(s, "root %d\n", mdsmap->m_root); 3662306a36Sopenharmony_ci seq_printf(s, "max_mds %d\n", mdsmap->m_max_mds); 3762306a36Sopenharmony_ci seq_printf(s, "session_timeout %d\n", mdsmap->m_session_timeout); 3862306a36Sopenharmony_ci seq_printf(s, "session_autoclose %d\n", mdsmap->m_session_autoclose); 3962306a36Sopenharmony_ci for (i = 0; i < mdsmap->possible_max_rank; i++) { 4062306a36Sopenharmony_ci struct ceph_entity_addr *addr = &mdsmap->m_info[i].addr; 4162306a36Sopenharmony_ci int state = mdsmap->m_info[i].state; 4262306a36Sopenharmony_ci seq_printf(s, "\tmds%d\t%s\t(%s)\n", i, 4362306a36Sopenharmony_ci ceph_pr_addr(addr), 4462306a36Sopenharmony_ci ceph_mds_state_name(state)); 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci return 0; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * mdsc debugfs 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_cistatic int mdsc_show(struct seq_file *s, void *p) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 5562306a36Sopenharmony_ci struct ceph_mds_client *mdsc = fsc->mdsc; 5662306a36Sopenharmony_ci struct ceph_mds_request *req; 5762306a36Sopenharmony_ci struct rb_node *rp; 5862306a36Sopenharmony_ci int pathlen = 0; 5962306a36Sopenharmony_ci u64 pathbase; 6062306a36Sopenharmony_ci char *path; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci mutex_lock(&mdsc->mutex); 6362306a36Sopenharmony_ci for (rp = rb_first(&mdsc->request_tree); rp; rp = rb_next(rp)) { 6462306a36Sopenharmony_ci req = rb_entry(rp, struct ceph_mds_request, r_node); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (req->r_request && req->r_session) 6762306a36Sopenharmony_ci seq_printf(s, "%lld\tmds%d\t", req->r_tid, 6862306a36Sopenharmony_ci req->r_session->s_mds); 6962306a36Sopenharmony_ci else if (!req->r_request) 7062306a36Sopenharmony_ci seq_printf(s, "%lld\t(no request)\t", req->r_tid); 7162306a36Sopenharmony_ci else 7262306a36Sopenharmony_ci seq_printf(s, "%lld\t(no session)\t", req->r_tid); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci seq_printf(s, "%s", ceph_mds_op_name(req->r_op)); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci if (test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) 7762306a36Sopenharmony_ci seq_puts(s, "\t(unsafe)"); 7862306a36Sopenharmony_ci else 7962306a36Sopenharmony_ci seq_puts(s, "\t"); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci if (req->r_inode) { 8262306a36Sopenharmony_ci seq_printf(s, " #%llx", ceph_ino(req->r_inode)); 8362306a36Sopenharmony_ci } else if (req->r_dentry) { 8462306a36Sopenharmony_ci path = ceph_mdsc_build_path(req->r_dentry, &pathlen, 8562306a36Sopenharmony_ci &pathbase, 0); 8662306a36Sopenharmony_ci if (IS_ERR(path)) 8762306a36Sopenharmony_ci path = NULL; 8862306a36Sopenharmony_ci spin_lock(&req->r_dentry->d_lock); 8962306a36Sopenharmony_ci seq_printf(s, " #%llx/%pd (%s)", 9062306a36Sopenharmony_ci ceph_ino(d_inode(req->r_dentry->d_parent)), 9162306a36Sopenharmony_ci req->r_dentry, 9262306a36Sopenharmony_ci path ? path : ""); 9362306a36Sopenharmony_ci spin_unlock(&req->r_dentry->d_lock); 9462306a36Sopenharmony_ci ceph_mdsc_free_path(path, pathlen); 9562306a36Sopenharmony_ci } else if (req->r_path1) { 9662306a36Sopenharmony_ci seq_printf(s, " #%llx/%s", req->r_ino1.ino, 9762306a36Sopenharmony_ci req->r_path1); 9862306a36Sopenharmony_ci } else { 9962306a36Sopenharmony_ci seq_printf(s, " #%llx", req->r_ino1.ino); 10062306a36Sopenharmony_ci } 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci if (req->r_old_dentry) { 10362306a36Sopenharmony_ci path = ceph_mdsc_build_path(req->r_old_dentry, &pathlen, 10462306a36Sopenharmony_ci &pathbase, 0); 10562306a36Sopenharmony_ci if (IS_ERR(path)) 10662306a36Sopenharmony_ci path = NULL; 10762306a36Sopenharmony_ci spin_lock(&req->r_old_dentry->d_lock); 10862306a36Sopenharmony_ci seq_printf(s, " #%llx/%pd (%s)", 10962306a36Sopenharmony_ci req->r_old_dentry_dir ? 11062306a36Sopenharmony_ci ceph_ino(req->r_old_dentry_dir) : 0, 11162306a36Sopenharmony_ci req->r_old_dentry, 11262306a36Sopenharmony_ci path ? path : ""); 11362306a36Sopenharmony_ci spin_unlock(&req->r_old_dentry->d_lock); 11462306a36Sopenharmony_ci ceph_mdsc_free_path(path, pathlen); 11562306a36Sopenharmony_ci } else if (req->r_path2 && req->r_op != CEPH_MDS_OP_SYMLINK) { 11662306a36Sopenharmony_ci if (req->r_ino2.ino) 11762306a36Sopenharmony_ci seq_printf(s, " #%llx/%s", req->r_ino2.ino, 11862306a36Sopenharmony_ci req->r_path2); 11962306a36Sopenharmony_ci else 12062306a36Sopenharmony_ci seq_printf(s, " %s", req->r_path2); 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci seq_puts(s, "\n"); 12462306a36Sopenharmony_ci } 12562306a36Sopenharmony_ci mutex_unlock(&mdsc->mutex); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci return 0; 12862306a36Sopenharmony_ci} 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define CEPH_LAT_METRIC_SHOW(name, total, avg, min, max, sq) { \ 13162306a36Sopenharmony_ci s64 _total, _avg, _min, _max, _sq, _st; \ 13262306a36Sopenharmony_ci _avg = ktime_to_us(avg); \ 13362306a36Sopenharmony_ci _min = ktime_to_us(min == KTIME_MAX ? 0 : min); \ 13462306a36Sopenharmony_ci _max = ktime_to_us(max); \ 13562306a36Sopenharmony_ci _total = total - 1; \ 13662306a36Sopenharmony_ci _sq = _total > 0 ? DIV64_U64_ROUND_CLOSEST(sq, _total) : 0; \ 13762306a36Sopenharmony_ci _st = int_sqrt64(_sq); \ 13862306a36Sopenharmony_ci _st = ktime_to_us(_st); \ 13962306a36Sopenharmony_ci seq_printf(s, "%-14s%-12lld%-16lld%-16lld%-16lld%lld\n", \ 14062306a36Sopenharmony_ci name, total, _avg, _min, _max, _st); \ 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci#define CEPH_SZ_METRIC_SHOW(name, total, avg, min, max, sum) { \ 14462306a36Sopenharmony_ci u64 _min = min == U64_MAX ? 0 : min; \ 14562306a36Sopenharmony_ci seq_printf(s, "%-14s%-12lld%-16llu%-16llu%-16llu%llu\n", \ 14662306a36Sopenharmony_ci name, total, avg, _min, max, sum); \ 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic int metrics_file_show(struct seq_file *s, void *p) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 15262306a36Sopenharmony_ci struct ceph_client_metric *m = &fsc->mdsc->metric; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci seq_printf(s, "item total\n"); 15562306a36Sopenharmony_ci seq_printf(s, "------------------------------------------\n"); 15662306a36Sopenharmony_ci seq_printf(s, "%-35s%lld\n", "total inodes", 15762306a36Sopenharmony_ci percpu_counter_sum(&m->total_inodes)); 15862306a36Sopenharmony_ci seq_printf(s, "%-35s%lld\n", "opened files", 15962306a36Sopenharmony_ci atomic64_read(&m->opened_files)); 16062306a36Sopenharmony_ci seq_printf(s, "%-35s%lld\n", "pinned i_caps", 16162306a36Sopenharmony_ci atomic64_read(&m->total_caps)); 16262306a36Sopenharmony_ci seq_printf(s, "%-35s%lld\n", "opened inodes", 16362306a36Sopenharmony_ci percpu_counter_sum(&m->opened_inodes)); 16462306a36Sopenharmony_ci return 0; 16562306a36Sopenharmony_ci} 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistatic const char * const metric_str[] = { 16862306a36Sopenharmony_ci "read", 16962306a36Sopenharmony_ci "write", 17062306a36Sopenharmony_ci "metadata", 17162306a36Sopenharmony_ci "copyfrom" 17262306a36Sopenharmony_ci}; 17362306a36Sopenharmony_cistatic int metrics_latency_show(struct seq_file *s, void *p) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 17662306a36Sopenharmony_ci struct ceph_client_metric *cm = &fsc->mdsc->metric; 17762306a36Sopenharmony_ci struct ceph_metric *m; 17862306a36Sopenharmony_ci s64 total, avg, min, max, sq; 17962306a36Sopenharmony_ci int i; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci seq_printf(s, "item total avg_lat(us) min_lat(us) max_lat(us) stdev(us)\n"); 18262306a36Sopenharmony_ci seq_printf(s, "-----------------------------------------------------------------------------------\n"); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci for (i = 0; i < METRIC_MAX; i++) { 18562306a36Sopenharmony_ci m = &cm->metric[i]; 18662306a36Sopenharmony_ci spin_lock(&m->lock); 18762306a36Sopenharmony_ci total = m->total; 18862306a36Sopenharmony_ci avg = m->latency_avg; 18962306a36Sopenharmony_ci min = m->latency_min; 19062306a36Sopenharmony_ci max = m->latency_max; 19162306a36Sopenharmony_ci sq = m->latency_sq_sum; 19262306a36Sopenharmony_ci spin_unlock(&m->lock); 19362306a36Sopenharmony_ci CEPH_LAT_METRIC_SHOW(metric_str[i], total, avg, min, max, sq); 19462306a36Sopenharmony_ci } 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci return 0; 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic int metrics_size_show(struct seq_file *s, void *p) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 20262306a36Sopenharmony_ci struct ceph_client_metric *cm = &fsc->mdsc->metric; 20362306a36Sopenharmony_ci struct ceph_metric *m; 20462306a36Sopenharmony_ci s64 total; 20562306a36Sopenharmony_ci u64 sum, avg, min, max; 20662306a36Sopenharmony_ci int i; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci seq_printf(s, "item total avg_sz(bytes) min_sz(bytes) max_sz(bytes) total_sz(bytes)\n"); 20962306a36Sopenharmony_ci seq_printf(s, "----------------------------------------------------------------------------------------\n"); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci for (i = 0; i < METRIC_MAX; i++) { 21262306a36Sopenharmony_ci /* skip 'metadata' as it doesn't use the size metric */ 21362306a36Sopenharmony_ci if (i == METRIC_METADATA) 21462306a36Sopenharmony_ci continue; 21562306a36Sopenharmony_ci m = &cm->metric[i]; 21662306a36Sopenharmony_ci spin_lock(&m->lock); 21762306a36Sopenharmony_ci total = m->total; 21862306a36Sopenharmony_ci sum = m->size_sum; 21962306a36Sopenharmony_ci avg = total > 0 ? DIV64_U64_ROUND_CLOSEST(sum, total) : 0; 22062306a36Sopenharmony_ci min = m->size_min; 22162306a36Sopenharmony_ci max = m->size_max; 22262306a36Sopenharmony_ci spin_unlock(&m->lock); 22362306a36Sopenharmony_ci CEPH_SZ_METRIC_SHOW(metric_str[i], total, avg, min, max, sum); 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci return 0; 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistatic int metrics_caps_show(struct seq_file *s, void *p) 23062306a36Sopenharmony_ci{ 23162306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 23262306a36Sopenharmony_ci struct ceph_client_metric *m = &fsc->mdsc->metric; 23362306a36Sopenharmony_ci int nr_caps = 0; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci seq_printf(s, "item total miss hit\n"); 23662306a36Sopenharmony_ci seq_printf(s, "-------------------------------------------------\n"); 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci seq_printf(s, "%-14s%-16lld%-16lld%lld\n", "d_lease", 23962306a36Sopenharmony_ci atomic64_read(&m->total_dentries), 24062306a36Sopenharmony_ci percpu_counter_sum(&m->d_lease_mis), 24162306a36Sopenharmony_ci percpu_counter_sum(&m->d_lease_hit)); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci nr_caps = atomic64_read(&m->total_caps); 24462306a36Sopenharmony_ci seq_printf(s, "%-14s%-16d%-16lld%lld\n", "caps", nr_caps, 24562306a36Sopenharmony_ci percpu_counter_sum(&m->i_caps_mis), 24662306a36Sopenharmony_ci percpu_counter_sum(&m->i_caps_hit)); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci return 0; 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic int caps_show_cb(struct inode *inode, int mds, void *p) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci struct ceph_inode_info *ci = ceph_inode(inode); 25462306a36Sopenharmony_ci struct seq_file *s = p; 25562306a36Sopenharmony_ci struct ceph_cap *cap; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci spin_lock(&ci->i_ceph_lock); 25862306a36Sopenharmony_ci cap = __get_cap_for_mds(ci, mds); 25962306a36Sopenharmony_ci if (cap) 26062306a36Sopenharmony_ci seq_printf(s, "0x%-17llx%-3d%-17s%-17s\n", ceph_ino(inode), 26162306a36Sopenharmony_ci cap->session->s_mds, 26262306a36Sopenharmony_ci ceph_cap_string(cap->issued), 26362306a36Sopenharmony_ci ceph_cap_string(cap->implemented)); 26462306a36Sopenharmony_ci spin_unlock(&ci->i_ceph_lock); 26562306a36Sopenharmony_ci return 0; 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic int caps_show(struct seq_file *s, void *p) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 27162306a36Sopenharmony_ci struct ceph_mds_client *mdsc = fsc->mdsc; 27262306a36Sopenharmony_ci int total, avail, used, reserved, min, i; 27362306a36Sopenharmony_ci struct cap_wait *cw; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci ceph_reservation_status(fsc, &total, &avail, &used, &reserved, &min); 27662306a36Sopenharmony_ci seq_printf(s, "total\t\t%d\n" 27762306a36Sopenharmony_ci "avail\t\t%d\n" 27862306a36Sopenharmony_ci "used\t\t%d\n" 27962306a36Sopenharmony_ci "reserved\t%d\n" 28062306a36Sopenharmony_ci "min\t\t%d\n\n", 28162306a36Sopenharmony_ci total, avail, used, reserved, min); 28262306a36Sopenharmony_ci seq_printf(s, "ino mds issued implemented\n"); 28362306a36Sopenharmony_ci seq_printf(s, "--------------------------------------------------\n"); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci mutex_lock(&mdsc->mutex); 28662306a36Sopenharmony_ci for (i = 0; i < mdsc->max_sessions; i++) { 28762306a36Sopenharmony_ci struct ceph_mds_session *session; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci session = __ceph_lookup_mds_session(mdsc, i); 29062306a36Sopenharmony_ci if (!session) 29162306a36Sopenharmony_ci continue; 29262306a36Sopenharmony_ci mutex_unlock(&mdsc->mutex); 29362306a36Sopenharmony_ci mutex_lock(&session->s_mutex); 29462306a36Sopenharmony_ci ceph_iterate_session_caps(session, caps_show_cb, s); 29562306a36Sopenharmony_ci mutex_unlock(&session->s_mutex); 29662306a36Sopenharmony_ci ceph_put_mds_session(session); 29762306a36Sopenharmony_ci mutex_lock(&mdsc->mutex); 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci mutex_unlock(&mdsc->mutex); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci seq_printf(s, "\n\nWaiters:\n--------\n"); 30262306a36Sopenharmony_ci seq_printf(s, "tgid ino need want\n"); 30362306a36Sopenharmony_ci seq_printf(s, "-----------------------------------------------------\n"); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci spin_lock(&mdsc->caps_list_lock); 30662306a36Sopenharmony_ci list_for_each_entry(cw, &mdsc->cap_wait_list, list) { 30762306a36Sopenharmony_ci seq_printf(s, "%-13d0x%-17llx%-17s%-17s\n", cw->tgid, cw->ino, 30862306a36Sopenharmony_ci ceph_cap_string(cw->need), 30962306a36Sopenharmony_ci ceph_cap_string(cw->want)); 31062306a36Sopenharmony_ci } 31162306a36Sopenharmony_ci spin_unlock(&mdsc->caps_list_lock); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci return 0; 31462306a36Sopenharmony_ci} 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_cistatic int mds_sessions_show(struct seq_file *s, void *ptr) 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 31962306a36Sopenharmony_ci struct ceph_mds_client *mdsc = fsc->mdsc; 32062306a36Sopenharmony_ci struct ceph_auth_client *ac = fsc->client->monc.auth; 32162306a36Sopenharmony_ci struct ceph_options *opt = fsc->client->options; 32262306a36Sopenharmony_ci int mds; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci mutex_lock(&mdsc->mutex); 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci /* The 'num' portion of an 'entity name' */ 32762306a36Sopenharmony_ci seq_printf(s, "global_id %llu\n", ac->global_id); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci /* The -o name mount argument */ 33062306a36Sopenharmony_ci seq_printf(s, "name \"%s\"\n", opt->name ? opt->name : ""); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci /* The list of MDS session rank+state */ 33362306a36Sopenharmony_ci for (mds = 0; mds < mdsc->max_sessions; mds++) { 33462306a36Sopenharmony_ci struct ceph_mds_session *session = 33562306a36Sopenharmony_ci __ceph_lookup_mds_session(mdsc, mds); 33662306a36Sopenharmony_ci if (!session) { 33762306a36Sopenharmony_ci continue; 33862306a36Sopenharmony_ci } 33962306a36Sopenharmony_ci mutex_unlock(&mdsc->mutex); 34062306a36Sopenharmony_ci seq_printf(s, "mds.%d %s\n", 34162306a36Sopenharmony_ci session->s_mds, 34262306a36Sopenharmony_ci ceph_session_state_name(session->s_state)); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci ceph_put_mds_session(session); 34562306a36Sopenharmony_ci mutex_lock(&mdsc->mutex); 34662306a36Sopenharmony_ci } 34762306a36Sopenharmony_ci mutex_unlock(&mdsc->mutex); 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci return 0; 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic int status_show(struct seq_file *s, void *p) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci struct ceph_fs_client *fsc = s->private; 35562306a36Sopenharmony_ci struct ceph_entity_inst *inst = &fsc->client->msgr.inst; 35662306a36Sopenharmony_ci struct ceph_entity_addr *client_addr = ceph_client_addr(fsc->client); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci seq_printf(s, "instance: %s.%lld %s/%u\n", ENTITY_NAME(inst->name), 35962306a36Sopenharmony_ci ceph_pr_addr(client_addr), le32_to_cpu(client_addr->nonce)); 36062306a36Sopenharmony_ci seq_printf(s, "blocklisted: %s\n", fsc->blocklisted ? "true" : "false"); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci return 0; 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mdsmap); 36662306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mdsc); 36762306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(caps); 36862306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(mds_sessions); 36962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(status); 37062306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(metrics_file); 37162306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(metrics_latency); 37262306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(metrics_size); 37362306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(metrics_caps); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci/* 37762306a36Sopenharmony_ci * debugfs 37862306a36Sopenharmony_ci */ 37962306a36Sopenharmony_cistatic int congestion_kb_set(void *data, u64 val) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci struct ceph_fs_client *fsc = (struct ceph_fs_client *)data; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci fsc->mount_options->congestion_kb = (int)val; 38462306a36Sopenharmony_ci return 0; 38562306a36Sopenharmony_ci} 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistatic int congestion_kb_get(void *data, u64 *val) 38862306a36Sopenharmony_ci{ 38962306a36Sopenharmony_ci struct ceph_fs_client *fsc = (struct ceph_fs_client *)data; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci *val = (u64)fsc->mount_options->congestion_kb; 39262306a36Sopenharmony_ci return 0; 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ciDEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get, 39662306a36Sopenharmony_ci congestion_kb_set, "%llu\n"); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_civoid ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci dout("ceph_fs_debugfs_cleanup\n"); 40262306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_bdi); 40362306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_congestion_kb); 40462306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_mdsmap); 40562306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_mds_sessions); 40662306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_caps); 40762306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_status); 40862306a36Sopenharmony_ci debugfs_remove(fsc->debugfs_mdsc); 40962306a36Sopenharmony_ci debugfs_remove_recursive(fsc->debugfs_metrics_dir); 41062306a36Sopenharmony_ci} 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_civoid ceph_fs_debugfs_init(struct ceph_fs_client *fsc) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci char name[100]; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci dout("ceph_fs_debugfs_init\n"); 41762306a36Sopenharmony_ci fsc->debugfs_congestion_kb = 41862306a36Sopenharmony_ci debugfs_create_file("writeback_congestion_kb", 41962306a36Sopenharmony_ci 0600, 42062306a36Sopenharmony_ci fsc->client->debugfs_dir, 42162306a36Sopenharmony_ci fsc, 42262306a36Sopenharmony_ci &congestion_kb_fops); 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci snprintf(name, sizeof(name), "../../bdi/%s", 42562306a36Sopenharmony_ci bdi_dev_name(fsc->sb->s_bdi)); 42662306a36Sopenharmony_ci fsc->debugfs_bdi = 42762306a36Sopenharmony_ci debugfs_create_symlink("bdi", 42862306a36Sopenharmony_ci fsc->client->debugfs_dir, 42962306a36Sopenharmony_ci name); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci fsc->debugfs_mdsmap = debugfs_create_file("mdsmap", 43262306a36Sopenharmony_ci 0400, 43362306a36Sopenharmony_ci fsc->client->debugfs_dir, 43462306a36Sopenharmony_ci fsc, 43562306a36Sopenharmony_ci &mdsmap_fops); 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci fsc->debugfs_mds_sessions = debugfs_create_file("mds_sessions", 43862306a36Sopenharmony_ci 0400, 43962306a36Sopenharmony_ci fsc->client->debugfs_dir, 44062306a36Sopenharmony_ci fsc, 44162306a36Sopenharmony_ci &mds_sessions_fops); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci fsc->debugfs_mdsc = debugfs_create_file("mdsc", 44462306a36Sopenharmony_ci 0400, 44562306a36Sopenharmony_ci fsc->client->debugfs_dir, 44662306a36Sopenharmony_ci fsc, 44762306a36Sopenharmony_ci &mdsc_fops); 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci fsc->debugfs_caps = debugfs_create_file("caps", 45062306a36Sopenharmony_ci 0400, 45162306a36Sopenharmony_ci fsc->client->debugfs_dir, 45262306a36Sopenharmony_ci fsc, 45362306a36Sopenharmony_ci &caps_fops); 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci fsc->debugfs_status = debugfs_create_file("status", 45662306a36Sopenharmony_ci 0400, 45762306a36Sopenharmony_ci fsc->client->debugfs_dir, 45862306a36Sopenharmony_ci fsc, 45962306a36Sopenharmony_ci &status_fops); 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci fsc->debugfs_metrics_dir = debugfs_create_dir("metrics", 46262306a36Sopenharmony_ci fsc->client->debugfs_dir); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci debugfs_create_file("file", 0400, fsc->debugfs_metrics_dir, fsc, 46562306a36Sopenharmony_ci &metrics_file_fops); 46662306a36Sopenharmony_ci debugfs_create_file("latency", 0400, fsc->debugfs_metrics_dir, fsc, 46762306a36Sopenharmony_ci &metrics_latency_fops); 46862306a36Sopenharmony_ci debugfs_create_file("size", 0400, fsc->debugfs_metrics_dir, fsc, 46962306a36Sopenharmony_ci &metrics_size_fops); 47062306a36Sopenharmony_ci debugfs_create_file("caps", 0400, fsc->debugfs_metrics_dir, fsc, 47162306a36Sopenharmony_ci &metrics_caps_fops); 47262306a36Sopenharmony_ci} 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci#else /* CONFIG_DEBUG_FS */ 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_civoid ceph_fs_debugfs_init(struct ceph_fs_client *fsc) 47862306a36Sopenharmony_ci{ 47962306a36Sopenharmony_ci} 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_civoid ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc) 48262306a36Sopenharmony_ci{ 48362306a36Sopenharmony_ci} 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci#endif /* CONFIG_DEBUG_FS */ 486