linux/fs/ubifs
Artem Bityutskiy cd050f5648 UBIFS: fix a bug in empty space fix-up
commit c6727932cf upstream.

UBIFS has a feature called "empty space fix-up" which is a quirk to work-around
limitations of dumb flasher programs. Namely, of those flashers that are unable
to skip NAND pages full of 0xFFs while flashing, resulting in empty space at
the end of half-filled eraseblocks to be unusable for UBIFS. This feature is
relatively new (introduced in v3.0).

The fix-up routine (fixup_free_space()) is executed only once at the very first
mount if the superblock has the 'space_fixup' flag set (can be done with -F
option of mkfs.ubifs). It basically reads all the UBIFS data and metadata and
writes it back to the same LEB. The routine assumes the image is pristine and
does not have anything in the journal.

There was a bug in 'fixup_free_space()' where it fixed up the log incorrectly.
All but one LEB of the log of a pristine file-system are empty. And one
contains just a commit start node. And 'fixup_free_space()' just unmapped this
LEB, which resulted in wiping the commit start node. As a result, some users
were unable to mount the file-system next time with the following symptom:

UBIFS error (pid 1): replay_log_leb: first log node at LEB 3:0 is not CS node
UBIFS error (pid 1): replay_log_leb: log error detected while replaying the log at LEB 3:0

The root-cause of this bug was that 'fixup_free_space()' wrongly assumed
that the beginning of empty space in the log head (c->lhead_offs) was known
on mount. However, it is not the case - it was always 0. UBIFS does not store
in it the master node and finds out by scanning the log on every mount.

The fix is simple - just pass commit start node size instead of 0 to
'fixup_leb()'.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Reported-by: Iwo Mergler <Iwo.Mergler@netcommwireless.com>
Tested-by: Iwo Mergler <Iwo.Mergler@netcommwireless.com>
Reported-by: James Nute <newten82@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-08-01 12:26:54 -07:00
..
budget.c UBIFS: introduce a separate structure for budgeting info 2011-05-13 19:23:53 +03:00
commit.c UBIFS: introduce a separate structure for budgeting info 2011-05-13 19:23:53 +03:00
compress.c UBIFS: fix sparse warnings 2008-12-31 14:13:24 +02:00
debug.c UBIFS: switch to dynamic printks 2011-05-23 08:22:20 +03:00
debug.h UBIFS: make debugging messages light again 2012-01-25 17:25:06 -08:00
dir.c ubifs: remove unnecessary dentry_unhash from rmdir, dir rename 2011-05-28 01:02:51 -04:00
file.c UBIFS: remove strange commentary 2011-05-13 19:23:55 +03:00
find.c UBIFS: introduce a separate structure for budgeting info 2011-05-13 19:23:53 +03:00
gc.c UBIFS: synchronize write-buffer before switching to the next bud 2011-05-16 10:31:41 +03:00
io.c UBIFS: assert no fixup when writing a node 2011-06-03 18:12:31 +03:00
ioctl.c userns: rename is_owner_or_cap to inode_owner_or_capable 2011-03-23 19:47:13 -07:00
journal.c UBIFS: fix memory leak on error path 2011-06-03 18:12:31 +03:00
Kconfig UBIFS: do not select KALLSYMS_ALL 2011-04-05 10:45:45 +03:00
key.h UBIFS: mark unused key objects as invalid 2010-08-30 10:19:08 +03:00
log.c UBIFS: share the next_log_lnum helper 2011-05-16 14:12:12 +03:00
lprops.c UBIFS: dump more in the lprops debugging check 2011-05-16 10:31:39 +03:00
lpt_commit.c UBIFS: introduce lsave debugging 2011-05-13 19:23:54 +03:00
lpt.c UBIFS: fix oops on error path in read_pnode 2011-04-05 10:40:31 +03:00
Makefile
master.c UBIFS: introduce a separate structure for budgeting info 2011-05-13 19:23:53 +03:00
misc.h UBIFS: share the next_log_lnum helper 2011-05-16 14:12:12 +03:00
orphan.c UBIFS: amend ubifs_recover_leb interface 2011-06-01 12:29:06 +03:00
recovery.c UBIFS: fix recovery broken by the previous recovery fix 2011-06-01 12:29:06 +03:00
replay.c UBIFS: amend ubifs_recover_leb interface 2011-06-01 12:29:06 +03:00
sb.c UBIFS: fix a bug in empty space fix-up 2012-08-01 12:26:54 -07:00
scan.c UBIFS: remove double semicolon 2011-02-06 15:08:02 +02:00
shrinker.c UBIFS: fix shrinker object count reports 2011-06-03 18:12:24 +03:00
super.c ubifs: dereferencing an ERR_PTR in ubifs_mount() 2011-06-20 10:42:34 -04:00
tnc_commit.c UBIFS: make force in-the-gaps to be a general self-check 2011-05-13 19:23:54 +03:00
tnc_misc.c UBIFS: correct key comparison 2008-09-30 11:12:57 +03:00
tnc.c UBIFS: fix clean znode counter corruption in error cases 2011-06-03 18:12:31 +03:00
ubifs-media.h UBIFS: add a superblock flag for free space fix-up 2011-05-16 14:12:14 +03:00
ubifs.h UBIFS: amend ubifs_recover_leb interface 2011-06-01 12:29:06 +03:00
xattr.c UBIFS: make xattr operations names consistent 2011-05-13 19:23:54 +03:00