]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: set agsize prior to calculating minimum log size
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 19 Aug 2016 00:53:14 +0000 (10:53 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 19 Aug 2016 00:53:14 +0000 (10:53 +1000)
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 <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
include/xfs_multidisk.h
mkfs/maxtrres.c
mkfs/xfs_mkfs.c

index fe3e98f755dfd725ceaa197f0528b2361527edeb..4429dabdd556d8c81c23bc80b660480b674ed061 100644 (file)
@@ -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);
 
index f48a0f748d3802bbbc4b799baa36c007245a8abd..c0b1b5d858bba8f27cbd572fac1dcf50269475bc 100644 (file)
@@ -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;
index dad809a0024bf8ab7132fafe8c56aaa24e1c551c..3f2d9a2ffe11e64d4b12332dde18be4537a907d2 100644 (file)
@@ -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);