Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: fix e2fsprogs checksum failure for mounted filesystem

Commit 81414b4dd48 ("ext4: remove redundant sb checksum
recomputation") removed checksum recalculation after updating
superblock free space / inode counters in ext4_fill_super() based on
the fact that we will recalculate the checksum on superblock
writeout.

That is correct assumption but until the writeout happens (which can
take a long time) the checksum is incorrect in the buffer cache and if
programs such as tune2fs or resize2fs is called shortly after a file
system is mounted can fail. So return back the checksum recalculation
and add a comment explaining why.

Fixes: 81414b4dd48f ("ext4: remove redundant sb checksum recomputation")
Cc: stable@kernel.org
Reported-by: Boyang Xue <bxue@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20210812124737.21981-1-jack@suse.cz

authored by

Jan Kara and committed by
Theodore Ts'o
b2bbb92f 308c57cc

+8
+8
fs/ext4/super.c
··· 5032 5032 err = percpu_counter_init(&sbi->s_freeinodes_counter, freei, 5033 5033 GFP_KERNEL); 5034 5034 } 5035 + /* 5036 + * Update the checksum after updating free space/inode 5037 + * counters. Otherwise the superblock can have an incorrect 5038 + * checksum in the buffer cache until it is written out and 5039 + * e2fsprogs programs trying to open a file system immediately 5040 + * after it is mounted can fail. 5041 + */ 5042 + ext4_superblock_csum_set(sb); 5035 5043 if (!err) 5036 5044 err = percpu_counter_init(&sbi->s_dirs_counter, 5037 5045 ext4_count_dirs(sb), GFP_KERNEL);