Re: [PATCH] btrfs: zoned: reset meta_write_pointer on zone reset
"Naohiro Aota" <[email protected]>
| Newsgroups | org.kernel.vger.linux-btrfs,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On Fri Jul 3, 2026 at 2:54 PM JST, Johannes Thumshirn wrote: > btrfs_reset_unused_block_groups() resets a block group's zone and sets > alloc_offset back to 0 so the space can be reused, but it leaves > meta_write_pointer pointing at the previous end of the zone. > > Once the block group is reactivated and reused for metadata, newly > allocated tree blocks live before that stale write pointer. > btrfs_check_meta_write_pointer() then sees them behind the write pointer, > so they can never be written out in sequential order: the dirty extent > buffers are stranded and pin their btree_inode folios until unmount. > > Reset meta_write_pointer back to the start of the block group for > metadata and system block groups. Looks good to me, Reviewed-by: Naohiro Aota <[email protected]> > > Fixes: 453a73c3069a ("btrfs: zoned: reclaim unused zone by zone resetting") > Cc: [email protected] > Signed-off-by: Johannes Thumshirn <[email protected]> > --- > fs/btrfs/zoned.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c > index ab7c3cc52599..765655473263 100644 > --- a/fs/btrfs/zoned.c > +++ b/fs/btrfs/zoned.c > @@ -3218,6 +3218,17 @@ int btrfs_reset_unused_block_groups(struct btrfs_space_info *space_info, u64 num > reclaimed = bg->alloc_offset; > bg->zone_unusable = bg->length - bg->zone_capacity; > bg->alloc_offset = 0; > + /* > + * The zone was just reset to empty, so alloc_offset went back to > + * the start of the zone. For metadata/system block groups the > + * write pointer must follow it back to the start of the zone; > + * otherwise it stays stale at the previous (finished) zone end, > + * and metadata written into the reused zone would sit behind the > + * write pointer, could never be written out in sequential order, > + * and would be stranded (pinning its folio) until unmount. > + */ > + if (bg->flags & (BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_SYSTEM)) > + bg->meta_write_pointer = bg->start; > /* > * This holds because we currently reset fully used then freed > * block group.