diff --git a/fs/mpage.c b/fs/mpage.c index 334e7d09aa65..ed00b3759ecc 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -186,9 +186,16 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) if (page_has_buffers(page)) goto confused; + if ((PAGE_SHIFT - blkbits) < 0) + goto confused; + + if ((PAGE_SHIFT - blkbits) > sizeof(page->index)) + goto confused; + block_in_file = (sector_t)page->index << (PAGE_SHIFT - blkbits); last_block = block_in_file + args->nr_pages * blocks_per_page; last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits; + if (last_block > last_block_in_file) last_block = last_block_in_file; page_block = 0;