linux-uconsole/drivers/mtd/ubi
Sebastian Siewior 38be91ce7e ubi/upd: Always flush after prepared for an update
commit 9cd9a21ce0 upstream.

In commit 6afaf8a484 ("UBI: flush wl before clearing update marker") I
managed to trigger and fix a similar bug. Now here is another version of
which I assumed it wouldn't matter back then but it turns out UBI has a
check for it and will error out like this:

|ubi0 warning: validate_vid_hdr: inconsistent used_ebs
|ubi0 error: validate_vid_hdr: inconsistent VID header at PEB 592

All you need to trigger this is? "ubiupdatevol /dev/ubi0_0 file" + a
powercut in the middle of the operation.
ubi_start_update() sets the update-marker and puts all EBs on the erase
list. After that userland can proceed to write new data while the old EB
aren't erased completely. A powercut at this point is usually not that
much of a tragedy. UBI won't give read access to the static volume
because it has the update marker. It will most likely set the corrupted
flag because it misses some EBs.
So we are all good. Unless the size of the image that has been written
differs from the old image in the magnitude of at least one EB. In that
case UBI will find two different values for `used_ebs' and refuse to
attach the image with the error message mentioned above.

So in order not to get in the situation, the patch will ensure that we
wait until everything is removed before it tries to write any data.
The alternative would be to detect such a case and remove all EBs at the
attached time after we processed the volume-table and see the
update-marker set. The patch looks bigger and I doubt it is worth it
since usually the write() will wait from time to time for a new EB since
usually there not that many spare EB that can be used.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-04-27 09:09:33 +02:00
..
attach.c UBI: drop null test before destroy functions 2015-10-03 20:36:10 +02:00
block.c Minor merge needed, due to function move. 2015-07-01 10:49:25 -07:00
build.c ubi: Fix race condition between ubi device creation and udev 2016-08-20 18:09:26 +02:00
cdev.c UBI: Remove in vain semicolon 2015-11-06 23:26:51 +01:00
debug.c UBI: fix return error code 2015-12-16 22:45:04 +01:00
debug.h UBI: power cut emulation for testing 2015-04-13 21:05:17 +02:00
eba.c ubi: Make recover_peb power cut aware 2016-07-27 09:47:33 -07:00
fastmap-wl.c ubi: fastmap: Implement produce_free_peb() 2015-10-03 23:25:30 +02:00
fastmap.c ubi: fastmap: Fix add_vol() return value test in ubi_attach_fastmap() 2016-11-10 16:36:37 +01:00
gluebi.c UBI: Update comments to reflect UBI_METAONLY flag 2015-10-03 20:11:59 +02:00
io.c UBI: fix use of "VID" vs. "EC" in header self-check 2015-12-16 22:46:26 +01:00
kapi.c VFS: assorted d_backing_inode() annotations 2015-04-15 15:06:59 -04:00
Kconfig UBI: block: Add CONFIG_BLOCK dependency 2014-03-04 14:49:53 +02:00
Makefile UBI: R/O block driver on top of UBI volumes 2014-02-28 16:29:48 +02:00
misc.c UBI: fix soft lockup in ubi_check_volume() 2015-01-28 16:18:09 +01:00
ubi-media.h UBI: Fix typo in comment 2015-10-03 20:09:41 +02:00
ubi.h UBI: Fix static volume checks when Fastmap is used 2016-06-01 12:15:54 -07:00
upd.c ubi/upd: Always flush after prepared for an update 2017-04-27 09:09:33 +02:00
vmt.c ubi: Make volume resize power cut aware 2016-08-20 18:09:25 +02:00
vtbl.c UBI: return ENOSPC if no enough space available 2015-09-29 12:47:05 +02:00
wl.c ubi: Deal with interrupted erasures in WL 2016-10-28 03:01:28 -04:00
wl.h UBI: Fastmap: Remove is_fm_block() 2015-03-26 22:47:38 +01:00