All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] btrfs: zoned: two small style improvements for zone finishing
@ 2025-07-22 11:39 Johannes Thumshirn
  2025-07-22 11:39 ` [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
  2025-07-22 11:39 ` [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
  0 siblings, 2 replies; 6+ messages in thread
From: Johannes Thumshirn @ 2025-07-22 11:39 UTC (permalink / raw)
  To: linux-btrfs
  Cc: David Sterba, Damien Le Moal, Filipe Manana, Naohiro Aota,
	Josef Bacik, Johannes Thumshirn

From: Johannes Thumshirn <johannes.thumshirn@wdc.com>

Two small improvements for zone finish calls. The frist one changes
btrfs_zone_finish_endio_workfn() to directly call do_zone_finish(), as most of
the work done in btrfs_zone_finish_endio() is not needed in this context.

The second one adds error propagation to btrfs_zone_finish_endio() so it's
caller btrfs_finish_one_ordered() can do error handling (in case the chunk map
block group lookup failes for some reason).

Changes to v2:
- Don't ASSERT() do_zone_finish()'s return value but set FS to r/o
Link to v2:
https://lore.kernel.org/linux-btrfs/20250722093915.13214-1-jth@kernel.org

Changes to v1:
- Remove stray bg->last_eb = NULL setting
- ASSERT() do_zone_finish() returns sucessfull
- Remove stray {}
- Remove ASSERT(!block_group) after if (!block_group)

Link to v1:
https://lore.kernel.org/linux-btrfs/20250721070216.701986-1-jth@kernel.org

Johannes Thumshirn (2):
  btrfs: directly call do_zone_finish() from
    btrfs_zone_finish_endio_workfn()
  btrfs: zoned: return error from btrfs_zone_finish_endio()

 fs/btrfs/inode.c |  7 ++++---
 fs/btrfs/zoned.c | 14 ++++++++++----
 fs/btrfs/zoned.h |  9 ++++++---
 3 files changed, 20 insertions(+), 10 deletions(-)

-- 
2.50.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22 11:39 [PATCH v3 0/2] btrfs: zoned: two small style improvements for zone finishing Johannes Thumshirn
@ 2025-07-22 11:39 ` Johannes Thumshirn
  2025-07-23  1:40   ` Damien Le Moal
  2025-07-24 21:54   ` David Sterba
  2025-07-22 11:39 ` [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
  1 sibling, 2 replies; 6+ messages in thread
From: Johannes Thumshirn @ 2025-07-22 11:39 UTC (permalink / raw)
  To: linux-btrfs
  Cc: David Sterba, Damien Le Moal, Filipe Manana, Naohiro Aota,
	Josef Bacik, Johannes Thumshirn

From: Johannes Thumshirn <johannes.thumshirn@wdc.com>

When btrfs_zone_finish_endio_workfn() is calling btrfs_zone_finish_endio()
it already has a pointer to the block group. Furthermore
btrfs_zone_finish_endio() does additional checks if the block group can be
finished or not.

But in the context of btrfs_zone_finish_endio_workfn() only the actual
call to do_zone_finish() is of interest, as the skipping condition when
there is still room to allocate from the block group cannot be checked.

Directly call do_zone_finish() on the block group.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 fs/btrfs/zoned.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 245e813ecd78..e997b236d00a 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -2461,12 +2461,16 @@ void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 len
 
 static void btrfs_zone_finish_endio_workfn(struct work_struct *work)
 {
+	int ret;
 	struct btrfs_block_group *bg =
 		container_of(work, struct btrfs_block_group, zone_finish_work);
 
 	wait_on_extent_buffer_writeback(bg->last_eb);
 	free_extent_buffer(bg->last_eb);
-	btrfs_zone_finish_endio(bg->fs_info, bg->start, bg->length);
+	ret = do_zone_finish(bg, true);
+	if (ret)
+		btrfs_handle_fs_error(bg->fs_info, ret,
+				      "Failed to finish block-group's zone");
 	btrfs_put_block_group(bg);
 }
 
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio()
  2025-07-22 11:39 [PATCH v3 0/2] btrfs: zoned: two small style improvements for zone finishing Johannes Thumshirn
  2025-07-22 11:39 ` [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
@ 2025-07-22 11:39 ` Johannes Thumshirn
  2025-07-23  1:42   ` Damien Le Moal
  1 sibling, 1 reply; 6+ messages in thread
From: Johannes Thumshirn @ 2025-07-22 11:39 UTC (permalink / raw)
  To: linux-btrfs
  Cc: David Sterba, Damien Le Moal, Filipe Manana, Naohiro Aota,
	Josef Bacik, Johannes Thumshirn

From: Johannes Thumshirn <johannes.thumshirn@wdc.com>

Now that btrfs_zone_finish_endio_workfn() is directly calling
do_zone_finish() the only caller of btrfs_zone_finish_endio() is
btrfs_finish_one_ordered().

btrfs_finish_one_ordered() already has error handling in-place so
btrfs_zone_finish_endio() can return an error if the block group lookup
fails.

Also as btrfs_zone_finish_endio() already checks for zoned filesystems and
returns early, there's no need to do this in the caller.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 fs/btrfs/inode.c | 7 ++++---
 fs/btrfs/zoned.c | 8 +++++---
 fs/btrfs/zoned.h | 9 ++++++---
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 6d9a8d8bea4c..793b1d520e8d 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3109,9 +3109,10 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent)
 		goto out;
 	}
 
-	if (btrfs_is_zoned(fs_info))
-		btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
-					ordered_extent->disk_num_bytes);
+	ret = btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
+				      ordered_extent->disk_num_bytes);
+	if (ret)
+		goto out;
 
 	if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered_extent->flags)) {
 		truncated = true;
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index e997b236d00a..279446e98516 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -2431,16 +2431,17 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
 	return ret;
 }
 
-void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 length)
+int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 length)
 {
 	struct btrfs_block_group *block_group;
 	u64 min_alloc_bytes;
 
 	if (!btrfs_is_zoned(fs_info))
-		return;
+		return 0;
 
 	block_group = btrfs_lookup_block_group(fs_info, logical);
-	ASSERT(block_group);
+	if (WARN_ON_ONCE(!block_group))
+		return -ENOENT;
 
 	/* No MIXED_BG on zoned btrfs. */
 	if (block_group->flags & BTRFS_BLOCK_GROUP_DATA)
@@ -2457,6 +2458,7 @@ void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 len
 
 out:
 	btrfs_put_block_group(block_group);
+	return 0;
 }
 
 static void btrfs_zone_finish_endio_workfn(struct work_struct *work)
diff --git a/fs/btrfs/zoned.h b/fs/btrfs/zoned.h
index 6e11533b8e14..17c5656580dd 100644
--- a/fs/btrfs/zoned.h
+++ b/fs/btrfs/zoned.h
@@ -83,7 +83,7 @@ int btrfs_sync_zone_write_pointer(struct btrfs_device *tgt_dev, u64 logical,
 bool btrfs_zone_activate(struct btrfs_block_group *block_group);
 int btrfs_zone_finish(struct btrfs_block_group *block_group);
 bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags);
-void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical,
+int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical,
 			     u64 length);
 void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg,
 				   struct extent_buffer *eb);
@@ -234,8 +234,11 @@ static inline bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices,
 	return true;
 }
 
-static inline void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info,
-					   u64 logical, u64 length) { }
+static inline int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info,
+					   u64 logical, u64 length)
+{
+	return 0;
+}
 
 static inline void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg,
 						 struct extent_buffer *eb) { }
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22 11:39 ` [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
@ 2025-07-23  1:40   ` Damien Le Moal
  2025-07-24 21:54   ` David Sterba
  1 sibling, 0 replies; 6+ messages in thread
From: Damien Le Moal @ 2025-07-23  1:40 UTC (permalink / raw)
  To: Johannes Thumshirn, linux-btrfs
  Cc: David Sterba, Filipe Manana, Naohiro Aota, Josef Bacik,
	Johannes Thumshirn

On 7/22/25 8:39 PM, Johannes Thumshirn wrote:
> From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> 
> When btrfs_zone_finish_endio_workfn() is calling btrfs_zone_finish_endio()
> it already has a pointer to the block group. Furthermore
> btrfs_zone_finish_endio() does additional checks if the block group can be
> finished or not.
> 
> But in the context of btrfs_zone_finish_endio_workfn() only the actual
> call to do_zone_finish() is of interest, as the skipping condition when
> there is still room to allocate from the block group cannot be checked.
> 
> Directly call do_zone_finish() on the block group.
> 
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>

Looks OK to me.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>


-- 
Damien Le Moal
Western Digital Research

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio()
  2025-07-22 11:39 ` [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
@ 2025-07-23  1:42   ` Damien Le Moal
  0 siblings, 0 replies; 6+ messages in thread
From: Damien Le Moal @ 2025-07-23  1:42 UTC (permalink / raw)
  To: Johannes Thumshirn, linux-btrfs
  Cc: David Sterba, Filipe Manana, Naohiro Aota, Josef Bacik,
	Johannes Thumshirn

On 7/22/25 8:39 PM, Johannes Thumshirn wrote:
> From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> 
> Now that btrfs_zone_finish_endio_workfn() is directly calling
> do_zone_finish() the only caller of btrfs_zone_finish_endio() is
> btrfs_finish_one_ordered().
> 
> btrfs_finish_one_ordered() already has error handling in-place so
> btrfs_zone_finish_endio() can return an error if the block group lookup
> fails.
> 
> Also as btrfs_zone_finish_endio() already checks for zoned filesystems and
> returns early, there's no need to do this in the caller.
> 
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>

Looks OK.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>

-- 
Damien Le Moal
Western Digital Research

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22 11:39 ` [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
  2025-07-23  1:40   ` Damien Le Moal
@ 2025-07-24 21:54   ` David Sterba
  1 sibling, 0 replies; 6+ messages in thread
From: David Sterba @ 2025-07-24 21:54 UTC (permalink / raw)
  To: Johannes Thumshirn
  Cc: linux-btrfs, David Sterba, Damien Le Moal, Filipe Manana,
	Naohiro Aota, Josef Bacik, Johannes Thumshirn

On Tue, Jul 22, 2025 at 01:39:10PM +0200, Johannes Thumshirn wrote:
> From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> 
> When btrfs_zone_finish_endio_workfn() is calling btrfs_zone_finish_endio()
> it already has a pointer to the block group. Furthermore
> btrfs_zone_finish_endio() does additional checks if the block group can be
> finished or not.
> 
> But in the context of btrfs_zone_finish_endio_workfn() only the actual
> call to do_zone_finish() is of interest, as the skipping condition when
> there is still room to allocate from the block group cannot be checked.
> 
> Directly call do_zone_finish() on the block group.
> 
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
>  fs/btrfs/zoned.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
> index 245e813ecd78..e997b236d00a 100644
> --- a/fs/btrfs/zoned.c
> +++ b/fs/btrfs/zoned.c
> @@ -2461,12 +2461,16 @@ void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 len
>  
>  static void btrfs_zone_finish_endio_workfn(struct work_struct *work)
>  {
> +	int ret;
>  	struct btrfs_block_group *bg =
>  		container_of(work, struct btrfs_block_group, zone_finish_work);
>  
>  	wait_on_extent_buffer_writeback(bg->last_eb);
>  	free_extent_buffer(bg->last_eb);
> -	btrfs_zone_finish_endio(bg->fs_info, bg->start, bg->length);
> +	ret = do_zone_finish(bg, true);
> +	if (ret)
> +		btrfs_handle_fs_error(bg->fs_info, ret,
> +				      "Failed to finish block-group's zone");

The btrfs_handle_fs_error() is odd and should not be used in new code.
Is there another way how you can signal a problem from the endio
callback?

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-07-24 21:54 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-22 11:39 [PATCH v3 0/2] btrfs: zoned: two small style improvements for zone finishing Johannes Thumshirn
2025-07-22 11:39 ` [PATCH v3 1/2] btrfs: zoned: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
2025-07-23  1:40   ` Damien Le Moal
2025-07-24 21:54   ` David Sterba
2025-07-22 11:39 ` [PATCH v3 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
2025-07-23  1:42   ` Damien Le Moal

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.