@@ -168,7 +168,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
sector_t last_block;
sector_t last_block_in_file;
sector_t blocks[MAX_BUF_PER_PAGE];
- unsigned page_block;
+ unsigned num_blocks, page_block;
unsigned first_hole = blocks_per_folio;
struct block_device *bdev = NULL;
int length;
@@ -189,8 +189,12 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
if (folio_buffers(folio))
goto confused;
- block_in_file = (sector_t)folio->index << (PAGE_SHIFT - blkbits);
- last_block = block_in_file + args->nr_pages * blocks_per_folio;
+ block_in_file = block_index_to_sector(folio->index, blkbits);
+ if (blkbits > PAGE_SHIFT)
+ num_blocks = args->nr_pages >> (blkbits - PAGE_SHIFT);
+ else
+ num_blocks = args->nr_pages * blocks_per_folio;
+ last_block = block_in_file + num_blocks;
last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits;
if (last_block > last_block_in_file)
last_block = last_block_in_file;
@@ -277,7 +281,7 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
}
if (first_hole != blocks_per_folio) {
- folio_zero_segment(folio, first_hole << blkbits, PAGE_SIZE);
+ folio_zero_segment(folio, first_hole << blkbits, folio_size(folio));
if (first_hole == 0) {
folio_mark_uptodate(folio);
folio_unlock(folio);
@@ -543,7 +547,7 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc,
* The page has no buffers: map it to disk
*/
BUG_ON(!folio_test_uptodate(folio));
- block_in_file = (sector_t)folio->index << (PAGE_SHIFT - blkbits);
+ block_in_file = block_index_to_sector(folio->index, blkbits);
/*
* Whole page beyond EOF? Skip allocating blocks to avoid leaking
* space.
Use accessor functions to translate between page index and block sectors and ensure the resulting buffer size is calculated correctly. Signed-off-by: Hannes Reinecke <hare@suse.de> --- fs/mpage.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)