]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ext4: use ext4_journal_start/stop for fast commit transactions
authorHarshad Shirwadkar <harshadshirwadkar@gmail.com>
Thu, 23 Dec 2021 20:21:37 +0000 (12:21 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 23 Dec 2021 23:13:25 +0000 (18:13 -0500)
This patch drops all calls to ext4_fc_start_update() and
ext4_fc_stop_update(). To ensure that there are no ongoing journal
updates during fast commit, we also make jbd2_fc_begin_commit() lock
journal for updates. This way we don't have to maintain two different
transaction start stop APIs for fast commit and full commit. This
patch doesn't remove the functions altogether since in future we want
to have inode level locking for fast commits.

Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
Link: https://lore.kernel.org/r/20211223202140.2061101-2-harshads@google.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/acl.c
fs/ext4/extents.c
fs/ext4/file.c
fs/ext4/inode.c
fs/ext4/ioctl.c
fs/jbd2/journal.c

index 0613dfcbfd4aa7490096c5707ee9ce38a85a333a..5a35768d6149a151160f99dc4ba12b80c8d02b7e 100644 (file)
@@ -246,7 +246,6 @@ retry:
        handle = ext4_journal_start(inode, EXT4_HT_XATTR, credits);
        if (IS_ERR(handle))
                return PTR_ERR(handle);
-       ext4_fc_start_update(inode);
 
        if ((type == ACL_TYPE_ACCESS) && acl) {
                error = posix_acl_update_mode(mnt_userns, inode, &mode, &acl);
@@ -264,7 +263,6 @@ retry:
        }
 out_stop:
        ext4_journal_stop(handle);
-       ext4_fc_stop_update(inode);
        if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
                goto retry;
        return error;
index 0ecf819bf1891ab30ab7d53c6f0b19a74758bfd0..703feff8cb8c9dda11723b7c5783cd70618d928e 100644 (file)
@@ -4697,8 +4697,6 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
                     FALLOC_FL_INSERT_RANGE))
                return -EOPNOTSUPP;
 
-       ext4_fc_start_update(inode);
-
        if (mode & FALLOC_FL_PUNCH_HOLE) {
                ret = ext4_punch_hole(inode, offset, len);
                goto exit;
@@ -4762,7 +4760,6 @@ out:
        inode_unlock(inode);
        trace_ext4_fallocate_exit(inode, offset, max_blocks, ret);
 exit:
-       ext4_fc_stop_update(inode);
        return ret;
 }
 
index 4c5f410523514a8370ab63a120f81b26a36ba80b..8cc11715518ac1a460070d76e26caee32a9b9d16 100644 (file)
@@ -259,7 +259,6 @@ static ssize_t ext4_buffered_write_iter(struct kiocb *iocb,
        if (iocb->ki_flags & IOCB_NOWAIT)
                return -EOPNOTSUPP;
 
-       ext4_fc_start_update(inode);
        inode_lock(inode);
        ret = ext4_write_checks(iocb, from);
        if (ret <= 0)
@@ -271,7 +270,6 @@ static ssize_t ext4_buffered_write_iter(struct kiocb *iocb,
 
 out:
        inode_unlock(inode);
-       ext4_fc_stop_update(inode);
        if (likely(ret > 0)) {
                iocb->ki_pos += ret;
                ret = generic_write_sync(iocb, ret);
@@ -552,9 +550,7 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from)
                        goto out;
                }
 
-               ext4_fc_start_update(inode);
                ret = ext4_orphan_add(handle, inode);
-               ext4_fc_stop_update(inode);
                if (ret) {
                        ext4_journal_stop(handle);
                        goto out;
index bfd3545f1e5d933b76f3d7b182f849d9cea76511..82f555d2698040638af7a38e16f7c09957b6ba6d 100644 (file)
@@ -5320,7 +5320,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                if (error)
                        return error;
        }
-       ext4_fc_start_update(inode);
+
        if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) ||
            (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) {
                handle_t *handle;
@@ -5344,7 +5344,6 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
 
                if (error) {
                        ext4_journal_stop(handle);
-                       ext4_fc_stop_update(inode);
                        return error;
                }
                /* Update corresponding info in inode so that everything is in
@@ -5356,7 +5355,6 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                error = ext4_mark_inode_dirty(handle, inode);
                ext4_journal_stop(handle);
                if (unlikely(error)) {
-                       ext4_fc_stop_update(inode);
                        return error;
                }
        }
@@ -5370,12 +5368,10 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                        struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
 
                        if (attr->ia_size > sbi->s_bitmap_maxbytes) {
-                               ext4_fc_stop_update(inode);
                                return -EFBIG;
                        }
                }
                if (!S_ISREG(inode->i_mode)) {
-                       ext4_fc_stop_update(inode);
                        return -EINVAL;
                }
 
@@ -5499,7 +5495,6 @@ err_out:
                ext4_std_error(inode->i_sb, error);
        if (!error)
                error = rc;
-       ext4_fc_stop_update(inode);
        return error;
 }
 
index 606dee9e08a32076c19f59ff30c5e5477289ae2a..e64a12e1218a90615f2b7eccbdf47991cd3dd975 100644 (file)
@@ -743,7 +743,6 @@ int ext4_fileattr_set(struct user_namespace *mnt_userns,
        u32 flags = fa->flags;
        int err = -EOPNOTSUPP;
 
-       ext4_fc_start_update(inode);
        if (flags & ~EXT4_FL_USER_VISIBLE)
                goto out;
 
@@ -764,7 +763,6 @@ int ext4_fileattr_set(struct user_namespace *mnt_userns,
                goto out;
        err = ext4_ioctl_setproject(inode, fa->fsx_projid);
 out:
-       ext4_fc_stop_update(inode);
        return err;
 }
 
@@ -1273,13 +1271,7 @@ resizefs_out:
 
 long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
-       long ret;
-
-       ext4_fc_start_update(file_inode(filp));
-       ret = __ext4_ioctl(filp, cmd, arg);
-       ext4_fc_stop_update(file_inode(filp));
-
-       return ret;
+       return __ext4_ioctl(filp, cmd, arg);
 }
 
 #ifdef CONFIG_COMPAT
index 35302bc192eb933e44fb30fb491e512800547e0c..0b86a4365b669e14b1bc0b3b60aedb4c6b92e0ba 100644 (file)
@@ -757,6 +757,7 @@ int jbd2_fc_begin_commit(journal_t *journal, tid_t tid)
        }
        journal->j_flags |= JBD2_FAST_COMMIT_ONGOING;
        write_unlock(&journal->j_state_lock);
+       jbd2_journal_lock_updates(journal);
 
        return 0;
 }
@@ -768,6 +769,7 @@ EXPORT_SYMBOL(jbd2_fc_begin_commit);
  */
 static int __jbd2_fc_end_commit(journal_t *journal, tid_t tid, bool fallback)
 {
+       jbd2_journal_unlock_updates(journal);
        if (journal->j_fc_cleanup_callback)
                journal->j_fc_cleanup_callback(journal, 0);
        write_lock(&journal->j_state_lock);