mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 06:33:07 +00:00
ext4: avoid resizing to a partial cluster size
[ Upstream commit 69cb8e9d8c
]
This patch avoids an attempt to resize the filesystem to an
unaligned cluster boundary. An online resize to a size that is not
integral to cluster size results in the last iteration attempting to
grow the fs by a negative amount, which trips a BUG_ON and leaves the fs
with a corrupted in-memory superblock.
Signed-off-by: Oleg Kiselev <okiselev@amazon.com>
Link: https://lore.kernel.org/r/0E92A0AB-4F16-4F1A-94B7-702CC6504FDE@amazon.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
b02787042c
commit
952b3dc02b
1 changed files with 10 additions and 0 deletions
|
@ -1951,6 +1951,16 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
|
|||
}
|
||||
brelse(bh);
|
||||
|
||||
/*
|
||||
* For bigalloc, trim the requested size to the nearest cluster
|
||||
* boundary to avoid creating an unusable filesystem. We do this
|
||||
* silently, instead of returning an error, to avoid breaking
|
||||
* callers that blindly resize the filesystem to the full size of
|
||||
* the underlying block device.
|
||||
*/
|
||||
if (ext4_has_feature_bigalloc(sb))
|
||||
n_blocks_count &= ~((1 << EXT4_CLUSTER_BITS(sb)) - 1);
|
||||
|
||||
retry:
|
||||
o_blocks_count = ext4_blocks_count(es);
|
||||
|
||||
|
|
Loading…
Reference in a new issue