From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Carlos Maiolino <cem@kernel.org>,
Hans Holmberg <hans.holmberg@wdc.com>,
linux-xfs@vger.kernel.org
Subject: Re: [PATCH 23/43] xfs: add support for zoned space reservations
Date: Fri, 7 Feb 2025 09:52:31 -0800 [thread overview]
Message-ID: <20250207175231.GA21808@frogsfrogsfrogs> (raw)
In-Reply-To: <20250206064511.2323878-24-hch@lst.de>
On Thu, Feb 06, 2025 at 07:44:39AM +0100, Christoph Hellwig wrote:
> For zoned file systems garbage collection (GC) has to take the iolock
> and mmaplock after moving data to a new place to synchronize with
> readers. This means waiting for garbage collection with the iolock can
> deadlock.
>
> To avoid this, the worst case required blocks have to be reserved before
> taking the iolock, which is done using a new RTAVAILABLE counter that
> tracks blocks that are free to write into and don't require garbage
Wasn't that in the last patch? Should this sentence move there?
> collection. The new helpers try to take these available blocks, and
> if there aren't enough available it wakes and waits for GC. This is
> done using a list of on-stack reservations to ensure fairness.
>
> Co-developed-by: Hans Holmberg <hans.holmberg@wdc.com>
> Signed-off-by: Hans Holmberg <hans.holmberg@wdc.com>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/xfs/Makefile | 3 +-
> fs/xfs/libxfs/xfs_bmap.c | 15 ++-
> fs/xfs/xfs_mount.c | 35 ++---
> fs/xfs/xfs_zone_alloc.h | 27 ++++
> fs/xfs/xfs_zone_priv.h | 2 +
> fs/xfs/xfs_zone_space_resv.c | 244 +++++++++++++++++++++++++++++++++++
> 6 files changed, 306 insertions(+), 20 deletions(-)
> create mode 100644 fs/xfs/xfs_zone_space_resv.c
>
> diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile
> index 28bd2627e9ef..bdedf4bdb1db 100644
> --- a/fs/xfs/Makefile
> +++ b/fs/xfs/Makefile
> @@ -138,7 +138,8 @@ xfs-$(CONFIG_XFS_QUOTA) += xfs_dquot.o \
>
> # xfs_rtbitmap is shared with libxfs
> xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o \
> - xfs_zone_alloc.o
> + xfs_zone_alloc.o \
> + xfs_zone_space_resv.o
>
> xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o
> xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 522c126e52fb..63255820b58a 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -40,6 +40,7 @@
> #include "xfs_symlink_remote.h"
> #include "xfs_inode_util.h"
> #include "xfs_rtgroup.h"
> +#include "xfs_zone_alloc.h"
>
> struct kmem_cache *xfs_bmap_intent_cache;
>
> @@ -4788,12 +4789,18 @@ xfs_bmap_del_extent_delay(
> da_diff = da_old - da_new;
> fdblocks = da_diff;
>
> - if (bflags & XFS_BMAPI_REMAP)
> + if (bflags & XFS_BMAPI_REMAP) {
> ;
> - else if (isrt)
> - xfs_add_frextents(mp, xfs_blen_to_rtbxlen(mp, del->br_blockcount));
> - else
> + } else if (isrt) {
> + xfs_rtbxlen_t rtxlen;
> +
> + rtxlen = xfs_blen_to_rtbxlen(mp, del->br_blockcount);
> + if (xfs_is_zoned_inode(ip))
> + xfs_zoned_add_available(mp, rtxlen);
> + xfs_add_frextents(mp, rtxlen);
> + } else {
> fdblocks += del->br_blockcount;
> + }
>
> xfs_add_fdblocks(mp, fdblocks);
> xfs_mod_delalloc(ip, -(int64_t)del->br_blockcount, -da_diff);
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 06e34c43cc94..2b8b392a7336 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -476,22 +476,27 @@ xfs_default_resblks(
> struct xfs_mount *mp,
> enum xfs_free_counter ctr)
> {
> - uint64_t resblks;
> -
> - if (ctr == XC_FREE_RTEXTENTS)
> + switch (ctr) {
> + case XC_FREE_BLOCKS:
> + /*
> + * Default to 5% or 8192 FSBs of space reserved, whichever is
> + * smaller.
> + *
> + * This is intended to cover concurrent allocation transactions
> + * when we initially hit ENOSPC. These each require a 4 block
> + * reservation. Hence by default we cover roughly 2000
> + * concurrent allocation reservations.
> + */
> + return min(div_u64(mp->m_sb.sb_dblocks, 20), 8192ULL);
> + case XC_FREE_RTEXTENTS:
> + case XC_FREE_RTAVAILABLE:
> + if (IS_ENABLED(CONFIG_XFS_RT) && xfs_has_zoned(mp))
> + return xfs_zoned_default_resblks(mp, ctr);
> return 0;
> -
> - /*
> - * We default to 5% or 8192 fsbs of space reserved, whichever is
> - * smaller. This is intended to cover concurrent allocation
> - * transactions when we initially hit enospc. These each require a 4
> - * block reservation. Hence by default we cover roughly 2000 concurrent
> - * allocation reservations.
> - */
> - resblks = mp->m_sb.sb_dblocks;
> - do_div(resblks, 20);
> - resblks = min_t(uint64_t, resblks, 8192);
> - return resblks;
> + default:
> + ASSERT(0);
> + return 0;
> + }
> }
>
> /* Ensure the summary counts are correct. */
> diff --git a/fs/xfs/xfs_zone_alloc.h b/fs/xfs/xfs_zone_alloc.h
> index 78cd7bfc6ac8..28c9cffb72d5 100644
> --- a/fs/xfs/xfs_zone_alloc.h
> +++ b/fs/xfs/xfs_zone_alloc.h
> @@ -5,6 +5,30 @@
> struct iomap_ioend;
> struct xfs_open_zone;
>
> +struct xfs_zone_alloc_ctx {
> + struct xfs_open_zone *open_zone;
> + xfs_filblks_t reserved_blocks;
> +};
> +
> +/*
> + * Grab any available space, even if it is less than what the caller asked for.
> + */
> +#define XFS_ZR_GREEDY (1U << 0)
> +/*
> + * Only grab instantly available space, don't wait or GC.
> + */
> +#define XFS_ZR_NOWAIT (1U << 1)
> +/*
> + * Dip into the reserved pool.
> + */
> +#define XFS_ZR_RESERVED (1U << 2)
> +
> +int xfs_zoned_space_reserve(struct xfs_inode *ip, xfs_filblks_t count_fsb,
> + unsigned int flags, struct xfs_zone_alloc_ctx *ac);
> +void xfs_zoned_space_unreserve(struct xfs_inode *ip,
> + struct xfs_zone_alloc_ctx *ac);
> +void xfs_zoned_add_available(struct xfs_mount *mp, xfs_filblks_t count_fsb);
> +
> void xfs_zone_alloc_and_submit(struct iomap_ioend *ioend,
> struct xfs_open_zone **oz);
> int xfs_zone_free_blocks(struct xfs_trans *tp, struct xfs_rtgroup *rtg,
> @@ -18,6 +42,9 @@ void xfs_zoned_wake_all(struct xfs_mount *mp);
> bool xfs_zone_rgbno_is_valid(struct xfs_rtgroup *rtg, xfs_rgnumber_t rgbno);
> void xfs_mark_rtg_boundary(struct iomap_ioend *ioend);
>
> +uint64_t xfs_zoned_default_resblks(struct xfs_mount *mp,
> + enum xfs_free_counter ctr);
> +
> #ifdef CONFIG_XFS_RT
> int xfs_mount_zones(struct xfs_mount *mp);
> void xfs_unmount_zones(struct xfs_mount *mp);
> diff --git a/fs/xfs/xfs_zone_priv.h b/fs/xfs/xfs_zone_priv.h
> index 23d2fd6088ae..5283d77482d4 100644
> --- a/fs/xfs/xfs_zone_priv.h
> +++ b/fs/xfs/xfs_zone_priv.h
> @@ -86,4 +86,6 @@ struct xfs_zone_info {
>
> struct xfs_open_zone *xfs_open_zone(struct xfs_mount *mp, bool is_gc);
>
> +void xfs_zoned_resv_wake_all(struct xfs_mount *mp);
> +
> #endif /* _XFS_ZONE_PRIV_H */
> diff --git a/fs/xfs/xfs_zone_space_resv.c b/fs/xfs/xfs_zone_space_resv.c
> new file mode 100644
> index 000000000000..eff9be026425
> --- /dev/null
> +++ b/fs/xfs/xfs_zone_space_resv.c
> @@ -0,0 +1,244 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2023-2025 Christoph Hellwig.
> + * Copyright (c) 2024-2025, Western Digital Corporation or its affiliates.
> + */
> +#include "xfs.h"
> +#include "xfs_shared.h"
> +#include "xfs_format.h"
> +#include "xfs_trans_resv.h"
> +#include "xfs_mount.h"
> +#include "xfs_inode.h"
> +#include "xfs_rtbitmap.h"
> +#include "xfs_zone_alloc.h"
> +#include "xfs_zone_priv.h"
> +#include "xfs_zones.h"
> +
> +/*
> + * Note: the zoned allocator does not support a rtextsize > 1, so this code and
> + * the allocator itself uses file system blocks interchangeable with realtime
> + * extents without doing the otherwise required conversions.
> + */
> +
> +/*
> + * Per-task space reservation.
> + *
> + * Tasks that need to wait for GC to free up space allocate one of these
> + * on-stack and adds it to the per-mount zi_reclaim_reservations lists.
> + * The GC thread will then wake the tasks in order when space becomes available.
> + */
> +struct xfs_zone_reservation {
> + struct list_head entry;
> + struct task_struct *task;
> + xfs_filblks_t count_fsb;
> +};
> +
> +/*
> + * Calculate the number of reserved blocks.
> + *
> + * XC_FREE_RTEXTENTS counts the user available capacity, to which the file
> + * system can be filled, while XC_FREE_RTAVAILABLE counts the blocks instantly
> + * available for writes without waiting for GC.
> + *
> + * For XC_FREE_RTAVAILABLE only the smaller reservation required for GC and
> + * block zeroing is excluded from the user capacity, while XC_FREE_RTEXTENTS
> + * is further restricted by at least one zone as well as the optional
> + * persistently reserved blocks. This allows the allocator to run more
> + * smoothly by not always triggering GC.
> + */
> +uint64_t
> +xfs_zoned_default_resblks(
> + struct xfs_mount *mp,
> + enum xfs_free_counter ctr)
> +{
> + switch (ctr) {
> + case XC_FREE_RTEXTENTS:
> + return (uint64_t)XFS_RESERVED_ZONES *
> + mp->m_groups[XG_TYPE_RTG].blocks +
> + mp->m_sb.sb_rtreserved;
> + case XC_FREE_RTAVAILABLE:
> + return (uint64_t)XFS_GC_ZONES *
> + mp->m_groups[XG_TYPE_RTG].blocks;
> + default:
> + ASSERT(0);
> + return 0;
> + }
> +}
> +
> +void
> +xfs_zoned_resv_wake_all(
> + struct xfs_mount *mp)
> +{
> + struct xfs_zone_info *zi = mp->m_zone_info;
> + struct xfs_zone_reservation *reservation;
> +
> + spin_lock(&zi->zi_reservation_lock);
> + list_for_each_entry(reservation, &zi->zi_reclaim_reservations, entry)
> + wake_up_process(reservation->task);
> + spin_unlock(&zi->zi_reservation_lock);
> +}
> +
> +void
> +xfs_zoned_add_available(
> + struct xfs_mount *mp,
> + xfs_filblks_t count_fsb)
> +{
> + struct xfs_zone_info *zi = mp->m_zone_info;
> + struct xfs_zone_reservation *reservation;
> +
> + if (list_empty_careful(&zi->zi_reclaim_reservations)) {
> + xfs_add_freecounter(mp, XC_FREE_RTAVAILABLE, count_fsb);
> + return;
> + }
> +
> + spin_lock(&zi->zi_reservation_lock);
> + xfs_add_freecounter(mp, XC_FREE_RTAVAILABLE, count_fsb);
> + count_fsb = xfs_sum_freecounter(mp, XC_FREE_RTAVAILABLE);
> + list_for_each_entry(reservation, &zi->zi_reclaim_reservations, entry) {
> + if (reservation->count_fsb > count_fsb)
> + break;
> + wake_up_process(reservation->task);
> + count_fsb -= reservation->count_fsb;
> +
> + }
> + spin_unlock(&zi->zi_reservation_lock);
> +}
> +
> +static int
> +xfs_zoned_space_wait_error(
> + struct xfs_mount *mp)
> +{
> + if (xfs_is_shutdown(mp))
> + return -EIO;
> + if (fatal_signal_pending(current))
> + return -EINTR;
> + return 0;
> +}
> +
> +static int
> +xfs_zoned_reserve_available(
> + struct xfs_inode *ip,
> + xfs_filblks_t count_fsb,
> + unsigned int flags)
> +{
> + struct xfs_mount *mp = ip->i_mount;
> + struct xfs_zone_info *zi = mp->m_zone_info;
> + struct xfs_zone_reservation reservation = {
> + .task = current,
> + .count_fsb = count_fsb,
> + };
> + int error;
> +
> + /*
> + * If there are no waiters, try to directly grab the available blocks
> + * from the percpu counter.
> + *
> + * If the caller wants to dip into the reserved pool also bypass the
> + * wait list. This relies on the fact that we have a very graciously
> + * sized reserved pool that always has enough space. If the reserved
> + * allocations fail we're in trouble.
> + */
> + if (likely(list_empty_careful(&zi->zi_reclaim_reservations) ||
> + (flags & XFS_ZR_RESERVED))) {
> + error = xfs_dec_freecounter(mp, XC_FREE_RTAVAILABLE, count_fsb,
> + flags & XFS_ZR_RESERVED);
> + if (error != -ENOSPC)
> + return error;
> + }
> +
> + if (flags & XFS_ZR_NOWAIT)
> + return -EAGAIN;
> +
> + spin_lock(&zi->zi_reservation_lock);
> + list_add_tail(&reservation.entry, &zi->zi_reclaim_reservations);
I think you're supposed to have initialized reservation.entry already.
> + while ((error = xfs_zoned_space_wait_error(mp)) == 0) {
> + set_current_state(TASK_KILLABLE);
> +
> + error = xfs_dec_freecounter(mp, XC_FREE_RTAVAILABLE, count_fsb,
> + flags & XFS_ZR_RESERVED);
> + if (error != -ENOSPC)
> + break;
> +
> + spin_unlock(&zi->zi_reservation_lock);
> + schedule();
> + spin_lock(&zi->zi_reservation_lock);
> + }
> + list_del(&reservation.entry);
> + spin_unlock(&zi->zi_reservation_lock);
> +
> + __set_current_state(TASK_RUNNING);
> + return error;
> +}
> +
> +/*
> + * Implement greedy space allocation for short writes by trying to grab all
> + * that is left after locking out other threads from trying to do the same.
> + *
> + * This isn't exactly optimal and can hopefully be replaced by a proper
> + * percpu_counter primitive one day.
> + */
> +static int
> +xfs_zoned_reserve_extents_greedy(
> + struct xfs_inode *ip,
> + xfs_filblks_t *count_fsb,
> + unsigned int flags)
> +{
> + struct xfs_mount *mp = ip->i_mount;
> + struct xfs_zone_info *zi = mp->m_zone_info;
> + s64 len = *count_fsb;
> + int error = -ENOSPC;
> +
> + spin_lock(&zi->zi_reservation_lock);
> + len = min(len, xfs_sum_freecounter(mp, XC_FREE_RTEXTENTS));
> + if (len > 0) {
> + *count_fsb = len;
> + error = xfs_dec_freecounter(mp, XC_FREE_RTEXTENTS, *count_fsb,
> + flags & XFS_ZR_RESERVED);
> + }
> + spin_unlock(&zi->zi_reservation_lock);
> + return error;
> +}
> +
> +int
> +xfs_zoned_space_reserve(
> + struct xfs_inode *ip,
> + xfs_filblks_t count_fsb,
> + unsigned int flags,
> + struct xfs_zone_alloc_ctx *ac)
> +{
> + struct xfs_mount *mp = ip->i_mount;
> + int error;
> +
> + ASSERT(ac->reserved_blocks == 0);
> + ASSERT(ac->open_zone == NULL);
> +
> + error = xfs_dec_freecounter(mp, XC_FREE_RTEXTENTS, count_fsb,
> + flags & XFS_ZR_RESERVED);
> + if (error == -ENOSPC && (flags & XFS_ZR_GREEDY) && count_fsb > 1)
> + error = xfs_zoned_reserve_extents_greedy(ip, &count_fsb, flags);
Overly long line.
--D
> + if (error)
> + return error;
> +
> + error = xfs_zoned_reserve_available(ip, count_fsb, flags);
> + if (error) {
> + xfs_add_freecounter(mp, XC_FREE_RTEXTENTS, count_fsb);
> + return error;
> + }
> + ac->reserved_blocks = count_fsb;
> + return 0;
> +}
> +
> +void
> +xfs_zoned_space_unreserve(
> + struct xfs_inode *ip,
> + struct xfs_zone_alloc_ctx *ac)
> +{
> + if (ac->reserved_blocks > 0) {
> + struct xfs_mount *mp = ip->i_mount;
> +
> + xfs_zoned_add_available(mp, ac->reserved_blocks);
> + xfs_add_freecounter(mp, XC_FREE_RTEXTENTS, ac->reserved_blocks);
> + }
> + if (ac->open_zone)
> + xfs_open_zone_put(ac->open_zone);
> +}
> --
> 2.45.2
>
>
next prev parent reply other threads:[~2025-02-07 17:52 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-06 6:44 support for zoned devices RFCv2 Christoph Hellwig
2025-02-06 6:44 ` [PATCH 01/43] xfs: factor out a xfs_rt_check_size helper Christoph Hellwig
2025-02-06 6:44 ` [PATCH 02/43] xfs: add a rtg_blocks helper Christoph Hellwig
2025-02-06 6:44 ` [PATCH 03/43] xfs: move xfs_bmapi_reserve_delalloc to xfs_iomap.c Christoph Hellwig
2025-02-06 6:44 ` [PATCH 04/43] xfs: skip always_cow inodes in xfs_reflink_trim_around_shared Christoph Hellwig
2025-02-06 20:13 ` Darrick J. Wong
2025-02-07 4:15 ` Christoph Hellwig
2025-02-07 4:22 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 05/43] xfs: refine the unaligned check for always COW inodes in xfs_file_dio_write Christoph Hellwig
2025-02-06 6:44 ` [PATCH 06/43] xfs: generalize the freespace and reserved blocks handling Christoph Hellwig
2025-02-06 21:29 ` Darrick J. Wong
2025-02-07 4:21 ` Christoph Hellwig
2025-02-07 4:28 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 07/43] xfs: preserve RT reservations across remounts Christoph Hellwig
2025-02-06 20:14 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 08/43] xfs: reflow xfs_dec_freecounter Christoph Hellwig
2025-02-06 20:14 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 09/43] xfs: trace in-memory freecounters Christoph Hellwig
2025-02-06 20:15 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 10/43] xfs: make metabtree reservations global Christoph Hellwig
2025-02-06 20:50 ` Darrick J. Wong
2025-02-07 4:18 ` Christoph Hellwig
2025-02-07 4:24 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 11/43] xfs: reduce metafile reservations Christoph Hellwig
2025-02-06 20:52 ` Darrick J. Wong
2025-02-07 4:19 ` Christoph Hellwig
2025-02-07 4:26 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 12/43] xfs: support XFS_BMAPI_REMAP in xfs_bmap_del_extent_delay Christoph Hellwig
2025-02-06 20:54 ` Darrick J. Wong
2025-02-07 4:19 ` Christoph Hellwig
2025-02-06 6:44 ` [PATCH 13/43] xfs: add a xfs_rtrmap_highest_rgbno helper Christoph Hellwig
2025-02-06 20:55 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 14/43] xfs: define the zoned on-disk format Christoph Hellwig
2025-02-06 21:00 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 15/43] xfs: allow internal RT devices for zoned mode Christoph Hellwig
2025-02-06 6:44 ` [PATCH 16/43] xfs: export zoned geometry via XFS_FSOP_GEOM Christoph Hellwig
2025-02-06 21:03 ` Darrick J. Wong
2025-02-07 4:20 ` Christoph Hellwig
2025-02-06 6:44 ` [PATCH 17/43] xfs: disable sb_frextents for zoned file systems Christoph Hellwig
2025-02-06 6:44 ` [PATCH 18/43] xfs: disable FITRIM for zoned RT devices Christoph Hellwig
2025-02-06 6:44 ` [PATCH 19/43] xfs: don't call xfs_can_free_eofblocks from ->release for zoned inodes Christoph Hellwig
2025-02-06 6:44 ` [PATCH 20/43] xfs: skip zoned RT inodes in xfs_inodegc_want_queue_rt_file Christoph Hellwig
2025-02-06 21:04 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 21/43] xfs: parse and validate hardware zone information Christoph Hellwig
2025-02-06 21:05 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 22/43] xfs: add the zoned space allocator Christoph Hellwig
2025-02-07 17:39 ` Darrick J. Wong
2025-02-13 5:14 ` Christoph Hellwig
2025-02-13 8:35 ` Christoph Hellwig
2025-02-17 9:20 ` Christoph Hellwig
2025-02-13 22:08 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 23/43] xfs: add support for zoned space reservations Christoph Hellwig
2025-02-07 17:52 ` Darrick J. Wong [this message]
2025-02-13 5:17 ` Christoph Hellwig
2025-02-13 22:09 ` Darrick J. Wong
2025-02-14 6:20 ` Christoph Hellwig
2025-02-14 18:25 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 24/43] xfs: implement zoned garbage collection Christoph Hellwig
2025-02-07 18:33 ` Darrick J. Wong
2025-02-13 5:22 ` Christoph Hellwig
2025-02-13 22:10 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 25/43] xfs: implement buffered writes to zoned RT devices Christoph Hellwig
2025-02-12 0:54 ` Darrick J. Wong
2025-02-13 5:39 ` Christoph Hellwig
2025-02-13 23:05 ` Darrick J. Wong
2025-02-14 6:22 ` Christoph Hellwig
2025-02-14 18:29 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 26/43] xfs: implement direct " Christoph Hellwig
2025-02-06 6:44 ` [PATCH 27/43] xfs: wire up zoned block freeing in xfs_rtextent_free_finish_item Christoph Hellwig
2025-02-06 6:44 ` [PATCH 28/43] xfs: hide reserved RT blocks from statfs Christoph Hellwig
2025-02-07 4:32 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 29/43] xfs: support growfs on zoned file systems Christoph Hellwig
2025-02-06 6:44 ` [PATCH 30/43] xfs: allow COW forks on zoned file systems in xchk_bmap Christoph Hellwig
2025-02-06 6:44 ` [PATCH 31/43] xfs: support xchk_xref_is_used_rt_space on zoned file systems Christoph Hellwig
2025-02-06 6:44 ` [PATCH 32/43] xfs: support xrep_require_rtext_inuse " Christoph Hellwig
2025-02-06 6:44 ` [PATCH 33/43] xfs: enable fsmap reporting for internal RT devices Christoph Hellwig
2025-02-07 4:39 ` Darrick J. Wong
2025-02-07 4:55 ` Christoph Hellwig
2025-02-06 6:44 ` [PATCH 34/43] xfs: disable reflink for zoned file systems Christoph Hellwig
2025-02-07 4:31 ` Darrick J. Wong
2025-02-07 4:54 ` Christoph Hellwig
2025-02-07 5:05 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 35/43] xfs: disable rt quotas " Christoph Hellwig
2025-02-07 4:31 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 36/43] xfs: enable the zoned RT device feature Christoph Hellwig
2025-02-06 6:44 ` [PATCH 37/43] xfs: support zone gaps Christoph Hellwig
2025-02-06 6:44 ` [PATCH 38/43] xfs: add a max_open_zones mount option Christoph Hellwig
2025-02-07 4:29 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 39/43] xfs: support write life time based data placement Christoph Hellwig
2025-02-12 0:27 ` Darrick J. Wong
2025-02-12 13:29 ` Hans Holmberg
2025-02-13 4:42 ` Darrick J. Wong
2025-02-13 13:03 ` Hans Holmberg
2025-02-14 6:41 ` hch
2025-02-14 12:20 ` Hans Holmberg
2025-02-14 16:21 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 40/43] xfs: wire up the show_stats super operation Christoph Hellwig
2025-02-06 6:44 ` [PATCH 41/43] xfs: export zone stats in /proc/*/mountstats Christoph Hellwig
2025-02-07 1:02 ` Darrick J. Wong
2025-02-07 4:25 ` Christoph Hellwig
2025-02-06 6:44 ` [PATCH 42/43] xfs: contain more sysfs code in xfs_sysfs.c Christoph Hellwig
2025-02-07 0:54 ` Darrick J. Wong
2025-02-06 6:44 ` [PATCH 43/43] xfs: export max_open_zones in sysfs Christoph Hellwig
2025-02-07 0:52 ` Darrick J. Wong
2025-02-07 4:23 ` Christoph Hellwig
2025-02-07 4:27 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250207175231.GA21808@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=cem@kernel.org \
--cc=hans.holmberg@wdc.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.