Commit ded980eb authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: add and use helper to commit the current transaction



We have several places that attach to the current transaction with
btrfs_attach_transaction_barrier() and then commit the transaction if
there is one. Add a helper and use it to deduplicate this pattern.

Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 1f8aee29
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -4144,9 +4144,6 @@ void btrfs_drop_and_free_fs_root(struct btrfs_fs_info *fs_info,

int btrfs_commit_super(struct btrfs_fs_info *fs_info)
{
	struct btrfs_root *root = fs_info->tree_root;
	struct btrfs_trans_handle *trans;

	mutex_lock(&fs_info->cleaner_mutex);
	btrfs_run_delayed_iputs(fs_info);
	mutex_unlock(&fs_info->cleaner_mutex);
@@ -4156,14 +4153,7 @@ int btrfs_commit_super(struct btrfs_fs_info *fs_info)
	down_write(&fs_info->cleanup_work_sem);
	up_write(&fs_info->cleanup_work_sem);

	trans = btrfs_attach_transaction_barrier(root);
	if (IS_ERR(trans)) {
		int ret = PTR_ERR(trans);

		return (ret == -ENOENT) ? 0 : ret;
	}

	return btrfs_commit_transaction(trans);
	return btrfs_commit_current_transaction(fs_info->tree_root);
}

static void warn_about_uncommitted_trans(struct btrfs_fs_info *fs_info)
+5 −28
Original line number Diff line number Diff line
@@ -1334,7 +1334,6 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info,
 */
static int flush_reservations(struct btrfs_fs_info *fs_info)
{
	struct btrfs_trans_handle *trans;
	int ret;

	ret = btrfs_start_delalloc_roots(fs_info, LONG_MAX, false);
@@ -1342,13 +1341,7 @@ static int flush_reservations(struct btrfs_fs_info *fs_info)
		return ret;
	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);

	trans = btrfs_attach_transaction_barrier(fs_info->tree_root);
	if (IS_ERR(trans)) {
		ret = PTR_ERR(trans);
		return (ret == -ENOENT) ? 0 : ret;
	}

	return btrfs_commit_transaction(trans);
	return btrfs_commit_current_transaction(fs_info->tree_root);
}

int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
@@ -4027,7 +4020,6 @@ int
btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info)
{
	int ret = 0;
	struct btrfs_trans_handle *trans;

	ret = qgroup_rescan_init(fs_info, 0, 1);
	if (ret)
@@ -4044,17 +4036,11 @@ btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info)
	 * going to clear all tracking information for a clean start.
	 */

	trans = btrfs_attach_transaction_barrier(fs_info->fs_root);
	if (IS_ERR(trans) && trans != ERR_PTR(-ENOENT)) {
		fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN;
		return PTR_ERR(trans);
	} else if (trans != ERR_PTR(-ENOENT)) {
		ret = btrfs_commit_transaction(trans);
	ret = btrfs_commit_current_transaction(fs_info->fs_root);
	if (ret) {
		fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN;
		return ret;
	}
	}

	qgroup_rescan_zero_tracking(fs_info);

@@ -4189,7 +4175,6 @@ static int qgroup_unreserve_range(struct btrfs_inode *inode,
 */
static int try_flush_qgroup(struct btrfs_root *root)
{
	struct btrfs_trans_handle *trans;
	int ret;

	/* Can't hold an open transaction or we run the risk of deadlocking. */
@@ -4212,15 +4197,7 @@ static int try_flush_qgroup(struct btrfs_root *root)
		goto out;
	btrfs_wait_ordered_extents(root, U64_MAX, NULL);

	trans = btrfs_attach_transaction_barrier(root);
	if (IS_ERR(trans)) {
		ret = PTR_ERR(trans);
		if (ret == -ENOENT)
			ret = 0;
		goto out;
	}

	ret = btrfs_commit_transaction(trans);
	ret = btrfs_commit_current_transaction(root);
out:
	clear_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state);
	wake_up(&root->qgroup_flush_wait);
+1 −9
Original line number Diff line number Diff line
@@ -2441,7 +2441,6 @@ static int finish_extent_writes_for_zoned(struct btrfs_root *root,
					  struct btrfs_block_group *cache)
{
	struct btrfs_fs_info *fs_info = cache->fs_info;
	struct btrfs_trans_handle *trans;

	if (!btrfs_is_zoned(fs_info))
		return 0;
@@ -2450,14 +2449,7 @@ static int finish_extent_writes_for_zoned(struct btrfs_root *root,
	btrfs_wait_nocow_writers(cache);
	btrfs_wait_ordered_roots(fs_info, U64_MAX, cache);

	trans = btrfs_attach_transaction_barrier(root);
	if (IS_ERR(trans)) {
		int ret = PTR_ERR(trans);

		return (ret == -ENOENT) ? 0 : ret;
	}

	return btrfs_commit_transaction(trans);
	return btrfs_commit_current_transaction(root);
}

static noinline_for_stack
+1 −9
Original line number Diff line number Diff line
@@ -7998,7 +7998,6 @@ static int send_subvol(struct send_ctx *sctx)
 */
static int ensure_commit_roots_uptodate(struct send_ctx *sctx)
{
	struct btrfs_trans_handle *trans;
	struct btrfs_root *root = sctx->parent_root;

	if (root && root->node != root->commit_root)
@@ -8018,14 +8017,7 @@ static int ensure_commit_roots_uptodate(struct send_ctx *sctx)
	 * an unnecessary update of the root's item in the root tree when
	 * committing the transaction if that root wasn't changed before.
	 */
	trans = btrfs_attach_transaction_barrier(root);
	if (IS_ERR(trans)) {
		int ret = PTR_ERR(trans);

		return (ret == -ENOENT) ? 0 : ret;
	}

	return btrfs_commit_transaction(trans);
	return btrfs_commit_current_transaction(root);
}

/*
+1 −8
Original line number Diff line number Diff line
@@ -823,14 +823,7 @@ static void flush_space(struct btrfs_fs_info *fs_info,
		 * because that does not wait for a transaction to fully commit
		 * (only for it to be unblocked, state TRANS_STATE_UNBLOCKED).
		 */
		trans = btrfs_attach_transaction_barrier(root);
		if (IS_ERR(trans)) {
			ret = PTR_ERR(trans);
			if (ret == -ENOENT)
				ret = 0;
			break;
		}
		ret = btrfs_commit_transaction(trans);
		ret = btrfs_commit_current_transaction(root);
		break;
	default:
		ret = -ENOSPC;
Loading