Commit b7e9ec3
ext4: fix BUG in ext4_mb_new_inode_pa() due to overflow
[ Upstream commit bc056e7 ]
When we calculate the end position of ext4_free_extent, this position may
be exactly where ext4_lblk_t (i.e. uint) overflows. For example, if
ac_g_ex.fe_logical is 4294965248 and ac_orig_goal_len is 2048, then the
computed end is 0x100000000, which is 0. If ac->ac_o_ex.fe_logical is not
the first case of adjusting the best extent, that is, new_bex_end > 0, the
following BUG_ON will be triggered:
=========================================================
kernel BUG at fs/ext4/mballoc.c:5116!
invalid opcode: 0000 [#1] PREEMPT SMP PTI
CPU: 3 PID: 673 Comm: xfs_io Tainted: G E 6.5.0-rc1+ torvalds#279
RIP: 0010:ext4_mb_new_inode_pa+0xc5/0x430
Call Trace:
<TASK>
ext4_mb_use_best_found+0x203/0x2f0
ext4_mb_try_best_found+0x163/0x240
ext4_mb_regular_allocator+0x158/0x1550
ext4_mb_new_blocks+0x86a/0xe10
ext4_ext_map_blocks+0xb0c/0x13a0
ext4_map_blocks+0x2cd/0x8f0
ext4_iomap_begin+0x27b/0x400
iomap_iter+0x222/0x3d0
__iomap_dio_rw+0x243/0xcb0
iomap_dio_rw+0x16/0x80
=========================================================
A simple reproducer demonstrating the problem:
mkfs.ext4 -F /dev/sda -b 4096 100M
mount /dev/sda /tmp/test
fallocate -l1M /tmp/test/tmp
fallocate -l10M /tmp/test/file
fallocate -i -o 1M -l16777203M /tmp/test/file
fsstress -d /tmp/test -l 0 -n 100000 -p 8 &
sleep 10 && killall -9 fsstress
rm -f /tmp/test/tmp
xfs_io -c "open -ad /tmp/test/file" -c "pwrite -S 0xff 0 8192"
We simply refactor the logic for adjusting the best extent by adding
a temporary ext4_free_extent ex and use extent_logical_end() to avoid
overflow, which also simplifies the code.
Cc: stable@kernel.org # 6.4
Fixes: 93cdf49 ("ext4: Fix best extent lstart adjustment logic in ext4_mb_new_inode_pa()")
Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Link: https://lore.kernel.org/r/20230724121059.11834-3-libaokun1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Sasha Levin <sashal@kernel.org>1 parent bd57b05 commit b7e9ec3
1 file changed
+14
-17
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5177 | 5177 | | |
5178 | 5178 | | |
5179 | 5179 | | |
5180 | | - | |
5181 | | - | |
| 5180 | + | |
| 5181 | + | |
| 5182 | + | |
| 5183 | + | |
| 5184 | + | |
5182 | 5185 | | |
5183 | 5186 | | |
5184 | 5187 | | |
| |||
5197 | 5200 | | |
5198 | 5201 | | |
5199 | 5202 | | |
5200 | | - | |
5201 | | - | |
5202 | | - | |
5203 | | - | |
5204 | | - | |
| 5203 | + | |
5205 | 5204 | | |
5206 | | - | |
5207 | | - | |
5208 | | - | |
5209 | | - | |
| 5205 | + | |
| 5206 | + | |
5210 | 5207 | | |
5211 | 5208 | | |
5212 | | - | |
5213 | | - | |
5214 | | - | |
| 5209 | + | |
| 5210 | + | |
| 5211 | + | |
5215 | 5212 | | |
| 5213 | + | |
5216 | 5214 | | |
5217 | | - | |
| 5215 | + | |
5218 | 5216 | | |
5219 | 5217 | | |
5220 | 5218 | | |
5221 | | - | |
5222 | | - | |
| 5219 | + | |
5223 | 5220 | | |
5224 | 5221 | | |
5225 | 5222 | | |
| |||
0 commit comments