Re: [PATCH -next] ext4: fix super block checksum incorrect after mount

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2022/5/25 15:51, Ritesh Harjani wrote:
On 22/05/25 09:29AM, Ye Bin wrote:
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.
I agree with the analysis. However after [1], I think all updates to superblock
(including checksum computation) should be done within buffer lock.
(lock_buffer(), unlock_buffer()).

[1]: https://lore.kernel.org/all/20201216101844.22917-4-jack@xxxxxxx/

With lock changes added, feel free to add -

Reviewed-by: Ritesh Harjani <ritesh.list@xxxxxxxxx>
Thanks for your reply.
I think there should be no concurrent  modification at this time.
So there's no need to hold buffer lock.
Am I missing something?


Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx>
---
  fs/ext4/super.c | 16 ++++++++--------
  1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index f9a3ad683b4a..c47204029429 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -5300,14 +5300,6 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
  		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);
@@ -5365,6 +5357,14 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
  	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);
--
2.31.1

.





[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux