All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] btrfs: zoned: two small style improvements for zone finishing
@ 2025-07-22  9:39 Johannes Thumshirn
  2025-07-22  9:39 ` [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
  2025-07-22  9:39 ` [PATCH v2 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
  0 siblings, 2 replies; 5+ messages in thread
From: Johannes Thumshirn @ 2025-07-22  9: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 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 | 12 ++++++++----
 fs/btrfs/zoned.h |  9 ++++++---
 3 files changed, 18 insertions(+), 10 deletions(-)

-- 
2.50.1


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

* [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22  9:39 [PATCH v2 0/2] btrfs: zoned: two small style improvements for zone finishing Johannes Thumshirn
@ 2025-07-22  9:39 ` Johannes Thumshirn
  2025-07-22  9:42   ` Damien Le Moal
  2025-07-22  9:39 ` [PATCH v2 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio() Johannes Thumshirn
  1 sibling, 1 reply; 5+ messages in thread
From: Johannes Thumshirn @ 2025-07-22  9: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 | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 245e813ecd78..5a234f31c8da 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -2461,12 +2461,14 @@ 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);
+	ASSERT(!ret);
 	btrfs_put_block_group(bg);
 }
 
-- 
2.50.1


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

* [PATCH v2 2/2] btrfs: zoned: return error from btrfs_zone_finish_endio()
  2025-07-22  9:39 [PATCH v2 0/2] btrfs: zoned: two small style improvements for zone finishing Johannes Thumshirn
  2025-07-22  9:39 ` [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
@ 2025-07-22  9:39 ` Johannes Thumshirn
  1 sibling, 0 replies; 5+ messages in thread
From: Johannes Thumshirn @ 2025-07-22  9: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. For developer
builds leave the ASSERT() in place to check for a block-group lookup
failure.

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 5a234f31c8da..0e61e49b8ce9 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] 5+ messages in thread

* Re: [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22  9:39 ` [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn() Johannes Thumshirn
@ 2025-07-22  9:42   ` Damien Le Moal
  2025-07-22 10:21     ` Johannes Thumshirn
  0 siblings, 1 reply; 5+ messages in thread
From: Damien Le Moal @ 2025-07-22  9:42 UTC (permalink / raw)
  To: Johannes Thumshirn, linux-btrfs
  Cc: David Sterba, Filipe Manana, Naohiro Aota, Josef Bacik,
	Johannes Thumshirn

On 7/22/25 6: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>
> ---
>  fs/btrfs/zoned.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
> index 245e813ecd78..5a234f31c8da 100644
> --- a/fs/btrfs/zoned.c
> +++ b/fs/btrfs/zoned.c
> @@ -2461,12 +2461,14 @@ 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);
> +	ASSERT(!ret);

Why the assert ? Zone finish command may fail if for instance there is a
PHY/link issue. I would rather have something clean here like goig to read-only
rather than this assert == ignoring the error if not in debug mode. No ?

>  	btrfs_put_block_group(bg);
>  }
>  


-- 
Damien Le Moal
Western Digital Research

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

* Re: [PATCH v2 1/2] btrfs: directly call do_zone_finish() from btrfs_zone_finish_endio_workfn()
  2025-07-22  9:42   ` Damien Le Moal
@ 2025-07-22 10:21     ` Johannes Thumshirn
  0 siblings, 0 replies; 5+ messages in thread
From: Johannes Thumshirn @ 2025-07-22 10:21 UTC (permalink / raw)
  To: Damien Le Moal, Johannes Thumshirn, linux-btrfs@vger.kernel.org
  Cc: David Sterba, Filipe Manana, Naohiro Aota, Josef Bacik

On 22.07.25 11:44, Damien Le Moal wrote:
> On 7/22/25 6: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>
>> ---
>>   fs/btrfs/zoned.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
>> index 245e813ecd78..5a234f31c8da 100644
>> --- a/fs/btrfs/zoned.c
>> +++ b/fs/btrfs/zoned.c
>> @@ -2461,12 +2461,14 @@ 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);
>> +	ASSERT(!ret);
> 
> Why the assert ? Zone finish command may fail if for instance there is a
> PHY/link issue. I would rather have something clean here like goig to read-only
> rather than this assert == ignoring the error if not in debug mode. No ?

Something like this:

diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 0e61e49b8ce9..279446e98516 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -2470,7 +2470,9 @@ static void btrfs_zone_finish_endio_workfn(struct work_struct *work)
         wait_on_extent_buffer_writeback(bg->last_eb);
         free_extent_buffer(bg->last_eb);
         ret = do_zone_finish(bg, true);
-       ASSERT(!ret);
+       if (ret)
+               btrfs_handle_fs_error(bg->fs_info, ret,
+                                     "Failed to finish block-group's zone");
         btrfs_put_block_group(bg);
  }

btrfs_handle_fs_error() will set the FS to read-only internally.

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

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

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

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.