| From 67e753ca41782913d805ff4a8a2b0f60b26b7915 Mon Sep 17 00:00:00 2001 |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Date: Thu, 14 Mar 2013 10:49:23 +0200 |
| Subject: UBIFS: make space fixup work in the remount case |
| |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| |
| commit 67e753ca41782913d805ff4a8a2b0f60b26b7915 upstream. |
| |
| The UBIFS space fixup is a useful feature which allows to fixup the "broken" |
| flash space at the time of the first mount. The "broken" space is usually the |
| result of using a "dumb" industrial flasher which is not able to skip empty |
| NAND pages and just writes all 0xFFs to the empty space, which has grave |
| side-effects for UBIFS when UBIFS trise to write useful data to those empty |
| pages. |
| |
| The fix-up feature works roughly like this: |
| 1. mkfs.ubifs sets the fixup flag in UBIFS superblock when creating the image |
| (see -F option) |
| 2. when the file-system is mounted for the first time, UBIFS notices the fixup |
| flag and re-writes the entire media atomically, which may take really a lot |
| of time. |
| 3. UBIFS clears the fixup flag in the superblock. |
| |
| This works fine when the file system is mounted R/W for the very first time. |
| But it did not really work in the case when we first mount the file-system R/O, |
| and then re-mount R/W. The reason was that we started the fixup procedure too |
| late, which we cannot really do because we have to fixup the space before it |
| starts being used. |
| |
| Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Reported-by: Mark Jackson <mpfj-list@mimc.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ubifs/super.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/fs/ubifs/super.c |
| +++ b/fs/ubifs/super.c |
| @@ -1583,6 +1583,12 @@ static int ubifs_remount_rw(struct ubifs |
| c->remounting_rw = 1; |
| c->ro_mount = 0; |
| |
| + if (c->space_fixup) { |
| + err = ubifs_fixup_free_space(c); |
| + if (err) |
| + return err; |
| + } |
| + |
| err = check_free_space(c); |
| if (err) |
| goto out; |
| @@ -1699,12 +1705,6 @@ static int ubifs_remount_rw(struct ubifs |
| err = dbg_check_space_info(c); |
| } |
| |
| - if (c->space_fixup) { |
| - err = ubifs_fixup_free_space(c); |
| - if (err) |
| - goto out; |
| - } |
| - |
| mutex_unlock(&c->umount_mutex); |
| return err; |
| |