46 lines
1.9 KiB
Diff
46 lines
1.9 KiB
Diff
From: Theodore Ts'o <tytso@mit.edu>
|
|
Date: Thu, 7 Aug 2025 09:35:20 -0400
|
|
Subject: ext4: don't try to clear the orphan_present feature block device is
|
|
r/o
|
|
Origin: https://git.kernel.org/linus/c5e104a91e7b6fa12c1dc2d8bf84abb7ef9b89ad
|
|
Bug-Debian: https://bugs.debian.org/1108271
|
|
|
|
When the file system is frozen in preparation for taking an LVM
|
|
snapshot, the journal is checkpointed and if the orphan_file feature
|
|
is enabled, and the orphan file is empty, we clear the orphan_present
|
|
feature flag. But if there are pending inodes that need to be removed
|
|
the orphan_present feature flag can't be cleared.
|
|
|
|
The problem comes if the block device is read-only. In that case, we
|
|
can't process the orphan inode list, so it is skipped in
|
|
ext4_orphan_cleanup(). But then in ext4_mark_recovery_complete(),
|
|
this results in the ext4 error "Orphan file not empty on read-only fs"
|
|
firing and the file system mount is aborted.
|
|
|
|
Fix this by clearing the needs_recovery flag in the block device is
|
|
read-only. We do this after the call to ext4_load_and_init-journal()
|
|
since there are some error checks need to be done in case the journal
|
|
needs to be replayed and the block device is read-only, or if the
|
|
block device containing the externa journal is read-only, etc.
|
|
|
|
Cc: stable@kernel.org
|
|
Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1108271
|
|
Cc: stable@vger.kernel.org
|
|
Fixes: 02f310fcf47f ("ext4: Speedup ext4 orphan inode handling")
|
|
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
|
---
|
|
fs/ext4/super.c | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
--- a/fs/ext4/super.c
|
|
+++ b/fs/ext4/super.c
|
|
@@ -5414,6 +5414,8 @@ static int __ext4_fill_super(struct fs_c
|
|
err = ext4_load_and_init_journal(sb, es, ctx);
|
|
if (err)
|
|
goto failed_mount3a;
|
|
+ if (bdev_read_only(sb->s_bdev))
|
|
+ needs_recovery = 0;
|
|
} else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
|
|
ext4_has_feature_journal_needs_recovery(sb)) {
|
|
ext4_msg(sb, KERN_ERR, "required journal recovery "
|