summaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-10-11 08:26:52 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2016-10-11 08:44:12 +0200
commit57cebc46f727055b8e7513e37cc88bc033852cb7 (patch)
treeabb650fda81b37a2c99aa337310d55fae0e7a13e /arch/x86
parentd8c2022d5d05289694a0f322f7f90ba6ccafabe2 (diff)
downloadbarebox-57cebc46f727055b8e7513e37cc88bc033852cb7.tar.gz
barebox-57cebc46f727055b8e7513e37cc88bc033852cb7.tar.xz
mtd: ubi: Fix scrubbing during attach
ensure_wear_leveling() is called at the end of ubi_wl_init() and may come to the decision to scrub some blocks. In the Kernel this is done in a separate thread, but in barebox we do this synchronously. The problem is that during ubi_wl_init() the EBA system is not yet initialized (ubi_eba_init() is not yet called), so the wear level worker hits a NULL pointer deref when the fastmap needs to be updated and ubi_write_fastmap() accesses vol->eba_tbl. Solve this by honoring the ubi->thread_enabled flag which is only set to true when UBI is sufficiently initialized. This means we now can have multiple works queued, so we can no longer simply do one work when queued, but instead have to continue to do work until all work is done. The best place to do so is a ubi_thread() function which behaves similar to the Kernel function with the same name, but is called synchronously in barebox. To make sure that the initially queued works are done, the call to (no-op) wake_up_process() at the end of ubi_attach_mtd_dev() is replaced with a call to ubi_thread(). While at it also honor the ubi->ro_mode flag to make sure we do not do any wear leveling work on readonly UBI devices. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/x86')
0 files changed, 0 insertions, 0 deletions