]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: add ext4_fc_eligible()
authorNeilBrown <neil@brown.name>
Fri, 20 Mar 2026 00:03:17 +0000 (11:03 +1100)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 10 Apr 2026 01:51:34 +0000 (21:51 -0400)
Testing EXT4_MF_FC_INELIGIBLE is almost always combined with testing
ext4_fc_disabled().  The code can be simplified by combining these two
in a new ext4_fc_eligible().

In ext4_fc_track_inode() this moves the ext4_fc_disabled() test after
ext4_fc_mark_ineligible(), but as that is a non-op when
ext4_fc_disabled() is true, this is no no consequence.

Note that it is important to still call ext4_fc_mark_ineligible() in
ext4_fc_track_inode() even when ext4_fc_eligible() would return true.
ext4_fc_mark_ineligible() does not ONLY set the "INELIGIBLE" flag but
also updates ->s_fc_ineligible_tid to make sure that the flag remains
set until all ineligible transactions have been committed.

Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: NeilBrown <neil@brown.name>
Link: https://patch.msgid.link/20260320000838.3797494-3-neilb@ownmail.net
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/fast_commit.c

index e0ce49f99ca45c15fb7d47ee603e8f2fdbcab98d..e58484d69d8e67f1056efcdf4b23cfc1bc444ed3 100644 (file)
@@ -224,6 +224,12 @@ static bool ext4_fc_disabled(struct super_block *sb)
                (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY));
 }
 
+static bool ext4_fc_eligible(struct super_block *sb)
+{
+       return !ext4_fc_disabled(sb) &&
+               !(ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE));
+}
+
 /*
  * Remove inode from fast commit list. If the inode is being committed
  * we wait until inode commit is done.
@@ -473,13 +479,8 @@ void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry)
 {
        struct inode *inode = d_inode(dentry);
 
-       if (ext4_fc_disabled(inode->i_sb))
-               return;
-
-       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
-               return;
-
-       __ext4_fc_track_unlink(handle, inode, dentry);
+       if (ext4_fc_eligible(inode->i_sb))
+               __ext4_fc_track_unlink(handle, inode, dentry);
 }
 
 void __ext4_fc_track_link(handle_t *handle,
@@ -500,13 +501,8 @@ void ext4_fc_track_link(handle_t *handle, struct dentry *dentry)
 {
        struct inode *inode = d_inode(dentry);
 
-       if (ext4_fc_disabled(inode->i_sb))
-               return;
-
-       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
-               return;
-
-       __ext4_fc_track_link(handle, inode, dentry);
+       if (ext4_fc_eligible(inode->i_sb))
+               __ext4_fc_track_link(handle, inode, dentry);
 }
 
 void __ext4_fc_track_create(handle_t *handle, struct inode *inode,
@@ -527,13 +523,8 @@ void ext4_fc_track_create(handle_t *handle, struct dentry *dentry)
 {
        struct inode *inode = d_inode(dentry);
 
-       if (ext4_fc_disabled(inode->i_sb))
-               return;
-
-       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
-               return;
-
-       __ext4_fc_track_create(handle, inode, dentry);
+       if (ext4_fc_eligible(inode->i_sb))
+               __ext4_fc_track_create(handle, inode, dentry);
 }
 
 /* __track_fn for inode tracking */
@@ -557,16 +548,13 @@ void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
        if (S_ISDIR(inode->i_mode))
                return;
 
-       if (ext4_fc_disabled(inode->i_sb))
-               return;
-
        if (ext4_should_journal_data(inode)) {
                ext4_fc_mark_ineligible(inode->i_sb,
                                        EXT4_FC_REASON_INODE_JOURNAL_DATA, handle);
                return;
        }
 
-       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
+       if (!ext4_fc_eligible(inode->i_sb))
                return;
 
        /*
@@ -644,10 +632,7 @@ void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t star
        if (S_ISDIR(inode->i_mode))
                return;
 
-       if (ext4_fc_disabled(inode->i_sb))
-               return;
-
-       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
+       if (!ext4_fc_eligible(inode->i_sb))
                return;
 
        if (ext4_has_inline_data(inode)) {