Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 617c54a8 authored by Nikolay Borisov's avatar Nikolay Borisov Committed by David Sterba
Browse files

btrfs: Make btrfs_async_run_delayed_root use a loop rather than multiple labels



Currently btrfs_async_run_delayed_root's implementation uses 3 goto
labels to mimic the functionality of a simple do {} while loop. Refactor
the function to use a do {} while construct, making intention clear and
code easier to follow. No functional changes.

Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent d3fac6ba
Loading
Loading
Loading
Loading
+27 −25
Original line number Diff line number Diff line
@@ -1302,20 +1302,25 @@ static void btrfs_async_run_delayed_root(struct btrfs_work *work)
	if (!path)
		goto out;

again:
	if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND / 2)
		goto free_path;
	do {
		if (atomic_read(&delayed_root->items) <
		    BTRFS_DELAYED_BACKGROUND / 2)
			break;

		delayed_node = btrfs_first_prepared_delayed_node(delayed_root);
		if (!delayed_node)
		goto free_path;
			break;

		path->leave_spinning = 1;
		root = delayed_node->root;

		trans = btrfs_join_transaction(root);
	if (IS_ERR(trans))
		goto release_path;
		if (IS_ERR(trans)) {
			btrfs_release_path(path);
			btrfs_release_prepared_delayed_node(delayed_node);
			total_done++;
			continue;
		}

		block_rsv = trans->block_rsv;
		trans->block_rsv = &root->fs_info->delayed_block_rsv;
@@ -1326,16 +1331,13 @@ static void btrfs_async_run_delayed_root(struct btrfs_work *work)
		btrfs_end_transaction(trans);
		btrfs_btree_balance_dirty_nodelay(root->fs_info);

release_path:
		btrfs_release_path(path);
		btrfs_release_prepared_delayed_node(delayed_node);
		total_done++;

	btrfs_release_prepared_delayed_node(delayed_node);
	if ((async_work->nr == 0 && total_done < BTRFS_DELAYED_WRITEBACK) ||
	    total_done < async_work->nr)
		goto again;
	} while ((async_work->nr == 0 && total_done < BTRFS_DELAYED_WRITEBACK)
		 || total_done < async_work->nr);

free_path:
	btrfs_free_path(path);
out:
	wake_up(&delayed_root->wait);