diff options
| author | David Sterba <[email protected]> | 2024-05-14 16:48:12 +0200 | 
|---|---|---|
| committer | David Sterba <[email protected]> | 2024-07-11 15:33:19 +0200 | 
| commit | 42317ab440c110618b511290284c6d6c10bcffc7 (patch) | |
| tree | c3f772cf50094329d52415a9d32cf8e8fd4122ec | |
| parent | 839d6ea4f86de1d2e36a1b02561b4ccd597643b9 (diff) | |
btrfs: simplify range parameters of btrfs_wait_ordered_roots()
The range is specified only in two ways, we can simplify the case for
the whole filesystem range as a NULL block group parameter.
Signed-off-by: David Sterba <[email protected]>
| -rw-r--r-- | fs/btrfs/dev-replace.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.c | 28 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.h | 4 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/scrub.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/send.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/space-info.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/zoned.c | 3 | 
13 files changed, 38 insertions, 28 deletions
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index 7130040d92ab..f638c458d285 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c @@ -684,7 +684,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info,  	if (ret)  		btrfs_err(fs_info, "kobj add dev failed %d", ret); -	btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  	/*  	 * Commit dev_replace state and reserve 1 item for it. @@ -880,7 +880,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,  		mutex_unlock(&dev_replace->lock_finishing_cancel_unmount);  		return ret;  	} -	btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  	/*  	 * We have to use this loop approach because at this point src_device diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 748b94b3c981..95c0d4450354 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4520,7 +4520,7 @@ static void btrfs_destroy_all_ordered_extents(struct btrfs_fs_info *fs_info)  	 * extents that haven't had their dirty pages IO start writeout yet  	 * actually get run and error out properly.  	 */ -	btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  }  static void btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 968e256003af..6e24cced6f0d 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1070,7 +1070,7 @@ static noinline int btrfs_mksnapshot(const struct path *parent,  	atomic_inc(&root->snapshot_force_cow);  	snapshot_force_cow = true; -	btrfs_wait_ordered_extents(root, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_extents(root, U64_MAX, NULL);  	ret = btrfs_mksubvol(parent, idmap, name, namelen,  			     root, readonly, inherit); diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index e2c176f7c387..d446d89c2c34 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -19,6 +19,7 @@  #include "qgroup.h"  #include "subpage.h"  #include "file.h" +#include "block-group.h"  static struct kmem_cache *btrfs_ordered_extent_cache; @@ -711,11 +712,11 @@ static void btrfs_run_ordered_extent_work(struct btrfs_work *work)  }  /* - * wait for all the ordered extents in a root.  This is done when balancing - * space between drives. + * Wait for all the ordered extents in a root. Use @bg as range or do whole + * range if it's NULL.   */  u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr, -			       const u64 range_start, const u64 range_len) +			       const struct btrfs_block_group *bg)  {  	struct btrfs_fs_info *fs_info = root->fs_info;  	LIST_HEAD(splice); @@ -723,7 +724,17 @@ u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr,  	LIST_HEAD(works);  	struct btrfs_ordered_extent *ordered, *next;  	u64 count = 0; -	const u64 range_end = range_start + range_len; +	u64 range_start, range_len; +	u64 range_end; + +	if (bg) { +		range_start = bg->start; +		range_len = bg->length; +	} else { +		range_start = 0; +		range_len = U64_MAX; +	} +	range_end = range_start + range_len;  	mutex_lock(&root->ordered_extent_mutex);  	spin_lock(&root->ordered_extent_lock); @@ -770,8 +781,12 @@ u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr,  	return count;  } +/* + * Wait for @nr ordered extents that intersect the @bg, or the whole range of + * the filesystem if @bg is NULL. + */  void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr, -			     const u64 range_start, const u64 range_len) +			      const struct btrfs_block_group *bg)  {  	struct btrfs_root *root;  	LIST_HEAD(splice); @@ -789,8 +804,7 @@ void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr,  			       &fs_info->ordered_roots);  		spin_unlock(&fs_info->ordered_root_lock); -		done = btrfs_wait_ordered_extents(root, nr, -						  range_start, range_len); +		done = btrfs_wait_ordered_extents(root, nr, bg);  		btrfs_put_root(root);  		spin_lock(&fs_info->ordered_root_lock); diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index 4a4dd15d38ba..2ec329e2f0f3 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h @@ -193,9 +193,9 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range(  void btrfs_get_ordered_extents_for_logging(struct btrfs_inode *inode,  					   struct list_head *list);  u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr, -			       const u64 range_start, const u64 range_len); +			       const struct btrfs_block_group *bg);  void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr, -			      const u64 range_start, const u64 range_len); +			      const struct btrfs_block_group *bg);  void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,  					u64 end,  					struct extent_state **cached_state); diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 629fe893f4ab..b9c5dff960de 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -1340,7 +1340,7 @@ static int flush_reservations(struct btrfs_fs_info *fs_info)  	ret = btrfs_start_delalloc_roots(fs_info, LONG_MAX, false);  	if (ret)  		return ret; -	btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  	trans = btrfs_join_transaction(fs_info->tree_root);  	if (IS_ERR(trans))  		return PTR_ERR(trans); @@ -4208,7 +4208,7 @@ static int try_flush_qgroup(struct btrfs_root *root)  	ret = btrfs_start_delalloc_snapshot(root, true);  	if (ret < 0)  		goto out; -	btrfs_wait_ordered_extents(root, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_extents(root, U64_MAX, NULL);  	trans = btrfs_attach_transaction_barrier(root);  	if (IS_ERR(trans)) { diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 8ce337ec033c..5f1a909a1d91 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -4122,9 +4122,7 @@ int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)  	btrfs_wait_block_group_reservations(rc->block_group);  	btrfs_wait_nocow_writers(rc->block_group); -	btrfs_wait_ordered_roots(fs_info, U64_MAX, -				 rc->block_group->start, -				 rc->block_group->length); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, rc->block_group);  	ret = btrfs_zone_finish(rc->block_group);  	WARN_ON(ret && ret != -EAGAIN); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index d7caa3732f07..b67cae14ad8b 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -2448,7 +2448,7 @@ static int finish_extent_writes_for_zoned(struct btrfs_root *root,  	btrfs_wait_block_group_reservations(cache);  	btrfs_wait_nocow_writers(cache); -	btrfs_wait_ordered_roots(fs_info, U64_MAX, cache->start, cache->length); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, cache);  	trans = btrfs_join_transaction(root);  	if (IS_ERR(trans)) @@ -2684,8 +2684,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,  		 */  		if (sctx->is_dev_replace) {  			btrfs_wait_nocow_writers(cache); -			btrfs_wait_ordered_roots(fs_info, U64_MAX, cache->start, -					cache->length); +			btrfs_wait_ordered_roots(fs_info, U64_MAX, cache);  		}  		scrub_pause_off(fs_info); diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 3dd4a48479a9..c69743233be5 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -8046,7 +8046,7 @@ static int flush_delalloc_roots(struct send_ctx *sctx)  		ret = btrfs_start_delalloc_snapshot(root, false);  		if (ret)  			return ret; -		btrfs_wait_ordered_extents(root, U64_MAX, 0, U64_MAX); +		btrfs_wait_ordered_extents(root, U64_MAX, NULL);  	}  	for (i = 0; i < sctx->clone_roots_cnt; i++) { @@ -8054,7 +8054,7 @@ static int flush_delalloc_roots(struct send_ctx *sctx)  		ret = btrfs_start_delalloc_snapshot(root, false);  		if (ret)  			return ret; -		btrfs_wait_ordered_extents(root, U64_MAX, 0, U64_MAX); +		btrfs_wait_ordered_extents(root, U64_MAX, NULL);  	}  	return 0; diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index 293eb009188e..ef68a478ad63 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c @@ -704,7 +704,7 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,  skip_async:  		loops++;  		if (wait_ordered && !trans) { -			btrfs_wait_ordered_roots(fs_info, items, 0, (u64)-1); +			btrfs_wait_ordered_roots(fs_info, items, NULL);  		} else {  			time_left = schedule_timeout_killable(1);  			if (time_left) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index f05cce7c8b8d..117a355dbd7a 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -983,7 +983,7 @@ int btrfs_sync_fs(struct super_block *sb, int wait)  		return 0;  	} -	btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +	btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  	trans = btrfs_attach_transaction_barrier(root);  	if (IS_ERR(trans)) { diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 3388c836b9a5..639755f025b4 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -2110,7 +2110,7 @@ static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info)  static inline void btrfs_wait_delalloc_flush(struct btrfs_fs_info *fs_info)  {  	if (btrfs_test_opt(fs_info, FLUSHONCOMMIT)) -		btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); +		btrfs_wait_ordered_roots(fs_info, U64_MAX, NULL);  }  /* diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index ea1d0a92f0e4..0fa8df7614a5 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -2212,8 +2212,7 @@ static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_writ  		/* Ensure all writes in this block group finish */  		btrfs_wait_block_group_reservations(block_group);  		/* No need to wait for NOCOW writers. Zoned mode does not allow that */ -		btrfs_wait_ordered_roots(fs_info, U64_MAX, block_group->start, -					 block_group->length); +		btrfs_wait_ordered_roots(fs_info, U64_MAX, block_group);  		/* Wait for extent buffers to be written. */  		if (is_metadata)  			wait_eb_writebacks(block_group);  |