If a filesystem has the sb_imax_pct field set to zero, there is no limit to the number of inode blocks in the filesystem.
However, when using mkfs.xfs and specifying maxpct = 0, the result is not as expected.
[root@fs ~]# mkfs.xfs -f -i maxpct=0 xfs.img
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
The reason is that the condition will never succeed when specifying maxpct = 0. As a result, the default algorithm was applied.
cfg->imaxpct = cli->imaxpct;
if (cfg->imaxpct)
return;
The result with patch:
[root@fs ~]# mkfs.xfs -f -i maxpct=0 xfs.img
data = bsize=4096 blocks=262144, imaxpct=0
= sunit=0 swidth=0 blks
[root@fs ~]# mkfs.xfs -f xfs.img
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
Cc: linux-xfs@vger.kernel.org # v4.15.0
Fixes: d7240c965389e1 ("mkfs: rework imaxpct calculation")
Suggested-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: liuh <liuhuan01@kylinos.cn>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
int data_concurrency;
int log_concurrency;
int rtvol_concurrency;
+ int imaxpct;
/* parameters where 0 is not a valid value */
int64_t agcount;
int64_t rgcount;
int inodesize;
int inopblock;
- int imaxpct;
int lsectorsize;
uuid_t uuid;
struct mkfs_params *cfg,
struct cli_params *cli)
{
- cfg->imaxpct = cli->imaxpct;
- if (cfg->imaxpct)
+ if (cli->imaxpct >= 0) {
+ cfg->imaxpct = cli->imaxpct;
return;
+ }
/*
* This returns the % of the disk space that is used for
.log_concurrency = -1, /* auto detect non-mechanical ddev */
.rtvol_concurrency = -1, /* auto detect non-mechanical rtdev */
.autofsck = FSPROP_AUTOFSCK_UNSET,
+ .imaxpct = -1, /* set sb_imax_pct automatically */
};
struct mkfs_params cfg = {};