Remove tput calls. It does not work for unknown
[platform/kernel/u-boot.git] / fs / ubifs / replay.c
index 7268b37..176125e 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/err.h>
 #endif
 #include "ubifs.h"
+#include <linux/bug.h>
 #include <linux/list_sort.h>
 
 /**
@@ -78,7 +79,6 @@ struct bud_entry {
        int dirty;
 };
 
-#ifndef __UBOOT__
 /**
  * set_bud_lprops - set free and dirty space used by a bud.
  * @c: UBIFS file-system description object
@@ -432,7 +432,6 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len,
        list_add_tail(&r->list, &c->replay_list);
        return 0;
 }
-#endif
 
 /**
  * ubifs_validate_entry - validate directory or extended attribute entry node.
@@ -453,20 +452,19 @@ int ubifs_validate_entry(struct ubifs_info *c,
            nlen > UBIFS_MAX_NLEN || dent->name[nlen] != 0 ||
            strnlen(dent->name, nlen) != nlen ||
            le64_to_cpu(dent->inum) > MAX_INUM) {
-               ubifs_err("bad %s node", key_type == UBIFS_DENT_KEY ?
+               ubifs_err(c, "bad %s node", key_type == UBIFS_DENT_KEY ?
                          "directory entry" : "extended attribute entry");
                return -EINVAL;
        }
 
        if (key_type != UBIFS_DENT_KEY && key_type != UBIFS_XENT_KEY) {
-               ubifs_err("bad key type %d", key_type);
+               ubifs_err(c, "bad key type %d", key_type);
                return -EINVAL;
        }
 
        return 0;
 }
 
-#ifndef __UBOOT__
 /**
  * is_last_bud - check if the bud is the last in the journal head.
  * @c: UBIFS file-system description object
@@ -585,7 +583,7 @@ static int replay_bud(struct ubifs_info *c, struct bud_entry *b)
                cond_resched();
 
                if (snod->sqnum >= SQNUM_WATERMARK) {
-                       ubifs_err("file system's life ended");
+                       ubifs_err(c, "file system's life ended");
                        goto out_dump;
                }
 
@@ -643,7 +641,7 @@ static int replay_bud(struct ubifs_info *c, struct bud_entry *b)
                        if (old_size < 0 || old_size > c->max_inode_sz ||
                            new_size < 0 || new_size > c->max_inode_sz ||
                            old_size <= new_size) {
-                               ubifs_err("bad truncation node");
+                               ubifs_err(c, "bad truncation node");
                                goto out_dump;
                        }
 
@@ -658,7 +656,7 @@ static int replay_bud(struct ubifs_info *c, struct bud_entry *b)
                        break;
                }
                default:
-                       ubifs_err("unexpected node type %d in bud LEB %d:%d",
+                       ubifs_err(c, "unexpected node type %d in bud LEB %d:%d",
                                  snod->type, lnum, snod->offs);
                        err = -EINVAL;
                        goto out_dump;
@@ -681,7 +679,7 @@ out:
        return err;
 
 out_dump:
-       ubifs_err("bad node is at LEB %d:%d", lnum, snod->offs);
+       ubifs_err(c, "bad node is at LEB %d:%d", lnum, snod->offs);
        ubifs_dump_node(c, snod->node);
        ubifs_scan_destroy(sleb);
        return -EINVAL;
@@ -801,7 +799,7 @@ static int validate_ref(struct ubifs_info *c, const struct ubifs_ref_node *ref)
        if (bud) {
                if (bud->jhead == jhead && bud->start <= offs)
                        return 1;
-               ubifs_err("bud at LEB %d:%d was already referred", lnum, offs);
+               ubifs_err(c, "bud at LEB %d:%d was already referred", lnum, offs);
                return -EINVAL;
        }
 
@@ -857,12 +855,12 @@ static int replay_log_leb(struct ubifs_info *c, int lnum, int offs, void *sbuf)
                 * numbers.
                 */
                if (snod->type != UBIFS_CS_NODE) {
-                       ubifs_err("first log node at LEB %d:%d is not CS node",
+                       ubifs_err(c, "first log node at LEB %d:%d is not CS node",
                                  lnum, offs);
                        goto out_dump;
                }
                if (le64_to_cpu(node->cmt_no) != c->cmt_no) {
-                       ubifs_err("first CS node at LEB %d:%d has wrong commit number %llu expected %llu",
+                       ubifs_err(c, "first CS node at LEB %d:%d has wrong commit number %llu expected %llu",
                                  lnum, offs,
                                  (unsigned long long)le64_to_cpu(node->cmt_no),
                                  c->cmt_no);
@@ -887,7 +885,7 @@ static int replay_log_leb(struct ubifs_info *c, int lnum, int offs, void *sbuf)
 
        /* Make sure the first node sits at offset zero of the LEB */
        if (snod->offs != 0) {
-               ubifs_err("first node is not at zero offset");
+               ubifs_err(c, "first node is not at zero offset");
                goto out_dump;
        }
 
@@ -895,12 +893,12 @@ static int replay_log_leb(struct ubifs_info *c, int lnum, int offs, void *sbuf)
                cond_resched();
 
                if (snod->sqnum >= SQNUM_WATERMARK) {
-                       ubifs_err("file system's life ended");
+                       ubifs_err(c, "file system's life ended");
                        goto out_dump;
                }
 
                if (snod->sqnum < c->cs_sqnum) {
-                       ubifs_err("bad sqnum %llu, commit sqnum %llu",
+                       ubifs_err(c, "bad sqnum %llu, commit sqnum %llu",
                                  snod->sqnum, c->cs_sqnum);
                        goto out_dump;
                }
@@ -930,12 +928,12 @@ static int replay_log_leb(struct ubifs_info *c, int lnum, int offs, void *sbuf)
                case UBIFS_CS_NODE:
                        /* Make sure it sits at the beginning of LEB */
                        if (snod->offs != 0) {
-                               ubifs_err("unexpected node in log");
+                               ubifs_err(c, "unexpected node in log");
                                goto out_dump;
                        }
                        break;
                default:
-                       ubifs_err("unexpected node in log");
+                       ubifs_err(c, "unexpected node in log");
                        goto out_dump;
                }
        }
@@ -951,7 +949,7 @@ out:
        return err;
 
 out_dump:
-       ubifs_err("log error detected while replaying the log at LEB %d:%d",
+       ubifs_err(c, "log error detected while replaying the log at LEB %d:%d",
                  lnum, offs + snod->offs);
        ubifs_dump_node(c, snod->node);
        ubifs_scan_destroy(sleb);
@@ -1013,7 +1011,7 @@ int ubifs_replay_journal(struct ubifs_info *c)
                return free; /* Error code */
 
        if (c->ihead_offs != c->leb_size - free) {
-               ubifs_err("bad index head LEB %d:%d", c->ihead_lnum,
+               ubifs_err(c, "bad index head LEB %d:%d", c->ihead_lnum,
                          c->ihead_offs);
                return -EINVAL;
        }
@@ -1024,9 +1022,22 @@ int ubifs_replay_journal(struct ubifs_info *c)
 
        do {
                err = replay_log_leb(c, lnum, 0, c->sbuf);
-               if (err == 1)
-                       /* We hit the end of the log */
-                       break;
+               if (err == 1) {
+                       if (lnum != c->lhead_lnum)
+                               /* We hit the end of the log */
+                               break;
+
+                       /*
+                        * The head of the log must always start with the
+                        * "commit start" node on a properly formatted UBIFS.
+                        * But we found no nodes at all, which means that
+                        * someting went wrong and we cannot proceed mounting
+                        * the file-system.
+                        */
+                       ubifs_err(c, "no UBIFS nodes found at the log head LEB %d:%d, possibly corrupted",
+                                 lnum, 0);
+                       err = -EINVAL;
+               }
                if (err)
                        goto out;
                lnum = ubifs_next_log_lnum(c, lnum);
@@ -1063,4 +1074,3 @@ out:
        c->replaying = 0;
        return err;
 }
-#endif