| From c5e104a91e7b6fa12c1dc2d8bf84abb7ef9b89ad Mon Sep 17 00:00:00 2001 |
| 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 |
| |
| From: Theodore Ts'o <tytso@mit.edu> |
| |
| commit c5e104a91e7b6fa12c1dc2d8bf84abb7ef9b89ad upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ext4/super.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -5398,6 +5398,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 " |