ext4: fix super block checksum incorrect after mount
commit 9b6641dd95
upstream.
We got issue as follows:
[home]# mount /dev/sda test
EXT4-fs (sda): warning: mounting fs with errors, running e2fsck is recommended
[home]# dmesg
EXT4-fs (sda): warning: mounting fs with errors, running e2fsck is recommended
EXT4-fs (sda): Errors on filesystem, clearing orphan list.
EXT4-fs (sda): recovery complete
EXT4-fs (sda): mounted filesystem with ordered data mode. Quota mode: none.
[home]# debugfs /dev/sda
debugfs 1.46.5 (30-Dec-2021)
Checksum errors in superblock! Retrying...
Reason is ext4_orphan_cleanup will reset ‘s_last_orphan’ but not update
super block checksum.
To solve above issue, defer update super block checksum after
ext4_orphan_cleanup.
Signed-off-by: Ye Bin <yebin10@huawei.com>
Cc: stable@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Ritesh Harjani <ritesh.list@gmail.com>
Link: https://lore.kernel.org/r/20220525012904.1604737-1-yebin10@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
75f3a5fa2a
Коммит
38db3b696f
|
@ -4909,14 +4909,6 @@ no_journal:
|
|||
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);
|
||||
|
@ -4974,6 +4966,14 @@ no_journal:
|
|||
EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
|
||||
ext4_orphan_cleanup(sb, es);
|
||||
EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
|
||||
/*
|
||||
* Update the checksum after updating free space/inode counters and
|
||||
* ext4_orphan_cleanup. 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 (needs_recovery) {
|
||||
ext4_msg(sb, KERN_INFO, "recovery complete");
|
||||
err = ext4_mark_recovery_complete(sb, es);
|
||||
|
|
Загрузка…
Ссылка в новой задаче