mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-14 17:14:09 +00:00
UBIFS: make space fixup work in the remount case
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> Cc: stable@vger.kernel.org # 3.0+
This commit is contained in:
parent
f6161aa153
commit
67e753ca41
@ -1568,6 +1568,12 @@ static int ubifs_remount_rw(struct ubifs_info *c)
|
|||||||
c->remounting_rw = 1;
|
c->remounting_rw = 1;
|
||||||
c->ro_mount = 0;
|
c->ro_mount = 0;
|
||||||
|
|
||||||
|
if (c->space_fixup) {
|
||||||
|
err = ubifs_fixup_free_space(c);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
err = check_free_space(c);
|
err = check_free_space(c);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
@ -1684,12 +1690,6 @@ static int ubifs_remount_rw(struct ubifs_info *c)
|
|||||||
err = dbg_check_space_info(c);
|
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);
|
mutex_unlock(&c->umount_mutex);
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user