ALSA: es1688: add pedantic range checks
[safe/jmp/linux-2.6] / fs / ubifs / debug.c
index 93f6532..c2a68ba 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/moduleparam.h>
 #include <linux/debugfs.h>
 #include <linux/math64.h>
+#include <linux/slab.h>
 
 #ifdef CONFIG_UBIFS_FS_DEBUG
 
@@ -210,6 +211,20 @@ const char *dbg_cstate(int cmt_state)
        }
 }
 
+const char *dbg_jhead(int jhead)
+{
+       switch (jhead) {
+       case GCHD:
+               return "0 (GC)";
+       case BASEHD:
+               return "1 (base)";
+       case DATAHD:
+               return "2 (data)";
+       default:
+               return "unknown journal head";
+       }
+}
+
 static void dump_ch(const struct ubifs_ch *ch)
 {
        printk(KERN_DEBUG "\tmagic          %#x\n", le32_to_cpu(ch->magic));
@@ -336,13 +351,8 @@ void dbg_dump_node(const struct ubifs_info *c, const void *node)
                       le32_to_cpu(sup->fmt_version));
                printk(KERN_DEBUG "\ttime_gran      %u\n",
                       le32_to_cpu(sup->time_gran));
-               printk(KERN_DEBUG "\tUUID           %02X%02X%02X%02X-%02X%02X"
-                      "-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",
-                      sup->uuid[0], sup->uuid[1], sup->uuid[2], sup->uuid[3],
-                      sup->uuid[4], sup->uuid[5], sup->uuid[6], sup->uuid[7],
-                      sup->uuid[8], sup->uuid[9], sup->uuid[10], sup->uuid[11],
-                      sup->uuid[12], sup->uuid[13], sup->uuid[14],
-                      sup->uuid[15]);
+               printk(KERN_DEBUG "\tUUID           %pUB\n",
+                      sup->uuid);
                break;
        }
        case UBIFS_MST_NODE:
@@ -623,8 +633,9 @@ void dbg_dump_budg(struct ubifs_info *c)
        /* If we are in R/O mode, journal heads do not exist */
        if (c->jheads)
                for (i = 0; i < c->jhead_cnt; i++)
