mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-19 23:02:31 +00:00
fs: don't allocate blocks beyond EOF from __mpage_writepage
When __mpage_writepage() is called for a page beyond EOF, it will go and allocate all blocks underlying the page. This is not only unnecessary but this way blocks can get leaked (e.g. if a page beyond EOF is marked dirty but in the end write fails and i_size is not extended). Link: https://lkml.kernel.org/r/20230103104430.27749-1-jack@suse.cz Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Christoph Hellwig <hch@lst.de> Cc: Matthew Wilcox <willy@infradead.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
6c364edc19
commit
4b89a37d54
@ -524,6 +524,12 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
||||
*/
|
||||
BUG_ON(!PageUptodate(page));
|
||||
block_in_file = (sector_t)page->index << (PAGE_SHIFT - blkbits);
|
||||
/*
|
||||
* Whole page beyond EOF? Skip allocating blocks to avoid leaking
|
||||
* space.
|
||||
*/
|
||||
if (block_in_file >= (i_size + (1 << blkbits) - 1) >> blkbits)
|
||||
goto page_is_mapped;
|
||||
last_block = (i_size - 1) >> blkbits;
|
||||
map_bh.b_page = page;
|
||||
for (page_block = 0; page_block < blocks_per_page; ) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user