diff --git a/fs/ext4/super.c b/fs/ext4/super.c index b89f431ec78d39726317da58395b8a15d49efaf0..59637e70f9e32a0d09446374523140e9f6addda9 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4693,6 +4693,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) err = percpu_counter_init(&sbi->s_freeinodes_counter, freei, GFP_KERNEL); } + /* + * Update the checksum after updating free space/inode + * counters. Otherwise the superblock can have an incorrect + * checksum in the buffer cache until it is written out and + * e2fsprogs programs trying to open a file system immediately + * after it is mounted can fail. + */ + ext4_superblock_csum_set(sb); if (!err) err = percpu_counter_init(&sbi->s_dirs_counter, ext4_count_dirs(sb), GFP_KERNEL);