* [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.