iomap: add a workaround for racy i_size updates on block devices
authorChristoph Hellwig <hch@lst.de>
Mon, 25 Sep 2023 15:54:45 +0000 (08:54 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 25 Sep 2023 15:55:00 +0000 (08:55 -0700)
commit381c043233e66b1c160ef235675e65cf6c580e92
treeec44e4f53fd024c3dfa14343eca8de8b488eb5a3
parenta5f31a5028d1e88e97c3b6cdc3e3bf2da085e232
iomap: add a workaround for racy i_size updates on block devices

A szybot reproducer that does write I/O while truncating the size of a
block device can end up in clean_bdev_aliases, which tries to clean the
bdev aliases that it uses.  This is because iomap_to_bh automatically
sets the BH_New flag when outside of i_size.  For block devices updates
to i_size are racy and we can hit this case in a tiny race window,
leading to the eventual clean_bdev_aliases call.  Fix this by erroring
out of > i_size I/O on block devices.

Reported-by: syzbot+1fa947e7f09e136925b8@syzkaller.appspotmail.com
Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: syzbot+1fa947e7f09e136925b8@syzkaller.appspotmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/buffer.c