-                       printk(KERN_DEBUG "\tjhead %d\t LEB %d\n",
-                              c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum);
+                       printk(KERN_DEBUG "\tjhead %s\t LEB %d\n",
+                              dbg_jhead(c->jheads[i].wbuf.jhead),
+                              c->jheads[i].wbuf.lnum);
        for (rb = rb_first(&c->buds); rb; rb = rb_next(rb)) {
                bud = rb_entry(rb, struct ubifs_bud, rb);
                printk(KERN_DEBUG "\tbud LEB %d\n", bud->lnum);
@@ -648,9 +659,90 @@ void dbg_dump_budg(struct ubifs_info *c)
 
 void dbg_dump_lprop(const struct ubifs_info *c, const struct ubifs_lprops *lp)
 {
-       printk(KERN_DEBUG "LEB %d lprops: free %d, dirty %d (used %d), "
-              "flags %#x\n", lp->lnum, lp->free, lp->dirty,
-              c->leb_size - lp->free - lp->dirty, lp->flags);
+       int i, spc, dark = 0, dead = 0;
+       struct rb_node *rb;
+       struct ubifs_bud *bud;
+
+       spc = lp->free + lp->dirty;
+       if (spc < c->dead_wm)
+               dead = spc;
+       else
+               dark = ubifs_calc_dark(c, spc);
+
+       if (lp->flags & LPROPS_INDEX)
+               printk(KERN_DEBUG "LEB %-7d free %-8d dirty %-8d used %-8d "
+                      "free + dirty %-8d flags %#x (", lp->lnum, lp->free,
+                      lp->dirty, c->leb_size - spc, spc, lp->flags);
+       else
+               printk(KERN_DEBUG "LEB %-7d free %-8d dirty %-8d used %-8d "
+                      "free + dirty %-8d dark %-4d dead %-4d nodes fit %-3d "
+                      "flags %#-4x (", lp->lnum, lp->free, lp->dirty,
+                      c->leb_size - spc, spc, dark, dead,
+                      (int)(spc / UBIFS_MAX_NODE_SZ), lp->flags);
+
+       if (lp->flags & LPROPS_TAKEN) {
+               if (lp->flags & LPROPS_INDEX)
+                       printk(KERN_CONT "index, taken");
+               else
+                       printk(KERN_CONT "taken");
+       } else {
+               const char *s;
+
+               if (lp->flags & LPROPS_INDEX) {
+                       switch (lp->flags & LPROPS_CAT_MASK) {
+                       case LPROPS_DIRTY_IDX:
+                               s = "dirty index";
+                               break;
+                       case LPROPS_FRDI_IDX:
+                               s = "freeable index";
+                               break;
+                       default:
+                               s = "index";
+                       }
+               } else {
+                       switch (lp->flags & LPROPS_CAT_MASK) {
+                       case LPROPS_UNCAT:
+                               s = "not categorized";
+                               break;
+                       case LPROPS_DIRTY:
+                               s = "dirty";
+                               break;
+                       case LPROPS_FREE:
+                               s = "free";
+                               break;
+                       case LPROPS_EMPTY:
+                               s = "empty";
+                               break;
+                       case LPROPS_FREEABLE:
+                               s = "freeable";
+                               break;
+                       default:
+                               s = NULL;
+                               break;
+                       }
+               }
+               printk(KERN_CONT "%s", s);
+       }
+
+       for (rb = rb_first((struct rb_root *)&c->buds); rb; rb = rb_next(rb)) {
+               bud = rb_entry(rb, struct ubifs_bud, rb);
+               if (bud->lnum == lp->lnum) {
+                       int head = 0;
+                       for (i = 0; i < c->jhead_cnt; i++) {
+                               if (lp->lnum == c->jheads[i].wbuf.lnum) {
+                                       printk(KERN_CONT ", jhead %s",
+                                              dbg_jhead(i));
+                                       head = 1;
+                               }
+                       }
+                       if (!head)
+                               printk(KERN_CONT ", bud of jhead %s",
+                                      dbg_jhead(bud->jhead));
+               }
+       }
+       if (lp->lnum == c->gc_lnum)
+               printk(KERN_CONT ", GC LEB");
+       printk(KERN_CONT ")\n");
 }
 
 void dbg_dump_lprops(struct ubifs_info *c)
@@ -724,7 +816,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
 
        printk(KERN_DEBUG "(pid %d) start dumping LEB %d\n",
               current->pid, lnum);
-       sleb = ubifs_scan(c, lnum, 0, c->dbg->buf);
+       sleb = ubifs_scan(c, lnum, 0, c->dbg->buf, 0);
        if (IS_ERR(sleb)) {
                ubifs_err("scan error %d", (int)PTR_ERR(sleb));
                return;
@@ -909,8 +1001,10 @@ out:
        ubifs_msg("saved lprops statistics dump");
        dbg_dump_lstats(&d->saved_lst);
        ubifs_get_lp_stats(c, &lst);
+
        ubifs_msg("current lprops statistics dump");
-       dbg_dump_lstats(&d->saved_lst);
+       dbg_dump_lstats(&lst);
+
        spin_lock(&c->space_lock);
        dbg_dump_budg(c);
        spin_unlock(&c->space_lock);
@@ -1214,7 +1308,7 @@ static int dbg_check_znode(struct ubifs_info *c, struct ubifs_zbranch *zbr)
 
                        /*
                         * Make sure the last key in our znode is less or
-                        * equivalent than the the key in zbranch which goes
+                        * equivalent than the key in the zbranch which goes
                         * after our pointing zbranch.
                         */
                        cmp = keys_cmp(c, max,
@@ -1916,7 +2010,7 @@ static int check_leaf(struct ubifs_info *c, struct ubifs_zbranch *zbr,
                inum = key_inum_flash(c, &dent->key);
                fscki1 = read_add_inode(c, priv, inum);
                if (IS_ERR(fscki1)) {
-                       err = PTR_ERR(fscki);
+                       err = PTR_ERR(fscki1);
                        ubifs_err("error %d while processing entry node and "
                                  "trying to find parent inode node %lu",
                                  err, (unsigned long)inum);