| From 85d825dbf4899a69407338bae462a59aa9a37326 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Thu, 14 Apr 2022 21:57:49 -0400 |
| Subject: ext4: force overhead calculation if the s_overhead_cluster makes no sense |
| |
| From: Theodore Ts'o <tytso@mit.edu> |
| |
| commit 85d825dbf4899a69407338bae462a59aa9a37326 upstream. |
| |
| If the file system does not use bigalloc, calculating the overhead is |
| cheap, so force the recalculation of the overhead so we don't have to |
| trust the precalculated overhead in the superblock. |
| |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Cc: stable@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ext4/super.c | 15 ++++++++++++--- |
| 1 file changed, 12 insertions(+), 3 deletions(-) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -4514,9 +4514,18 @@ no_journal: |
| * Get the # of file system overhead blocks from the |
| * superblock if present. |
| */ |
| - if (es->s_overhead_clusters) |
| - sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); |
| - else { |
| + sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); |
| + /* ignore the precalculated value if it is ridiculous */ |
| + if (sbi->s_overhead > ext4_blocks_count(es)) |
| + sbi->s_overhead = 0; |
| + /* |
| + * If the bigalloc feature is not enabled recalculating the |
| + * overhead doesn't take long, so we might as well just redo |
| + * it to make sure we are using the correct value. |
| + */ |
| + if (!ext4_has_feature_bigalloc(sb)) |
| + sbi->s_overhead = 0; |
| + if (sbi->s_overhead == 0) { |
| err = ext4_calculate_overhead(sb); |
| if (err) |
| goto failed_mount_wq; |