fs: gracefully handle ->get_block not mapping bh in __mpage_writepage
authorJan Kara <jack@suse.cz>
Wed, 25 Jan 2023 13:59:14 +0000 (14:59 +0100)
committerJan Kara <jack@suse.cz>
Thu, 26 Jan 2023 15:46:35 +0000 (16:46 +0100)
commit7010839ccfd4f875c23c1758f6321ee6312cc548
tree171afbec4871e09f39df020db6b81a4e889d6ab6
parent3c21204818ae45504b5d8ce8902748ef2306f0f3
fs: gracefully handle ->get_block not mapping bh in __mpage_writepage

When filesystem's ->get_block function does not map the buffer head when
called from __mpage_writepage(), the function will happily go and pass
bogus bdev and block number to bio allocation routines which leads to
crashes sooner or later. E.g. UDF can do this because it doesn't want to
allocate blocks from ->writepages callbacks. It allocates blocks on
write or page fault but writeback can still spot dirty buffers without
underlying blocks allocated e.g. if blocksize < pagesize, the tail page
is dirtied (which means all its buffers are dirtied), and truncate
extends the file so that some buffer starts to be within i_size.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/mpage.c