@@ -118,11 +118,14 @@ int jffs2_scan_medium(struct jffs2_sb_info *c)
buf_size = PAGE_SIZE;
/* Respect kmalloc limitations */
- if (buf_size > 128*1024)
- buf_size = 128*1024;
+ buf_size = min_t(uint32_t, buf_size, 128*1024);
+
+ do {
+ D1(printk(KERN_DEBUG "Trying to allocate readbuf of %d "
+ "bytes\n", buf_size));
+ flashbuf = kmalloc(buf_size, GFP_KERNEL);
+ } while (!flashbuf && ((buf_size >>= 1) >= PAGE_SIZE));
- D1(printk(KERN_DEBUG "Allocating readbuf of %d bytes\n", buf_size));
- flashbuf = kmalloc(buf_size, GFP_KERNEL);
if (!flashbuf)
return -ENOMEM;
}
When handling a JFFS2 medium scan request exponentially back off on the size of the requested scan buffer until it succeeds or until the requested scan buffer size falls below a page. This helps ensure the allocation and subsequent scan operation can succeed under low-memory, highly-fragmented situations albeit somewhat more slowly. Signed-off-by: Grant Erickson <marathon96@gmail.com> --- fs/jffs2/scan.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-)