*/
        struct work_struct s_error_work;
 
-       /* Ext4 fast commit stuff */
+       /* Ext4 fast commit sub transaction ID */
        atomic_t s_fc_subtid;
-       atomic_t s_fc_ineligible_updates;
+
        /*
         * After commit starts, the main queue gets locked, and the further
         * updates get added in the staging queue.
 void ext4_fc_track_create(handle_t *handle, struct dentry *dentry);
 void ext4_fc_track_inode(handle_t *handle, struct inode *inode);
 void ext4_fc_mark_ineligible(struct super_block *sb, int reason);
-void ext4_fc_start_ineligible(struct super_block *sb, int reason);
-void ext4_fc_stop_ineligible(struct super_block *sb);
 void ext4_fc_start_update(struct inode *inode);
 void ext4_fc_stop_update(struct inode *inode);
 void ext4_fc_del(struct inode *inode);
 
                ret = PTR_ERR(handle);
                goto out_mmap;
        }
-       ext4_fc_start_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE);
+       ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE);
 
        down_write(&EXT4_I(inode)->i_data_sem);
        ext4_discard_preallocations(inode, 0);
 
 out_stop:
        ext4_journal_stop(handle);
-       ext4_fc_stop_ineligible(sb);
 out_mmap:
        filemap_invalidate_unlock(mapping);
 out_mutex:
                ret = PTR_ERR(handle);
                goto out_mmap;
        }
-       ext4_fc_start_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE);
+       ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE);
 
        /* Expand file to avoid data loss if there is error while shifting */
        inode->i_size += len;
 
 out_stop:
        ext4_journal_stop(handle);
-       ext4_fc_stop_ineligible(sb);
 out_mmap:
        filemap_invalidate_unlock(mapping);
 out_mutex:
 
  *
  * Fast Commit Ineligibility
  * -------------------------
- * Not all operations are supported by fast commits today (e.g extended
- * attributes). Fast commit ineligibility is marked by calling one of the
- * two following functions:
- *
- * - ext4_fc_mark_ineligible(): This makes next fast commit operation to fall
- *   back to full commit. This is useful in case of transient errors.
  *
- * - ext4_fc_start_ineligible() and ext4_fc_stop_ineligible() - This makes all
- *   the fast commits happening between ext4_fc_start_ineligible() and
- *   ext4_fc_stop_ineligible() and one fast commit after the call to
- *   ext4_fc_stop_ineligible() to fall back to full commits. It is important to
- *   make one more fast commit to fall back to full commit after stop call so
- *   that it guaranteed that the fast commit ineligible operation contained
- *   within ext4_fc_start_ineligible() and ext4_fc_stop_ineligible() is
- *   followed by at least 1 full commit.
+ * Not all operations are supported by fast commits today (e.g extended
+ * attributes). Fast commit ineligibility is marked by calling
+ * ext4_fc_mark_ineligible(): This makes next fast commit operation to fall back
+ * to full commit.
  *
  * Atomicity of commits
  * --------------------
        sbi->s_fc_stats.fc_ineligible_reason_count[reason]++;
 }
 
-/*
- * Start a fast commit ineligible update. Any commits that happen while
- * such an operation is in progress fall back to full commits.
- */
-void ext4_fc_start_ineligible(struct super_block *sb, int reason)
-{
-       struct ext4_sb_info *sbi = EXT4_SB(sb);
-
-       if (!test_opt2(sb, JOURNAL_FAST_COMMIT) ||
-           (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))
-               return;
-
-       WARN_ON(reason >= EXT4_FC_REASON_MAX);
-       sbi->s_fc_stats.fc_ineligible_reason_count[reason]++;
-       atomic_inc(&sbi->s_fc_ineligible_updates);
-}
-
-/*
- * Stop a fast commit ineligible update. We set EXT4_MF_FC_INELIGIBLE flag here
- * to ensure that after stopping the ineligible update, at least one full
- * commit takes place.
- */
-void ext4_fc_stop_ineligible(struct super_block *sb)
-{
-       if (!test_opt2(sb, JOURNAL_FAST_COMMIT) ||
-           (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))
-               return;
-
-       ext4_set_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
-       atomic_dec(&EXT4_SB(sb)->s_fc_ineligible_updates);
-}
-
-static inline int ext4_fc_is_ineligible(struct super_block *sb)
-{
-       return (ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE) ||
-               atomic_read(&EXT4_SB(sb)->s_fc_ineligible_updates));
-}
-
 /*
  * Generic fast commit tracking function. If this is the first time this we are
  * called after a full commit, we initialize fast commit fields and then call
            (sbi->s_mount_state & EXT4_FC_REPLAY))
                return -EOPNOTSUPP;
 
-       if (ext4_fc_is_ineligible(inode->i_sb))
+       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
                return -EINVAL;
 
        tid = handle->h_transaction->t_tid;
 
        start_time = ktime_get();
 
-       if (!test_opt2(sb, JOURNAL_FAST_COMMIT) ||
-               (ext4_fc_is_ineligible(sb))) {
-               reason = EXT4_FC_REASON_INELIGIBLE;
-               goto out;
-       }
+       if (!test_opt2(sb, JOURNAL_FAST_COMMIT))
+               return jbd2_complete_transaction(journal, commit_tid);
 
 restart_fc:
        ret = jbd2_fc_begin_commit(journal, commit_tid);
                reason = EXT4_FC_REASON_FC_START_FAILED;
                goto out;
        }
+       /*
+        * After establishing journal barrier via jbd2_fc_begin_commit(), check
+        * if we are fast commit ineligible.
+        */
+       if (ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE)) {
+               reason = EXT4_FC_REASON_INELIGIBLE;
+               goto out;
+       }
 
        fc_bufs_before = (sbi->s_fc_bytes + bsize - 1) / bsize;
        ret = ext4_fc_perform_commit(journal);
        atomic_inc(&sbi->s_fc_subtid);
        jbd2_fc_end_commit(journal);
 out:
-       /* Has any ineligible update happened since we started? */
-       if (reason == EXT4_FC_REASON_OK && ext4_fc_is_ineligible(sb)) {
-               sbi->s_fc_stats.fc_ineligible_reason_count[EXT4_FC_COMMIT_FAILED]++;
-               reason = EXT4_FC_REASON_INELIGIBLE;
-       }
-
        spin_lock(&sbi->s_fc_lock);
        if (reason != EXT4_FC_REASON_OK &&
                reason != EXT4_FC_REASON_ALREADY_COMMITTED) {