[PATCH RFC 2/2] UBIFS: scan all log lebs during log replay

hujianyang hujianyang at huawei.com
Thu Dec 25 05:10:28 PST 2014


UBIFS suppose no more log lebs need to be scanned when
replay_log_leb() return %1. But it is not true because
some log lebs maybe incorrectly empty and the next leb
of this empty one may contain valid filesystem data.

This patch scan all the log lebs during log replaying
to guarantee these log lebs are in normal state.

I'm not sure if it is a valuable problem and don't know
if this patch gives a good way to solve this problem
either.

Signed-off-by: hujianyang <hujianyang at huawei.com>
---
 fs/ubifs/replay.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c
index f13f4b2..5537b90 100644
--- a/fs/ubifs/replay.c
+++ b/fs/ubifs/replay.c
@@ -1014,7 +1014,7 @@ out:
  */
 int ubifs_replay_journal(struct ubifs_info *c)
 {
-	int err, lnum, free;
+	int err, lnum, free, end;

 	BUILD_BUG_ON(UBIFS_TRUN_KEY > 5);

@@ -1032,13 +1032,28 @@ int ubifs_replay_journal(struct ubifs_info *c)
 	dbg_mnt("start replaying the journal");
 	c->replaying = 1;
 	lnum = c->ltail_lnum = c->lhead_lnum;
+	end = 0;

 	do {
 		err = replay_log_leb(c, lnum, 0, c->sbuf);
-		if (err == 1)
+
+		/*
+		 * If @end is set, residual log lebs should be empty or
+		 * contain older ref_nodes. replay_log_leb() must return %1.
+		 */
+		if (unlikely(!err && end)) {
+			ubifs_err("LEB %d is valid but considered to be empty",
+				  lnum);
+			err = -EINVAL;
+			goto out;
+		}
+
+		if (err == 1 && !end) {
 			/* We hit the end of the log */
-			break;
-		if (err)
+			end = 1;
+		}
+
+		if (err < 0)
 			goto out;
 		lnum = ubifs_next_log_lnum(c, lnum);
 	} while (lnum != c->ltail_lnum);
-- 
1.6.0.2






More information about the linux-mtd mailing list