linux/net/ceph/debugfs.c
<<
>>
Prefs
   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#ifdef CONFIG_DEBUG_FS
  16
  17/*
  18 * Implement /sys/kernel/debug/ceph fun
  19 *
  20 * /sys/kernel/debug/ceph/client*  - an instance of the ceph client
  21 *      .../osdmap      - current osdmap
  22 *      .../monmap      - current monmap
  23 *      .../osdc        - active osd requests
  24 *      .../monc        - mon client state
  25 *      .../dentry_lru  - dump contents of dentry lru
  26 *      .../caps        - expose cap (reservation) stats
  27 *      .../bdi         - symlink to ../../bdi/something
  28 */
  29
  30static struct dentry *ceph_debugfs_dir;
  31
  32static int monmap_show(struct seq_file *s, void *p)
  33{
  34        int i;
  35        struct ceph_client *client = s->private;
  36
  37        if (client->monc.monmap == NULL)
  38                return 0;
  39
  40        seq_printf(s, "epoch %d\n", client->monc.monmap->epoch);
  41        for (i = 0; i < client->monc.monmap->num_mon; i++) {
  42                struct ceph_entity_inst *inst =
  43                        &client->monc.monmap->mon_inst[i];
  44
  45                seq_printf(s, "\t%s%lld\t%s\n",
  46                           ENTITY_NAME(inst->name),
  47                           ceph_pr_addr(&inst->addr.in_addr));
  48        }
  49        return 0;
  50}
  51
  52static int osdmap_show(struct seq_file *s, void *p)
  53{
  54        int i;
  55        struct ceph_client *client = s->private;
  56        struct rb_node *n;
  57
  58        if (client->osdc.osdmap == NULL)
  59                return 0;
  60        seq_printf(s, "epoch %d\n", client->osdc.osdmap->epoch);
  61        seq_printf(s, "flags%s%s\n",
  62                   (client->osdc.osdmap->flags & CEPH_OSDMAP_NEARFULL) ?
  63                   " NEARFULL" : "",
  64                   (client->osdc.osdmap->flags & CEPH_OSDMAP_FULL) ?
  65                   " FULL" : "");
  66        for (n = rb_first(&client->osdc.osdmap->pg_pools); n; n = rb_next(n)) {
  67                struct ceph_pg_pool_info *pool =
  68                        rb_entry(n, struct ceph_pg_pool_info, node);
  69                seq_printf(s, "pg_pool %llu pg_num %d / %d\n",
  70                           (unsigned long long)pool->id, pool->pg_num,
  71                           pool->pg_num_mask);
  72        }
  73        for (i = 0; i < client->osdc.osdmap->max_osd; i++) {
  74                struct ceph_entity_addr *addr =
  75                        &client->osdc.osdmap->osd_addr[i];
  76                int state = client->osdc.osdmap->osd_state[i];
  77                char sb[64];
  78
  79                seq_printf(s, "\tosd%d\t%s\t%3d%%\t(%s)\n",
  80                           i, ceph_pr_addr(&addr->in_addr),
  81                           ((client->osdc.osdmap->osd_weight[i]*100) >> 16),
  82                           ceph_osdmap_state_str(sb, sizeof(sb), state));
  83        }
  84        return 0;
  85}
  86
  87static int monc_show(struct seq_file *s, void *p)
  88{
  89        struct ceph_client *client = s->private;
  90        struct ceph_mon_generic_request *req;
  91        struct ceph_mon_client *monc = &client->monc;
  92        struct rb_node *rp;
  93
  94        mutex_lock(&monc->mutex);
  95
  96        if (monc->have_mdsmap)
  97                seq_printf(s, "have mdsmap %u\n", (unsigned int)monc->have_mdsmap);
  98        if (monc->have_osdmap)
  99                seq_printf(s, "have osdmap %u\n", (unsigned int)monc->have_osdmap);
 100        if (monc->want_next_osdmap)
 101                seq_printf(s, "want next osdmap\n");
 102
 103        for (rp = rb_first(&monc->generic_request_tree); rp; rp = rb_next(rp)) {
 104                __u16 op;
 105                req = rb_entry(rp, struct ceph_mon_generic_request, node);
 106                op = le16_to_cpu(req->request->hdr.type);
 107                if (op == CEPH_MSG_STATFS)
 108                        seq_printf(s, "%lld statfs\n", req->tid);
 109                else
 110                        seq_printf(s, "%lld unknown\n", req->tid);
 111        }
 112
 113        mutex_unlock(&monc->mutex);
 114        return 0;
 115}
 116
 117static int osdc_show(struct seq_file *s, void *pp)
 118{
 119        struct ceph_client *client = s->private;
 120        struct ceph_osd_client *osdc = &client->osdc;
 121        struct rb_node *p;
 122
 123        mutex_lock(&osdc->request_mutex);
 124        for (p = rb_first(&osdc->requests); p; p = rb_next(p)) {
 125                struct ceph_osd_request *req;
 126                unsigned int i;
 127                int opcode;
 128
 129                req = rb_entry(p, struct ceph_osd_request, r_node);
 130
 131                seq_printf(s, "%lld\tosd%d\t%lld.%x\t", req->r_tid,
 132                           req->r_osd ? req->r_osd->o_osd : -1,
 133                           req->r_pgid.pool, req->r_pgid.seed);
 134
 135                seq_printf(s, "%.*s", req->r_oid_len, req->r_oid);
 136
 137                if (req->r_reassert_version.epoch)
 138                        seq_printf(s, "\t%u'%llu",
 139                           (unsigned int)le32_to_cpu(req->r_reassert_version.epoch),
 140                           le64_to_cpu(req->r_reassert_version.version));
 141                else
 142                        seq_printf(s, "\t");
 143
 144                for (i = 0; i < req->r_num_ops; i++) {
 145                        opcode = req->r_ops[i].op;
 146                        seq_printf(s, "\t%s", ceph_osd_op_name(opcode));
 147                }
 148
 149                seq_printf(s, "\n");
 150        }
 151        mutex_unlock(&osdc->request_mutex);
 152        return 0;
 153}
 154
 155CEPH_DEFINE_SHOW_FUNC(monmap_show)
 156CEPH_DEFINE_SHOW_FUNC(osdmap_show)
 157CEPH_DEFINE_SHOW_FUNC(monc_show)
 158CEPH_DEFINE_SHOW_FUNC(osdc_show)
 159
 160int ceph_debugfs_init(void)
 161{
 162        ceph_debugfs_dir = debugfs_create_dir("ceph", NULL);
 163        if (!ceph_debugfs_dir)
 164                return -ENOMEM;
 165        return 0;
 166}
 167
 168void ceph_debugfs_cleanup(void)
 169{
 170        debugfs_remove(ceph_debugfs_dir);
 171}
 172
 173int ceph_debugfs_client_init(struct ceph_client *client)
 174{
 175        int ret = -ENOMEM;
 176        char name[80];
 177
 178        snprintf(name, sizeof(name), "%pU.client%lld", &client->fsid,
 179                 client->monc.auth->global_id);
 180
 181        dout("ceph_debugfs_client_init %p %s\n", client, name);
 182
 183        BUG_ON(client->debugfs_dir);
 184        client->debugfs_dir = debugfs_create_dir(name, ceph_debugfs_dir);
 185        if (!client->debugfs_dir)
 186                goto out;
 187
 188        client->monc.debugfs_file = debugfs_create_file("monc",
 189                                                      0600,
 190                                                      client->debugfs_dir,
 191                                                      client,
 192                                                      &monc_show_fops);
 193        if (!client->monc.debugfs_file)
 194                goto out;
 195
 196        client->osdc.debugfs_file = debugfs_create_file("osdc",
 197                                                      0600,
 198                                                      client->debugfs_dir,
 199                                                      client,
 200                                                      &osdc_show_fops);
 201        if (!client->osdc.debugfs_file)
 202                goto out;
 203
 204        client->debugfs_monmap = debugfs_create_file("monmap",
 205                                        0600,
 206                                        client->debugfs_dir,
 207                                        client,
 208                                        &monmap_show_fops);
 209        if (!client->debugfs_monmap)
 210                goto out;
 211
 212        client->debugfs_osdmap = debugfs_create_file("osdmap",
 213                                        0600,
 214                                        client->debugfs_dir,
 215                                        client,
 216                                        &osdmap_show_fops);
 217        if (!client->debugfs_osdmap)
 218                goto out;
 219
 220        return 0;
 221
 222out:
 223        ceph_debugfs_client_cleanup(client);
 224        return ret;
 225}
 226
 227void ceph_debugfs_client_cleanup(struct ceph_client *client)
 228{
 229        dout("ceph_debugfs_client_cleanup %p\n", client);
 230        debugfs_remove(client->debugfs_osdmap);
 231        debugfs_remove(client->debugfs_monmap);
 232        debugfs_remove(client->osdc.debugfs_file);
 233        debugfs_remove(client->monc.debugfs_file);
 234        debugfs_remove(client->debugfs_dir);
 235}
 236
 237#else  /* CONFIG_DEBUG_FS */
 238
 239int ceph_debugfs_init(void)
 240{
 241        return 0;
 242}
 243
 244void ceph_debugfs_cleanup(void)
 245{
 246}
 247
 248int ceph_debugfs_client_init(struct ceph_client *client)
 249{
 250        return 0;
 251}
 252
 253void ceph_debugfs_client_cleanup(struct ceph_client *client)
 254{
 255}
 256
 257#endif  /* CONFIG_DEBUG_FS */
 258
 259EXPORT_SYMBOL(ceph_debugfs_init);
 260EXPORT_SYMBOL(ceph_debugfs_cleanup);
 261