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