bdev: fix weird crash
Fix this by constricting max folio order?
BUG: sleeping function called from invalid context at mm/util.c:743
in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 35, name: kcompactd0
preempt_count: 1, expected: 0
RCU nest depth: 0, expected: 0
Preemption disabled at:
[<fffffe0080339c98>] __buffer_migrate_folio+0xb8/0x2d0
CPU: 0 UID: 0 PID: 35 Comm: kcompactd0 Not tainted 6.15.0-rc1-acha #rc1 PREEMPT
Hardware name: QEMU KVM Virtual Machine, BIOS 1.6.6 08/22/2023
Call trace:
show_stack+0x20/0x38 (C)
dump_stack_lvl+0x78/0x90
dump_stack+0x18/0x28
__might_resched+0x164/0x1d0
folio_mc_copy+0x5c/0xa0
__migrate_folio.constprop.0+0x70/0x1c8
__buffer_migrate_folio+0x2bc/0x2d0
buffer_migrate_folio_norefs+0x1c/0x30
move_to_new_folio+0x70/0x1f0
migrate_pages_batch+0x9c4/0xf20
migrate_pages+0xb74/0xde8
compact_zone+0x9ac/0xff0
compact_node+0x9c/0x1a0
kcompactd+0x38c/0x400
kthread+0x144/0x210
ret_from_fork+0x10/0x20
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
diff --git a/block/bdev.c b/block/bdev.c
index 889ec6e..803c0f16 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -148,8 +148,8 @@ static void set_init_blocksize(struct block_device *bdev)
bsize <<= 1;
}
BD_INODE(bdev)->i_blkbits = blksize_bits(bsize);
- mapping_set_folio_min_order(BD_INODE(bdev)->i_mapping,
- get_order(bsize));
+ mapping_set_folio_order_range(BD_INODE(bdev)->i_mapping,
+ get_order(bsize), get_order(bsize));
}
/**
@@ -207,7 +207,8 @@ int set_blocksize(struct file *file, int size)
kill_bdev(bdev);
inode->i_blkbits = blksize_bits(size);
- mapping_set_folio_min_order(inode->i_mapping, get_order(size));
+ mapping_set_folio_order_range(inode->i_mapping,
+ get_order(size), get_order(size));
kill_bdev(bdev);
filemap_invalidate_unlock(inode->i_mapping);
inode_unlock(inode);