Commit 2729cfdc authored by Harshad Shirwadkar's avatar Harshad Shirwadkar Committed by Theodore Ts'o
Browse files

ext4: use ext4_journal_start/stop for fast commit transactions



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: default avatarHarshad Shirwadkar <harshadshirwadkar@gmail.com>
Link: https://lore.kernel.org/r/20211223202140.2061101-2-harshads@google.com


Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 960e0ab6
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -246,7 +246,6 @@ ext4_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
	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 @@ ext4_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
	}
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;
+0 −3
Original line number Diff line number Diff line
@@ -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 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
	inode_unlock(inode);
	trace_ext4_fallocate_exit(inode, offset, max_blocks, ret);
exit:
	ext4_fc_stop_update(inode);
	return ret;
}

+0 −4
Original line number Diff line number Diff line
@@ -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;
+1 −6
Original line number Diff line number Diff line
@@ -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 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
		ext4_std_error(inode->i_sb, error);
	if (!error)
		error = rc;
	ext4_fc_stop_update(inode);
	return error;
}

+1 −9
Original line number Diff line number Diff line
@@ -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 @@ static long __ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

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
Loading