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