apalis-tk1: enable user debug by default
[oweals/u-boot.git] / fs / ubifs / replay.c
index 1064cb29ba8828e0b0347d6665d1c0a9b897b368..4064157f15497bb4d31389bb2660bf970f8257e0 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * This file is part of UBIFS.
  *
  * Copyright (C) 2006-2008 Nokia Corporation.
  *
- * SPDX-License-Identifier:    GPL-2.0+
- *
  * Authors: Adrian Hunter
  *          Artem Bityutskiy (Битюцкий Артём)
  */
@@ -26,6 +25,7 @@
 #include <linux/err.h>
 #endif
 #include "ubifs.h"
+#include <linux/bug.h>
 #include <linux/list_sort.h>
 
 /**
@@ -451,13 +451,13 @@ 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;
        }
 
@@ -582,7 +582,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;
                }
 
@@ -640,7 +640,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;
                        }
 
@@ -655,7 +655,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;
@@ -678,7 +678,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;
@@ -798,7 +798,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;
        }
 
@@ -854,12 +854,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);
@@ -884,7 +884,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;
        }
 
@@ -892,12 +892,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;
                }
@@ -927,12 +927,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;
                }
        }
@@ -948,7 +948,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);
@@ -1010,7 +1010,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;
        }
@@ -1021,9 +1021,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);