From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Andrey Albershteyn <aalbersh@kernel.org>,
Hans Holmberg <hans.holmberg@wdc.com>,
linux-xfs@vger.kernel.org
Subject: Re: [PATCH 30/45] xfs_mkfs: support creating zoned file systems
Date: Wed, 9 Apr 2025 11:54:49 -0700 [thread overview]
Message-ID: <20250409185449.GF6283@frogsfrogsfrogs> (raw)
In-Reply-To: <20250409075557.3535745-31-hch@lst.de>
On Wed, Apr 09, 2025 at 09:55:33AM +0200, Christoph Hellwig wrote:
> Default to use all sequential write required zoned for the RT device.
>
> Default to 256 and 1% conventional when -r zoned is specified without
> further option. This mimics a SMR HDD and works well with tests.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> libxfs/init.c | 2 +-
> mkfs/proto.c | 3 +-
> mkfs/xfs_mkfs.c | 553 ++++++++++++++++++++++++++++++++++++++++++----
> repair/agheader.c | 2 +-
> 4 files changed, 518 insertions(+), 42 deletions(-)
>
> diff --git a/libxfs/init.c b/libxfs/init.c
> index a186369f3fd8..393a94673f7e 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -251,7 +251,7 @@ libxfs_close_devices(
> libxfs_device_close(&li->data);
> if (li->log.dev && li->log.dev != li->data.dev)
> libxfs_device_close(&li->log);
> - if (li->rt.dev)
> + if (li->rt.dev && li->rt.dev != li->data.dev)
> libxfs_device_close(&li->rt);
> }
>
> diff --git a/mkfs/proto.c b/mkfs/proto.c
> index 7f56a3d82a06..7f80bef838be 100644
> --- a/mkfs/proto.c
> +++ b/mkfs/proto.c
> @@ -1144,7 +1144,8 @@ rtinit_groups(
> fail(_("rtrmap rtsb init failed"), error);
> }
>
> - rtfreesp_init(rtg);
> + if (!xfs_has_zoned(mp))
> + rtfreesp_init(rtg);
> }
> }
>
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 39e3349205fb..133ede8d8483 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -6,6 +6,8 @@
> #include "libfrog/util.h"
> #include "libxfs.h"
> #include <ctype.h>
> +#include <linux/blkzoned.h>
> +#include "libxfs/xfs_zones.h"
> #include "xfs_multidisk.h"
> #include "libxcmd.h"
> #include "libfrog/fsgeom.h"
> @@ -135,6 +137,9 @@ enum {
> R_RGCOUNT,
> R_RGSIZE,
> R_CONCURRENCY,
> + R_ZONED,
> + R_START,
> + R_RESERVED,
> R_MAX_OPTS,
> };
>
> @@ -739,6 +744,9 @@ static struct opt_params ropts = {
> [R_RGCOUNT] = "rgcount",
> [R_RGSIZE] = "rgsize",
> [R_CONCURRENCY] = "concurrency",
> + [R_ZONED] = "zoned",
> + [R_START] = "start",
> + [R_RESERVED] = "reserved",
> [R_MAX_OPTS] = NULL,
> },
> .subopt_params = {
> @@ -804,6 +812,28 @@ static struct opt_params ropts = {
> .maxval = INT_MAX,
> .defaultval = 1,
> },
> + { .index = R_ZONED,
> + .conflicts = { { &ropts, R_EXTSIZE },
> + { NULL, LAST_CONFLICT } },
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> + },
> + { .index = R_START,
> + .conflicts = { { &ropts, R_DEV },
> + { NULL, LAST_CONFLICT } },
> + .convert = true,
> + .minval = 0,
> + .maxval = LLONG_MAX,
> + .defaultval = SUBOPT_NEEDS_VAL,
> + },
> + { .index = R_RESERVED,
> + .conflicts = { { NULL, LAST_CONFLICT } },
> + .convert = true,
> + .minval = 0,
> + .maxval = LLONG_MAX,
> + .defaultval = SUBOPT_NEEDS_VAL,
> + },
> },
> };
>
> @@ -1012,6 +1042,8 @@ struct sb_feat_args {
> bool nortalign;
> bool nrext64;
> bool exchrange; /* XFS_SB_FEAT_INCOMPAT_EXCHRANGE */
> + bool zoned;
> + bool zone_gaps;
>
> uint16_t qflags;
> };
> @@ -1035,6 +1067,8 @@ struct cli_params {
> char *lsu;
> char *rtextsize;
> char *rtsize;
> + char *rtstart;
> + uint64_t rtreserved;
>
> /* parameters where 0 is a valid CLI value */
> int dsunit;
> @@ -1121,6 +1155,8 @@ struct mkfs_params {
> char *label;
>
> struct sb_feat_args sb_feat;
> + uint64_t rtstart;
> + uint64_t rtreserved;
> };
>
> /*
> @@ -1172,7 +1208,7 @@ usage( void )
> /* prototype file */ [-p fname]\n\
> /* quiet */ [-q]\n\
> /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx,rgcount=n,rgsize=n,\n\
> - concurrency=num]\n\
> + concurrency=num,zoned=0|1,start=n,reserved=n]\n\
> /* sectorsize */ [-s size=num]\n\
> /* version */ [-V]\n\
> devicename\n\
> @@ -1539,6 +1575,30 @@ discard_blocks(int fd, uint64_t nsectors, int quiet)
> printf("Done.\n");
> }
>
> +static void
> +reset_zones(struct mkfs_params *cfg, int fd, uint64_t start_sector,
> + uint64_t nsectors, int quiet)
> +{
> + struct blk_zone_range range = {
> + .sector = start_sector,
> + .nr_sectors = nsectors,
> + };
> +
> + if (!quiet) {
> + printf("Resetting zones...");
> + fflush(stdout);
> + }
> +
> + if (ioctl(fd, BLKRESETZONE, &range) < 0) {
> + if (!quiet)
> + printf(" FAILED\n");
Should we print /why/ the zone reset failed?
> + exit(1);
> + }
> +
> + if (!quiet)
> + printf("Done.\n");
> +}
> +
> static __attribute__((noreturn)) void
> illegal_option(
> const char *value,
> @@ -2144,6 +2204,15 @@ rtdev_opts_parser(
> case R_CONCURRENCY:
> set_rtvol_concurrency(opts, subopt, cli, value);
> break;
> + case R_ZONED:
> + cli->sb_feat.zoned = getnum(value, opts, subopt);
> + break;
> + case R_START:
> + cli->rtstart = getstr(value, opts, subopt);
> + break;
> + case R_RESERVED:
> + cli->rtreserved = getnum(value, opts, subopt);
> + break;
> default:
> return -EINVAL;
> }
> @@ -2445,7 +2514,208 @@ _("Version 1 logs do not support sector size %d\n"),
> _("log stripe unit specified, using v2 logs\n"));
> cli->sb_feat.log_version = 2;
> }
> +}
> +
> +struct zone_info {
> + /* number of zones, conventional or sequential */
> + unsigned int nr_zones;
> + /* number of conventional zones */
> + unsigned int nr_conv_zones;
> +
> + /* size of the address space for a zone, in 512b blocks */
> + xfs_daddr_t zone_size;
> + /* write capacity of a zone, in 512b blocks */
> + xfs_daddr_t zone_capacity;
> +};
>
> +struct zone_topology {
> + struct zone_info data;
> + struct zone_info rt;
> + struct zone_info log;
> +};
> +
> +/* random size that allows efficient processing */
> +#define ZONES_PER_IOCTL 16384
> +
> +static int report_zones(const char *name, struct zone_info *zi)
> +{
> + struct blk_zone_report *rep;
> + size_t rep_size;
> + struct stat st;
> + unsigned int i, n = 0;
> + uint64_t device_size;
> + uint64_t sector = 0;
> + bool found_seq = false;
> + int ret = 0;
> + int fd;
Nit: indenting
> +
> + fd = open(name, O_RDONLY);
> + if (fd < 0)
> + return -EIO;
> +
> + if (fstat(fd, &st) < 0) {
> + ret = -EIO;
> + goto out_close;
> + }
> + if (!S_ISBLK(st.st_mode))
^^^^^^ especially here
> + goto out_close;
> +
> + if (ioctl(fd, BLKGETSIZE64, &device_size)) {
> + ret = -EIO;
ret = errno; ? But then...
> + goto out_close;
> + }
...what's the point in returning errors if the caller never checks?
> + if (ioctl(fd, BLKGETZONESZ, &zi->zone_size) || !zi->zone_size)
> + goto out_close; /* not zoned */
> +
> + device_size /= 512; /* BLKGETSIZE64 reports a byte value */
BTOBB
> + zi->nr_zones = device_size / zi->zone_size;
> + zi->nr_conv_zones = 0;
> +
> + rep_size = sizeof(struct blk_zone_report) +
> + sizeof(struct blk_zone) * ZONES_PER_IOCTL;
> + rep = malloc(rep_size);
> + if (!rep) {
> + ret = -ENOMEM;
> + goto out_close;
> + }
> +
> + while (n < zi->nr_zones) {
> + struct blk_zone *zones = (struct blk_zone *)(rep + 1);
> +
> + memset(rep, 0, rep_size);
> + rep->sector = sector;
> + rep->nr_zones = ZONES_PER_IOCTL;
> +
> + ret = ioctl(fd, BLKREPORTZONE, rep);
> + if (ret) {
> + fprintf(stderr,
> +_("ioctl(BLKREPORTZONE) failed: %d!\n"), ret);
> + goto out_free;
> + }
> + if (!rep->nr_zones)
> + break;
> +
> + for (i = 0; i < rep->nr_zones; i++) {
> + if (n >= zi->nr_zones)
> + break;
> +
> + if (zones[i].len != zi->zone_size) {
> + fprintf(stderr,
> +_("Inconsistent zone size!\n"));
> + ret = -EIO;
> + goto out_free;
> + }
> +
> + switch (zones[i].type) {
> + case BLK_ZONE_TYPE_CONVENTIONAL:
> + /*
> + * We can only use the conventional space at the
> + * start of the device for metadata, so don't
> + * count later conventional zones. This is
> + * not an error because we can use them for data
> + * just fine.
> + */
> + if (!found_seq)
> + zi->nr_conv_zones++;
> + break;
> + case BLK_ZONE_TYPE_SEQWRITE_REQ:
> + found_seq = true;
> + break;
> + case BLK_ZONE_TYPE_SEQWRITE_PREF:
> + fprintf(stderr,
> +_("Sequential write preferred zones not supported.\n"));
> + ret = -EIO;
> + goto out_free;
> + default:
> + fprintf(stderr,
> +_("Unknown zone type (0x%x) found.\n"), zones[i].type);
> + ret = -EIO;
> + goto out_free;
> + }
> +
> + if (!n) {
> + zi->zone_capacity = zones[i].capacity;
> + if (zi->zone_capacity > zi->zone_size) {
> + fprintf(stderr,
> +_("Zone capacity larger than zone size!\n"));
> + ret = -EIO;
> + goto out_free;
> + }
> + } else if (zones[i].capacity != zi->zone_capacity) {
> + fprintf(stderr,
> +_("Inconsistent zone capacity!\n"));
> + ret = -EIO;
> + goto out_free;
> + }
> +
> + n++;
> + }
> + sector = zones[rep->nr_zones - 1].start +
> + zones[rep->nr_zones - 1].len;
> + }
> +
> +out_free:
> + free(rep);
> +out_close:
> + close(fd);
> + return ret;
> +}
> +
> +static void
> +validate_zoned(
> + struct mkfs_params *cfg,
> + struct cli_params *cli,
> + struct mkfs_default_params *dft,
> + struct zone_topology *zt)
> +{
> + if (!cli->xi->data.isfile) {
> + report_zones(cli->xi->data.name, &zt->data);
> + if (zt->data.nr_zones) {
> + if (!zt->data.nr_conv_zones) {
> + fprintf(stderr,
> +_("Data devices requires conventional zones.\n"));
> + usage();
> + }
> + if (zt->data.zone_capacity != zt->data.zone_size) {
> + fprintf(stderr,
> +_("Zone capacity equal to Zone size required for conventional zones.\n"));
> + usage();
> + }
> +
> + cli->sb_feat.zoned = true;
> + cfg->rtstart =
> + zt->data.nr_conv_zones * zt->data.zone_capacity;
> + }
> + }
> +
> + if (cli->xi->rt.name && !cli->xi->rt.isfile) {
> + report_zones(cli->xi->rt.name, &zt->rt);
> + if (zt->rt.nr_zones && !cli->sb_feat.zoned)
> + cli->sb_feat.zoned = true;
> + if (zt->rt.zone_size != zt->rt.zone_capacity)
> + cli->sb_feat.zone_gaps = true;
> + }
> +
> + if (cli->xi->log.name && !cli->xi->log.isfile) {
> + report_zones(cli->xi->log.name, &zt->log);
> + if (zt->log.nr_zones) {
> + fprintf(stderr,
> +_("Zoned devices not supported as log device!\n"));
Too bad, we really ought to be able to write logs to a zone device.
But that's not in scope here.
> + usage();
> + }
> + }
> +
> + if (cli->rtstart) {
> + if (cfg->rtstart) {
Er... why are we checking the variable that we set four lines down?
Is this supposed to be a check for external zoned rt devices?
> + fprintf(stderr,
> +_("rtstart override not allowed on zoned devices.\n"));
> + usage();
> + }
> + cfg->rtstart = getnum(cli->rtstart, &ropts, R_START) / 512;
> + }
> +
> + if (cli->rtreserved)
> + cfg->rtreserved = cli->rtreserved;
> }
>
> /*
> @@ -2670,7 +2940,37 @@ _("inode btree counters not supported without finobt support\n"));
> cli->sb_feat.inobtcnt = false;
> }
>
> - if (cli->xi->rt.name) {
> + if (cli->sb_feat.zoned) {
> + if (!cli->sb_feat.metadir) {
> + if (cli_opt_set(&mopts, M_METADIR)) {
> + fprintf(stderr,
> +_("zoned realtime device not supported without metadir support\n"));
> + usage();
> + }
> + cli->sb_feat.metadir = true;
> + }
> + if (cli->rtextsize) {
> + if (cli_opt_set(&ropts, R_EXTSIZE)) {
> + fprintf(stderr,
> +_("rt extent size not supported on realtime devices with zoned mode\n"));
> + usage();
> + }
> + cli->rtextsize = 0;
> + }
> + } else {
> + if (cli->rtstart) {
> + fprintf(stderr,
> +_("internal RT section only supported in zoned mode\n"));
> + usage();
> + }
> + if (cli->rtreserved) {
> + fprintf(stderr,
> +_("reserved RT blocks only supported in zoned mode\n"));
> + usage();
> + }
> + }
> +
> + if (cli->xi->rt.name || cfg->rtstart) {
> if (cli->rtextsize && cli->sb_feat.reflink) {
> if (cli_opt_set(&mopts, M_REFLINK)) {
> fprintf(stderr,
> @@ -2911,6 +3211,11 @@ validate_rtextsize(
> usage();
> }
> cfg->rtextblocks = 1;
> + } else if (cli->sb_feat.zoned) {
> + /*
> + * Zoned mode only supports a rtextsize of 1.
> + */
> + cfg->rtextblocks = 1;
> } else {
> /*
> * If realtime extsize has not been specified by the user,
> @@ -3315,7 +3620,8 @@ _("log stripe unit (%d bytes) is too large (maximum is 256KiB)\n"
> static void
> open_devices(
> struct mkfs_params *cfg,
> - struct libxfs_init *xi)
> + struct libxfs_init *xi,
> + struct zone_topology *zt)
> {
> uint64_t sector_mask;
>
> @@ -3330,6 +3636,34 @@ open_devices(
> usage();
> }
>
> + if (zt->data.nr_zones) {
> + zt->rt.zone_size = zt->data.zone_size;
> + zt->rt.zone_capacity = zt->data.zone_capacity;
> + zt->rt.nr_zones = zt->data.nr_zones - zt->data.nr_conv_zones;
> + } else if (cfg->sb_feat.zoned && !cfg->rtstart && !xi->rt.dev) {
> + /*
> + * By default reserve at 1% of the total capacity (rounded up to
> + * the next power of two) for metadata, but match the minimum we
> + * enforce elsewhere. This matches what SMR HDDs provide.
> + */
> + uint64_t rt_target_size = max((xi->data.size + 99) / 100,
> + BTOBB(300 * 1024 * 1024));
> +
> + cfg->rtstart = 1;
> + while (cfg->rtstart < rt_target_size)
> + cfg->rtstart <<= 1;
> + }
> +
> + if (cfg->rtstart) {
> + if (cfg->rtstart >= xi->data.size) {
> + fprintf(stderr,
> + _("device size %lld too small for zoned allocator\n"), xi->data.size);
> + usage();
> + }
> + xi->rt.size = xi->data.size - cfg->rtstart;
> + xi->data.size = cfg->rtstart;
> + }
> +
> /*
> * Ok, Linux only has a 1024-byte resolution on device _size_,
> * and the sizes below are in basic 512-byte blocks,
> @@ -3348,17 +3682,42 @@ open_devices(
>
> static void
> discard_devices(
> + struct mkfs_params *cfg,
> struct libxfs_init *xi,
> + struct zone_topology *zt,
> int quiet)
> {
> /*
> * This function has to be called after libxfs has been initialized.
> */
>
> - if (!xi->data.isfile)
> - discard_blocks(xi->data.fd, xi->data.size, quiet);
> - if (xi->rt.dev && !xi->rt.isfile)
> - discard_blocks(xi->rt.fd, xi->rt.size, quiet);
> + if (!xi->data.isfile) {
> + uint64_t nsectors = xi->data.size;
> +
> + if (cfg->rtstart && zt->data.nr_zones) {
> + /*
> + * Note that the zone reset here includes the LBA range
> + * for the data device.
> + *
> + * This is because doing a single zone reset all on the
> + * entire device (which the kernel automatically does
> + * for us for a full device range) is a lot faster than
> + * resetting each zone individually and resetting
> + * the conventional zones used for the data device is a
> + * no-op.
> + */
> + reset_zones(cfg, xi->data.fd, 0,
> + cfg->rtstart + xi->rt.size, quiet);
> + nsectors -= cfg->rtstart;
> + }
> + discard_blocks(xi->data.fd, nsectors, quiet);
> + }
> + if (xi->rt.dev && !xi->rt.isfile) {
> + if (zt->rt.nr_zones)
> + reset_zones(cfg, xi->rt.fd, 0, xi->rt.size, quiet);
> + else
> + discard_blocks(xi->rt.fd, xi->rt.size, quiet);
> + }
> if (xi->log.dev && xi->log.dev != xi->data.dev && !xi->log.isfile)
> discard_blocks(xi->log.fd, xi->log.size, quiet);
> }
> @@ -3477,11 +3836,12 @@ reported by the device (%u).\n"),
> static void
> validate_rtdev(
> struct mkfs_params *cfg,
> - struct cli_params *cli)
> + struct cli_params *cli,
> + struct zone_topology *zt)
> {
> struct libxfs_init *xi = cli->xi;
>
> - if (!xi->rt.dev) {
> + if (!xi->rt.dev && !cfg->rtstart) {
> if (cli->rtsize) {
> fprintf(stderr,
> _("size specified for non-existent rt subvolume\n"));
> @@ -3501,7 +3861,7 @@ _("size specified for non-existent rt subvolume\n"));
> if (cli->rtsize) {
> if (cfg->rtblocks > DTOBT(xi->rt.size, cfg->blocklog)) {
> fprintf(stderr,
> -_("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
> +_("size %s specified for rt subvolume is too large, maximum is %lld blocks\n"),
> cli->rtsize,
> (long long)DTOBT(xi->rt.size, cfg->blocklog));
> usage();
> @@ -3512,6 +3872,9 @@ _("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
> reported by the device (%u).\n"),
> cfg->sectorsize, xi->rt.bsize);
> }
> + } else if (zt->rt.nr_zones) {
> + cfg->rtblocks = DTOBT(zt->rt.nr_zones * zt->rt.zone_capacity,
> + cfg->blocklog);
> } else {
> /* grab volume size */
> cfg->rtblocks = DTOBT(xi->rt.size, cfg->blocklog);
> @@ -3950,6 +4313,42 @@ out:
> cfg->rgcount = howmany(cfg->rtblocks, cfg->rgsize);
> }
>
> +static void
> +validate_rtgroup_geometry(
> + struct mkfs_params *cfg)
> +{
> + if (cfg->rgsize > XFS_MAX_RGBLOCKS) {
> + fprintf(stderr,
> +_("realtime group size (%llu) must be less than the maximum (%u)\n"),
> + (unsigned long long)cfg->rgsize,
> + XFS_MAX_RGBLOCKS);
> + usage();
> + }
> +
> + if (cfg->rgsize % cfg->rtextblocks != 0) {
> + fprintf(stderr,
> +_("realtime group size (%llu) not a multiple of rt extent size (%llu)\n"),
> + (unsigned long long)cfg->rgsize,
> + (unsigned long long)cfg->rtextblocks);
> + usage();
> + }
> +
> + if (cfg->rgsize <= cfg->rtextblocks) {
> + fprintf(stderr,
> +_("realtime group size (%llu) must be at least two realtime extents\n"),
> + (unsigned long long)cfg->rgsize);
> + usage();
> + }
> +
> + if (cfg->rgcount > XFS_MAX_RGNUMBER) {
> + fprintf(stderr,
> +_("realtime group count (%llu) must be less than the maximum (%u)\n"),
> + (unsigned long long)cfg->rgcount,
> + XFS_MAX_RGNUMBER);
> + usage();
> + }
> +}
Hoisting this out probably should've been a separate patch.
<snip>
> diff --git a/repair/agheader.c b/repair/agheader.c
> index 5bb4e47e0c5b..048e6c3143b5 100644
> --- a/repair/agheader.c
> +++ b/repair/agheader.c
Should this be in a different patch?
--D
> @@ -486,7 +486,7 @@ secondary_sb_whack(
> * size is the size of data which is valid for this sb.
> */
> if (xfs_sb_version_haszoned(sb))
> - size = offsetofend(struct xfs_dsb, sb_rtstart);
> + size = offsetofend(struct xfs_dsb, sb_rtreserved);
> else if (xfs_sb_version_hasmetadir(sb))
> size = offsetofend(struct xfs_dsb, sb_pad);
> else if (xfs_sb_version_hasmetauuid(sb))
> --
> 2.47.2
>
>
next prev parent reply other threads:[~2025-04-09 18:54 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-09 7:55 xfsprogs support for zoned devices Christoph Hellwig
2025-04-09 7:55 ` [PATCH 01/45] xfs: generalize the freespace and reserved blocks handling Christoph Hellwig
2025-04-09 7:55 ` [PATCH 02/45] FIXUP: " Christoph Hellwig
2025-04-09 15:32 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 03/45] xfs: make metabtree reservations global Christoph Hellwig
2025-04-09 7:55 ` [PATCH 04/45] FIXUP: " Christoph Hellwig
2025-04-09 15:43 ` Darrick J. Wong
2025-04-10 6:00 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 05/45] xfs: reduce metafile reservations Christoph Hellwig
2025-04-09 7:55 ` [PATCH 06/45] xfs: add a rtg_blocks helper Christoph Hellwig
2025-04-09 7:55 ` [PATCH 07/45] xfs: move xfs_bmapi_reserve_delalloc to xfs_iomap.c Christoph Hellwig
2025-04-09 7:55 ` [PATCH 08/45] xfs: support XFS_BMAPI_REMAP in xfs_bmap_del_extent_delay Christoph Hellwig
2025-04-09 7:55 ` [PATCH 09/45] xfs: add a xfs_rtrmap_highest_rgbno helper Christoph Hellwig
2025-04-09 7:55 ` [PATCH 10/45] xfs: define the zoned on-disk format Christoph Hellwig
2025-04-09 7:55 ` [PATCH 11/45] FIXUP: " Christoph Hellwig
2025-04-09 15:47 ` Darrick J. Wong
2025-04-09 16:04 ` Darrick J. Wong
2025-04-10 6:01 ` Christoph Hellwig
2025-04-10 16:31 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 12/45] xfs: allow internal RT devices for zoned mode Christoph Hellwig
2025-04-09 7:55 ` [PATCH 13/45] FIXUP: " Christoph Hellwig
2025-04-09 15:55 ` Darrick J. Wong
2025-04-10 6:09 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 14/45] xfs: export zoned geometry via XFS_FSOP_GEOM Christoph Hellwig
2025-04-09 7:55 ` [PATCH 15/45] xfs: disable sb_frextents for zoned file systems Christoph Hellwig
2025-04-09 7:55 ` [PATCH 16/45] xfs: parse and validate hardware zone information Christoph Hellwig
2025-04-09 7:55 ` [PATCH 17/45] FIXUP: " Christoph Hellwig
2025-04-09 15:56 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 18/45] xfs: add the zoned space allocator Christoph Hellwig
2025-04-09 7:55 ` [PATCH 19/45] xfs: add support for zoned space reservations Christoph Hellwig
2025-04-09 7:55 ` [PATCH 20/45] FIXUP: " Christoph Hellwig
2025-04-09 15:56 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 21/45] xfs: implement zoned garbage collection Christoph Hellwig
2025-04-09 7:55 ` [PATCH 22/45] xfs: enable fsmap reporting for internal RT devices Christoph Hellwig
2025-04-09 7:55 ` [PATCH 23/45] xfs: enable the zoned RT device feature Christoph Hellwig
2025-04-09 7:55 ` [PATCH 24/45] xfs: support zone gaps Christoph Hellwig
2025-04-09 7:55 ` [PATCH 25/45] FIXUP: " Christoph Hellwig
2025-04-09 15:57 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 26/45] libfrog: report the zoned flag Christoph Hellwig
2025-04-09 15:58 ` Darrick J. Wong
2025-04-10 6:14 ` Christoph Hellwig
2025-04-10 16:36 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 27/45] xfs_repair: support repairing zoned file systems Christoph Hellwig
2025-04-09 16:10 ` Darrick J. Wong
2025-04-10 6:27 ` Christoph Hellwig
2025-04-10 16:41 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 28/45] xfs_repair: fix the RT device check in process_dinode_int Christoph Hellwig
2025-04-09 16:11 ` Darrick J. Wong
2025-04-10 6:29 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 29/45] xfs_repair: validate rt groups vs reported hardware zones Christoph Hellwig
2025-04-09 18:41 ` Darrick J. Wong
2025-04-10 6:34 ` Christoph Hellwig
2025-04-10 16:43 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 30/45] xfs_mkfs: support creating zoned file systems Christoph Hellwig
2025-04-09 18:54 ` Darrick J. Wong [this message]
2025-04-10 6:45 ` Christoph Hellwig
2025-04-10 16:45 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 31/45] xfs_mkfs: calculate zone overprovisioning when specifying size Christoph Hellwig
2025-04-09 19:06 ` Darrick J. Wong
2025-04-10 7:00 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 32/45] xfs_mkfs: default to rtinherit=1 for zoned file systems Christoph Hellwig
2025-04-09 18:59 ` Darrick J. Wong
2025-04-10 6:45 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 33/45] xfs_mkfs: reflink conflicts with zoned file systems for now Christoph Hellwig
2025-04-09 19:00 ` Darrick J. Wong
2025-04-10 6:46 ` Christoph Hellwig
2025-04-10 16:47 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 34/45] xfs_mkfs: document the new zoned options in the man page Christoph Hellwig
2025-04-09 19:00 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 35/45] libfrog: report the zoned geometry Christoph Hellwig
2025-04-09 19:01 ` Darrick J. Wong
2025-04-10 7:02 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 36/45] man: document XFS_FSOP_GEOM_FLAGS_ZONED Christoph Hellwig
2025-04-09 19:13 ` Darrick J. Wong
2025-04-10 6:53 ` Christoph Hellwig
2025-04-10 16:47 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 37/45] xfs_io: correctly report RGs with internal rt dev in bmap output Christoph Hellwig
2025-04-09 22:22 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 38/45] xfs_io: don't re-query fs_path information in fsmap_f Christoph Hellwig
2025-04-09 20:48 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 39/45] xfs_io: don't re-query geometry " Christoph Hellwig
2025-04-09 20:46 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 40/45] xfs_io: handle internal RT devices in fsmap output Christoph Hellwig
2025-04-09 21:48 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 41/45] xfs_spaceman: handle internal RT devices Christoph Hellwig
2025-04-09 19:29 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 42/45] xfs_scrub: support internal RT sections Christoph Hellwig
2025-04-09 19:30 ` Darrick J. Wong
2025-04-10 6:57 ` Christoph Hellwig
2025-04-09 7:55 ` [PATCH 43/45] xfs_scrub: handle internal RT devices Christoph Hellwig
2025-04-09 19:34 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 44/45] xfs_mdrestore: support " Christoph Hellwig
2025-04-09 19:36 ` Darrick J. Wong
2025-04-09 7:55 ` [PATCH 45/45] xfs_growfs: " Christoph Hellwig
2025-04-09 19:35 ` 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=20250409185449.GF6283@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=aalbersh@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.