Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
[linux-2.6-block.git] / net / ceph / debugfs.c
index 71ba13927b3d1726bd488403de8274478a956091..fa5233e0d01cc923de9f960040962e21792d44a8 100644 (file)
@@ -77,7 +77,7 @@ static int osdmap_show(struct seq_file *s, void *p)
        }
        for (i = 0; i < map->max_osd; i++) {
                struct ceph_entity_addr *addr = &map->osd_addr[i];
-               int state = map->osd_state[i];
+               u32 state = map->osd_state[i];
                char sb[64];
 
                seq_printf(s, "osd%d\t%s\t%3d%%\t(%s)\t%3d%%\n",
@@ -104,6 +104,29 @@ static int osdmap_show(struct seq_file *s, void *p)
                seq_printf(s, "primary_temp %llu.%x %d\n", pg->pgid.pool,
                           pg->pgid.seed, pg->primary_temp.osd);
        }
+       for (n = rb_first(&map->pg_upmap); n; n = rb_next(n)) {
+               struct ceph_pg_mapping *pg =
+                       rb_entry(n, struct ceph_pg_mapping, node);
+
+               seq_printf(s, "pg_upmap %llu.%x [", pg->pgid.pool,
+                          pg->pgid.seed);
+               for (i = 0; i < pg->pg_upmap.len; i++)
+                       seq_printf(s, "%s%d", (i == 0 ? "" : ","),
+                                  pg->pg_upmap.osds[i]);
+               seq_printf(s, "]\n");
+       }
+       for (n = rb_first(&map->pg_upmap_items); n; n = rb_next(n)) {
+               struct ceph_pg_mapping *pg =
+                       rb_entry(n, struct ceph_pg_mapping, node);
+
+               seq_printf(s, "pg_upmap_items %llu.%x [", pg->pgid.pool,
+                          pg->pgid.seed);
+               for (i = 0; i < pg->pg_upmap_items.len; i++)
+                       seq_printf(s, "%s%d->%d", (i == 0 ? "" : ","),
+                                  pg->pg_upmap_items.from_to[i][0],
+                                  pg->pg_upmap_items.from_to[i][1]);
+               seq_printf(s, "]\n");
+       }
 
        up_read(&osdc->lock);
        return 0;
@@ -147,17 +170,26 @@ static int monc_show(struct seq_file *s, void *p)
        return 0;
 }
 
+static void dump_spgid(struct seq_file *s, const struct ceph_spg *spgid)
+{
+       seq_printf(s, "%llu.%x", spgid->pgid.pool, spgid->pgid.seed);
+       if (spgid->shard != CEPH_SPG_NOSHARD)
+               seq_printf(s, "s%d", spgid->shard);
+}
+
 static void dump_target(struct seq_file *s, struct ceph_osd_request_target *t)
 {
        int i;
 
-       seq_printf(s, "osd%d\t%llu.%x\t[", t->osd, t->pgid.pool, t->pgid.seed);
+       seq_printf(s, "osd%d\t%llu.%x\t", t->osd, t->pgid.pool, t->pgid.seed);
+       dump_spgid(s, &t->spgid);
+       seq_puts(s, "\t[");
        for (i = 0; i < t->up.size; i++)
                seq_printf(s, "%s%d", (!i ? "" : ","), t->up.osds[i]);
        seq_printf(s, "]/%d\t[", t->up.primary);
        for (i = 0; i < t->acting.size; i++)
                seq_printf(s, "%s%d", (!i ? "" : ","), t->acting.osds[i]);
-       seq_printf(s, "]/%d\t", t->acting.primary);
+       seq_printf(s, "]/%d\te%u\t", t->acting.primary, t->epoch);
        if (t->target_oloc.pool_ns) {
                seq_printf(s, "%*pE/%*pE\t0x%x",
                        (int)t->target_oloc.pool_ns->len,
@@ -234,6 +266,73 @@ static void dump_linger_requests(struct seq_file *s, struct ceph_osd *osd)
        mutex_unlock(&osd->lock);
 }
 
+static void dump_snapid(struct seq_file *s, u64 snapid)
+{
+       if (snapid == CEPH_NOSNAP)
+               seq_puts(s, "head");
+       else if (snapid == CEPH_SNAPDIR)
+               seq_puts(s, "snapdir");
+       else
+               seq_printf(s, "%llx", snapid);
+}
+
+static void dump_name_escaped(struct seq_file *s, unsigned char *name,
+                             size_t len)
+{
+       size_t i;
+
+       for (i = 0; i < len; i++) {
+               if (name[i] == '%' || name[i] == ':' || name[i] == '/' ||
+                   name[i] < 32 || name[i] >= 127) {
+                       seq_printf(s, "%%%02x", name[i]);
+               } else {
+                       seq_putc(s, name[i]);
+               }
+       }
+}
+
+static void dump_hoid(struct seq_file *s, const struct ceph_hobject_id *hoid)
+{
+       if (hoid->snapid == 0 && hoid->hash == 0 && !hoid->is_max &&
+           hoid->pool == S64_MIN) {
+               seq_puts(s, "MIN");
+               return;
+       }
+       if (hoid->is_max) {
+               seq_puts(s, "MAX");
+               return;
+       }
+       seq_printf(s, "%lld:%08x:", hoid->pool, hoid->hash_reverse_bits);
+       dump_name_escaped(s, hoid->nspace, hoid->nspace_len);
+       seq_putc(s, ':');
+       dump_name_escaped(s, hoid->key, hoid->key_len);
+       seq_putc(s, ':');
+       dump_name_escaped(s, hoid->oid, hoid->oid_len);
+       seq_putc(s, ':');
+       dump_snapid(s, hoid->snapid);
+}
+
+static void dump_backoffs(struct seq_file *s, struct ceph_osd *osd)
+{
+       struct rb_node *n;
+
+       mutex_lock(&osd->lock);
+       for (n = rb_first(&osd->o_backoffs_by_id); n; n = rb_next(n)) {
+               struct ceph_osd_backoff *backoff =
+                   rb_entry(n, struct ceph_osd_backoff, id_node);
+
+               seq_printf(s, "osd%d\t", osd->o_osd);
+               dump_spgid(s, &backoff->spgid);
+               seq_printf(s, "\t%llu\t", backoff->id);
+               dump_hoid(s, backoff->begin);
+               seq_putc(s, '\t');
+               dump_hoid(s, backoff->end);
+               seq_putc(s, '\n');
+       }
+
+       mutex_unlock(&osd->lock);
+}
+
 static int osdc_show(struct seq_file *s, void *pp)
 {
        struct ceph_client *client = s->private;
@@ -259,6 +358,13 @@ static int osdc_show(struct seq_file *s, void *pp)
        }
        dump_linger_requests(s, &osdc->homeless_osd);
 
+       seq_puts(s, "BACKOFFS\n");
+       for (n = rb_first(&osdc->osds); n; n = rb_next(n)) {
+               struct ceph_osd *osd = rb_entry(n, struct ceph_osd, o_node);
+
+               dump_backoffs(s, osd);
+       }
+
        up_read(&osdc->lock);
        return 0;
 }