]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: allow inode inactivation during a ro mount log recovery
authorDarrick J. Wong <djwong@kernel.org>
Tue, 17 Jun 2025 20:55:33 +0000 (22:55 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:05:22 +0000 (11:05 +0100)
[ Upstream commit 76e589013fec672c3587d6314f2d1f0aeddc26d9 ]

In the next patch, we're going to prohibit log recovery if the primary
superblock contains an unrecognized rocompat feature bit even on
readonly mounts.  This requires removing all the code in the log
mounting process that temporarily disables the readonly state.

Unfortunately, inode inactivation disables itself on readonly mounts.
Clearing the iunlinked lists after log recovery needs inactivation to
run to free the unreferenced inodes, which (AFAICT) is the only reason
why log mounting plays games with the readonly state in the first place.

Therefore, change the inactivation predicates to allow inactivation
during log recovery of a readonly mount.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Stable-dep-of: 74ad4693b647 ("xfs: fix log recovery when unknown rocompat bits are set")
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/xfs/xfs_inode.c

index 3b36d5569d15d4d2b6718ed444221bd97fe62a7d..98955cd0de4061e43243d7c1be38548fb9d38dcb 100644 (file)
@@ -32,6 +32,7 @@
 #include "xfs_symlink.h"
 #include "xfs_trans_priv.h"
 #include "xfs_log.h"
+#include "xfs_log_priv.h"
 #include "xfs_bmap_btree.h"
 #include "xfs_reflink.h"
 #include "xfs_ag.h"
@@ -1678,8 +1679,11 @@ xfs_inode_needs_inactive(
        if (VFS_I(ip)->i_mode == 0)
                return false;
 
-       /* If this is a read-only mount, don't do this (would generate I/O) */
-       if (xfs_is_readonly(mp))
+       /*
+        * If this is a read-only mount, don't do this (would generate I/O)
+        * unless we're in log recovery and cleaning the iunlinked list.
+        */
+       if (xfs_is_readonly(mp) && !xlog_recovery_needed(mp->m_log))
                return false;
 
        /* If the log isn't running, push inodes straight to reclaim. */
@@ -1739,8 +1743,11 @@ xfs_inactive(
        mp = ip->i_mount;
        ASSERT(!xfs_iflags_test(ip, XFS_IRECOVERY));
 
-       /* If this is a read-only mount, don't do this (would generate I/O) */
-       if (xfs_is_readonly(mp))
+       /*
+        * If this is a read-only mount, don't do this (would generate I/O)
+        * unless we're in log recovery and cleaning the iunlinked list.
+        */
+       if (xfs_is_readonly(mp) && !xlog_recovery_needed(mp->m_log))
                goto out;
 
        /* Metadata inodes require explicit resource cleanup. */