ext4: avoid resizing to a partial cluster size
[ Upstream commit 69cb8e9d8cd97cdf5e293b26d70a9dee3e35e6bd ] 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
5bebfd6077
commit
a6805b3dcf
@ -1979,6 +1979,16 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
|
|||||||
}
|
}
|
||||||
brelse(bh);
|
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:
|
retry:
|
||||||
o_blocks_count = ext4_blocks_count(es);
|
o_blocks_count = ext4_blocks_count(es);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user