From: Dave Chinner <dchinner@xxxxxxxxxx> We need the zero block tracking structure allocation to succeed. Silently failing and potentially allowing data corruption is not an option. Add a mempool to ensure this allocation will always succeed. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- fs/direct-io.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 368abec..dfc5d9a 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -161,12 +161,22 @@ struct dio_zero_block_head { static struct dio_zero_block_head dio_zero_blocks[DIO_ZERO_BLOCK_NR]; #define to_dio_zero_head(zb) (&dio_zero_blocks[zb % DIO_ZERO_BLOCK_NR]) +/* a small mempool just to guarantee progress. */ +#define DIO_ZERO_BLOCK_ENTRIES 2 +static mempool_t *dio_zero_block_pool; + static int __init dio_init_zero_block(void) { int i; + dio_zero_block_pool = mempool_create_kmalloc_pool( + DIO_ZERO_BLOCK_ENTRIES, + sizeof(struct dio_zero_block)); + if (!dio_zero_block_pool) + panic("dio: can't create zero block pool"); + for (i = 0; i < DIO_ZERO_BLOCK_NR; i++) { spin_lock_init(&dio_zero_blocks[i].lock); INIT_LIST_HEAD(&dio_zero_blocks[i].list); @@ -184,9 +194,7 @@ dio_start_zero_block(struct dio *dio, sector_t zero_block) struct dio_zero_block_head *zbh = to_dio_zero_head(zero_block); struct dio_zero_block *zb; - zb = kmalloc(sizeof(*zb), GFP_NOIO); - if (!zb) - return; + zb = mempool_alloc(dio_zero_block_pool, GFP_NOIO); INIT_LIST_HEAD(&zb->dio_list); init_waitqueue_head(&zb->wq); zb->zero_block = zero_block; -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html