From e5cc9d560a16d61a7456ef6e91b61d823b5b46df Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Fri, 19 Aug 2016 10:53:14 +1000 Subject: [PATCH] mkfs: set agsize prior to calculating minimum log size Each btree has its own maxlevels variable. Since the level count of certain btrees depend on agblocks, it's necessary to know the AG size prior to calculating the log reservations. These reservations are needed to calculate the log size and the kernel will refuse to mount if we guess too low, so stuff in the real agsize when we're formatting the log. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_multidisk.h | 2 +- mkfs/maxtrres.c | 3 ++- mkfs/xfs_mkfs.c | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index fe3e98f75..4429dabdd 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -66,7 +66,7 @@ extern void parse_proto (xfs_mount_t *mp, struct fsxattr *fsx, char **pp); extern void res_failed (int err); /* maxtrres.c */ -extern int max_trans_res (int crcs_enabled, int dirversion, +extern int max_trans_res(unsigned long agsize, int crcs_enabled, int dirversion, int sectorlog, int blocklog, int inodelog, int dirblocklog, int logversion, int log_sunit, int finobt); diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index f48a0f748..c0b1b5d85 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -29,6 +29,7 @@ int max_trans_res( + unsigned long agsize, int crcs_enabled, int dirversion, int sectorlog, @@ -50,7 +51,7 @@ max_trans_res( sbp->sb_sectsize = 1 << sbp->sb_sectlog; sbp->sb_blocklog = blocklog; sbp->sb_blocksize = 1 << blocklog; - sbp->sb_agblocks = XFS_AG_MIN_BYTES / (1 << blocklog); + sbp->sb_agblocks = agsize; sbp->sb_inodelog = inodelog; sbp->sb_inopblog = blocklog - inodelog; sbp->sb_inodesize = 1 << inodelog; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index dad809a00..3f2d9a2ff 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2565,7 +2565,8 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), lsunit = (32 * 1024) >> blocklog; } - min_logblocks = max_trans_res(sb_feat.crcs_enabled, sb_feat.dir_version, + min_logblocks = max_trans_res(agsize, + sb_feat.crcs_enabled, sb_feat.dir_version, sectorlog, blocklog, inodelog, dirblocklog, sb_feat.log_version, lsunit, sb_feat.finobt); ASSERT(min_logblocks); -- 2.47.2