xfsprogs/0052-mkfs-add-an-extsize-option-that-allows-units.patch
zhangjian f908c320a1 support atomic write
(cherry picked from commit 40226fa996b6e2d02ded47834cf5289a5f7160e6)
2024-06-19 11:40:47 +08:00

166 lines
4.6 KiB
Diff

From 53e0ead4c1a522f42486e47925b4c224945c6cda Mon Sep 17 00:00:00 2001
From: "Darrick J. Wong" <djwong@kernel.org>
Date: Fri, 29 Sep 2023 09:53:41 +0000
Subject: [PATCH 06/11] mkfs: add an extsize= option that allows units
Add a new mkfs option that allows the user to specify an extent size
hint with units. This removes the need to specify the option in
filesystem block size, which eases the computation requirements in
deployment scripts.
# mkfs.xfs -d extsize=2m /dev/sda
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: John Garry <john.g.garry@oracle.com>
---
man/man8/mkfs.xfs.8 | 15 ++++++++++++++
mkfs/xfs_mkfs.c | 48 +++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8
index b2ffb3d..5cd69fa 100644
--- a/man/man8/mkfs.xfs.8
+++ b/man/man8/mkfs.xfs.8
@@ -479,6 +479,18 @@ will be assigned the project quota id provided in
Directories will pass on the project id to newly created regular files and
directories.
.TP
+.BI extsize= num
+All inodes created by
+.B mkfs.xfs
+will have this
+.I value
+extent size hint applied.
+Directories will pass on this hint to newly created regular files and
+directories.
+This option cannot be combined with the
+.B extszinherit
+option.
+.TP
.BI extszinherit= value
All inodes created by
.B mkfs.xfs
@@ -488,6 +500,9 @@ extent size hint applied.
The value must be provided in units of filesystem blocks.
Directories will pass on this hint to newly created regular files and
directories.
+This option cannot be combined with the
+.B extsize
+option.
.TP
.BI daxinherit= value
If
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 2eb3a0a..fb0c53f 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -66,6 +66,7 @@ enum {
D_NOALIGN,
D_RTINHERIT,
D_PROJINHERIT,
+ D_EXTSIZE,
D_EXTSZINHERIT,
D_COWEXTSIZE,
D_DAXINHERIT,
@@ -300,6 +301,7 @@ static struct opt_params dopts = {
[D_NOALIGN] = "noalign",
[D_RTINHERIT] = "rtinherit",
[D_PROJINHERIT] = "projinherit",
+ [D_EXTSIZE] = "extsize",
[D_EXTSZINHERIT] = "extszinherit",
[D_COWEXTSIZE] = "cowextsize",
[D_DAXINHERIT] = "daxinherit",
@@ -407,8 +409,17 @@ static struct opt_params dopts = {
.maxval = UINT_MAX,
.defaultval = SUBOPT_NEEDS_VAL,
},
+ { .index = D_EXTSIZE,
+ .conflicts = { { &dopts, D_EXTSZINHERIT },
+ { NULL, LAST_CONFLICT } },
+ .convert = true,
+ .minval = 0,
+ .maxval = XFS_AG_MAX_BYTES,
+ .defaultval = SUBOPT_NEEDS_VAL,
+ },
{ .index = D_EXTSZINHERIT,
- .conflicts = { { NULL, LAST_CONFLICT } },
+ .conflicts = { { &dopts, D_EXTSIZE },
+ { NULL, LAST_CONFLICT } },
.minval = 0,
.maxval = UINT_MAX,
.defaultval = SUBOPT_NEEDS_VAL,
@@ -835,6 +846,7 @@ struct cli_params {
char *lsu;
char *rtextsize;
char *rtsize;
+ char *extsize;
/* parameters where 0 is a valid CLI value */
int dsunit;
@@ -945,7 +957,7 @@ usage( void )
inobtcount=0|1,bigtime=0|1]\n\
/* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
(sunit=value,swidth=value|su=num,sw=num|noalign),\n\
- sectsize=num\n\
+ sectsize=num,extsize=num\n\
/* force overwrite */ [-f]\n\
/* inode size */ [-i perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
projid32bit=0|1,sparse=0|1]\n\
@@ -1553,6 +1565,9 @@ data_opts_parser(
cli->fsx.fsx_projid = getnum(value, opts, subopt);
cli->fsx.fsx_xflags |= FS_XFLAG_PROJINHERIT;
break;
+ case D_EXTSIZE:
+ cli->extsize = getstr(value, opts, subopt);
+ break;
case D_EXTSZINHERIT:
cli->fsx.fsx_extsize = getnum(value, opts, subopt);
if (cli->fsx.fsx_extsize)
@@ -2002,6 +2017,33 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"),
}
+/*
+ * Convert the -d extsize= option to a number, then set the extent size hint
+ * to that number.
+ */
+static void
+set_extsize(
+ struct cli_params *cli,
+ char *extsize,
+ struct opt_params *opts,
+ int subopt)
+{
+ uint64_t extsz_bytes;
+ if (!extsize)
+ return;
+
+ extsz_bytes = getnum(extsize, opts, subopt);
+ if (extsz_bytes % blocksize)
+ illegal_option(extsize, opts, subopt,
+ _("Value must be a multiple of block size."));
+
+ cli->fsx.fsx_extsize = extsz_bytes / blocksize;
+ if (cli->fsx.fsx_extsize)
+ cli->fsx.fsx_xflags |= FS_XFLAG_EXTSZINHERIT;
+ else
+ cli->fsx.fsx_xflags &= ~FS_XFLAG_EXTSZINHERIT;
+}
+
/*
* Grab log sector size and validate.
*
@@ -4081,6 +4123,8 @@ main(
blocksize = cfg.blocksize;
sectorsize = cfg.sectorsize;
+ set_extsize(&cli, cli.extsize, &dopts, D_EXTSIZE);
+
validate_log_sectorsize(&cfg, &cli, &dft);
validate_sb_features(&cfg, &cli);
--
2.33.0