UBIFS: handle allocation failures in UBIFS write path
Running kernel 2.6.37, my PPC-based device occasionally gets an
order-2 allocation failure in UBIFS, which causes the root FS to
become unwritable:
kswapd0: page allocation failure. order:2, mode:0x4050
Call Trace:
[
c787dc30] [
c00085b8] show_stack+0x7c/0x194 (unreliable)
[
c787dc70] [
c0061aec] __alloc_pages_nodemask+0x4f0/0x57c
[
c787dd00] [
c0061b98] __get_free_pages+0x20/0x50
[
c787dd10] [
c00e4f88] ubifs_jnl_write_data+0x54/0x200
[
c787dd50] [
c00e82d4] do_writepage+0x94/0x198
[
c787dd90] [
c00675e4] shrink_page_list+0x40c/0x77c
[
c787de40] [
c0067de0] shrink_inactive_list+0x1e0/0x370
[
c787de90] [
c0068224] shrink_zone+0x2b4/0x2b8
[
c787df00] [
c0068854] kswapd+0x408/0x5d4
[
c787dfb0] [
c0037bcc] kthread+0x80/0x84
[
c787dff0] [
c000ef44] kernel_thread+0x4c/0x68
Similar problems were encountered last April by Tomasz Stanislawski:
http://patchwork.ozlabs.org/patch/50965/
This patch implements Artem's suggested fix: fall back to a
mutex-protected static buffer, allocated at mount time. I tested it
by forcing execution down the failure path, and didn't see any ill
effects.
Artem: massaged the patch a little, improved it so that we'd not
allocate the write reserve buffer when we are in R/O mode.
Signed-off-by: Matthew L. Creech <mlcreech@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>