]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: simplify minimum log size calculation
authorDave Chinner <dchinner@redhat.com>
Wed, 3 Jan 2018 20:10:10 +0000 (14:10 -0600)
committerEric Sandeen <sandeen@redhat.com>
Wed, 3 Jan 2018 20:10:10 +0000 (14:10 -0600)
mkfs jumps through hoops to call libxfs_log_calc_minimum_size() to
set the minimum log size. We already have a xfs_mount at this point,
we just need to set the superblock up slightly earlier and then mkfs
can call libxfs_log_calc_minimum_size() directly. This means we can
remove mkfs/maxtrres.c completely.

Signed-Off-By: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
include/xfs_multidisk.h
mkfs/Makefile
mkfs/maxtrres.c [deleted file]
mkfs/xfs_mkfs.c

index 54913d86cdb86a8beaea4a9e8d581b190e7cc8c7..24c90b3faf49c8b5497dd48ea48713f210911202 100644 (file)
@@ -62,10 +62,4 @@ extern char *setup_proto (char *fname);
 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(unsigned long agsize, int crcs_enabled, int dirversion,
-               int sectorlog, int blocklog, int inodelog, int dirblocklog,
-               int logversion, int log_sunit, int finobt, int rmapbt,
-               int reflink, int inode_align);
-
 #endif /* __XFS_MULTIDISK_H__ */
index e2dc1d4f4711667315139f65688c54ce77a11824..c84f9b6ae63b328722df314a34b409f7313ce411 100644 (file)
@@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs
 LTCOMMAND = mkfs.xfs
 
 HFILES =
-CFILES = maxtrres.c proto.c xfs_mkfs.c
+CFILES = proto.c xfs_mkfs.c
 
 LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) \
        $(LIBUUID)
diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c
deleted file mode 100644 (file)
index 0fa18c8..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2000-2001,2004-2005 Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/*
- * maxtrres.c
- *
- * Compute the maximum transaction reservation for a legal combination
- * of sector size, block size, inode size, directory version, and
- * directory block size.
- */
-#include "libfrog.h"
-#include "libxfs.h"
-#include "xfs_multidisk.h"
-
-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,
-       int             rmapbt,
-       int             reflink,
-       int             inode_align)
-{
-       xfs_sb_t        *sbp;
-       xfs_mount_t     mount;
-       int             maxfsb;
-
-       memset(&mount, 0, sizeof(mount));
-       sbp = &mount.m_sb;
-       sbp->sb_magicnum = XFS_SB_MAGIC;
-       sbp->sb_sectlog = sectorlog;
-       sbp->sb_sectsize = 1 << sbp->sb_sectlog;
-       sbp->sb_blocklog = blocklog;
-       sbp->sb_blocksize = 1 << blocklog;
-       sbp->sb_agblocks = agsize;
-       sbp->sb_agblklog = (uint8_t)log2_roundup((unsigned int)agsize);
-       sbp->sb_inodelog = inodelog;
-       sbp->sb_inopblog = blocklog - inodelog;
-       sbp->sb_inodesize = 1 << inodelog;
-       sbp->sb_inopblock = 1 << (blocklog - inodelog);
-       sbp->sb_dirblklog = dirblocklog - blocklog;
-
-       if (inode_align) {
-               int     cluster_size = XFS_INODE_BIG_CLUSTER_SIZE;
-               if (crcs_enabled)
-                       cluster_size *= sbp->sb_inodesize / XFS_DINODE_MIN_SIZE;
-               sbp->sb_inoalignmt = cluster_size >> blocklog;
-       }
-
-       if (log_sunit > 0) {
-               log_sunit <<= blocklog;
-               logversion = 2;
-       } else
-               log_sunit = 1;
-       sbp->sb_logsunit = log_sunit;
-
-       sbp->sb_versionnum =
-                       (crcs_enabled ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) |
-                       (dirversion == 2 ? XFS_SB_VERSION_DIRV2BIT : 0) |
-                       (logversion > 1 ? XFS_SB_VERSION_LOGV2BIT : 0) |
-                       XFS_DFL_SB_VERSION_BITS;
-       if (finobt)
-               sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_FINOBT;
-       if (rmapbt)
-               sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_RMAPBT;
-       if (reflink)
-               sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_REFLINK;
-
-       libxfs_mount(&mount, sbp, 0,0,0,0);
-       maxfsb = libxfs_log_calc_minimum_size(&mount);
-       libxfs_umount(&mount);
-
-#if 0
-       printf("#define\tMAXTRRES_S%d_B%d_I%d_D%d_V%d_LSU%d\t%d\n",
-               sectorlog, blocklog, inodelog, dirblocklog, dirversion,
-               log_sunit, maxfsb);
-#endif
-
-       return maxfsb;
-}
index c4de836076a0ac42eb203baeb867bac7863d6742..4158b2fd010d57413a9280c532a3673e75bf1586 100644 (file)
@@ -3050,16 +3050,16 @@ calculate_log_size(
        struct cli_params       *cli,
        struct xfs_mount        *mp)
 {
-       struct sb_feat_args     *fp = &cfg->sb_feat;
        struct xfs_sb           *sbp = &mp->m_sb;
        int                     min_logblocks;
+       struct xfs_mount        mount;
 
-       min_logblocks = max_trans_res(sbp->sb_agblocks, fp->crcs_enabled,
-                                     fp->dir_version, cfg->sectorlog,
-                                     cfg->blocklog, cfg->inodelog,
-                                     cfg->dirblocklog, fp->log_version,
-                                     cfg->lsunit, fp->finobt, fp->rmapbt,
-                                     fp->reflink, fp->inode_align);
+       /* we need a temporary mount to calculate the minimum log size. */
+       memset(&mount, 0, sizeof(mount));
+       mount.m_sb = *sbp;
+       libxfs_mount(&mount, &mp->m_sb, 0, 0, 0, 0);
+       min_logblocks = libxfs_log_calc_minimum_size(&mount);
+       libxfs_umount(&mount);
 
        ASSERT(min_logblocks);
        min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks);
@@ -3174,28 +3174,60 @@ _("log ag number %lld too large, must be less than %lld\n"),
 }
 
 /*
- * Set up mount and superblock with the minimum parameters required for
+ * Set up superblock with the minimum parameters required for
  * the libxfs macros needed by the log sizing code to run successfully.
+ * This includes a minimum log size calculation, so we need everything
+ * that goes into that calculation to be setup here including feature
+ * flags.
  */
 static void
-initialise_mount(
+start_superblock_setup(
        struct mkfs_params      *cfg,
        struct xfs_mount        *mp,
        struct xfs_sb           *sbp)
 {
-       sbp->sb_blocklog = (uint8_t)cfg->blocklog;
+       sbp->sb_magicnum = XFS_SB_MAGIC;
+       sbp->sb_sectsize = (uint16_t)cfg->sectorsize;
        sbp->sb_sectlog = (uint8_t)cfg->sectorlog;
-       sbp->sb_agblklog = (uint8_t)log2_roundup(cfg->agsize);
+       sbp->sb_blocksize = cfg->blocksize;
+       sbp->sb_blocklog = (uint8_t)cfg->blocklog;
+
        sbp->sb_agblocks = (xfs_agblock_t)cfg->agsize;
+       sbp->sb_agblklog = (uint8_t)log2_roundup(cfg->agsize);
        sbp->sb_agcount = (xfs_agnumber_t)cfg->agcount;
-       mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
-       mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT;
+
+       sbp->sb_inodesize = (uint16_t)cfg->inodesize;
+       sbp->sb_inodelog = (uint8_t)cfg->inodelog;
+       sbp->sb_inopblock = (uint16_t)(cfg->blocksize / cfg->inodesize);
+       sbp->sb_inopblog = (uint8_t)(cfg->blocklog - cfg->inodelog);
+
+       sbp->sb_dirblklog = cfg->dirblocklog - cfg->blocklog;
+
+       sb_set_features(cfg, sbp);
 
        /*
-        * sb_versionnum, finobt and rmapbt flags must be set before we use
-        * libxfs_prealloc_blocks().
+        * log stripe unit is stored in bytes on disk and cannot be zero
+        * for v2 logs.
         */
-       sb_set_features(cfg, sbp);
+       if (cfg->sb_feat.log_version == 2) {
+               if (cfg->lsunit)
+                       sbp->sb_logsunit = XFS_FSB_TO_B(mp, cfg->lsunit);
+               else
+                       sbp->sb_logsunit = 1;
+       } else
+               sbp->sb_logsunit = 0;
+
+}
+
+static void
+initialise_mount(
+       struct mkfs_params      *cfg,
+       struct xfs_mount        *mp,
+       struct xfs_sb           *sbp)
+{
+       /* Minimum needed for libxfs_prealloc_blocks() */
+       mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
+       mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT;
 }
 
 static void
@@ -3238,7 +3270,7 @@ print_mkfs_cfg(
  * copy, so no need to care about endian swapping here.
  */
 static void
-setup_superblock(
+finish_superblock_setup(
        struct mkfs_params      *cfg,
        struct xfs_mount        *mp,
        struct xfs_sb           *sbp)
@@ -3246,8 +3278,6 @@ setup_superblock(
        if (cfg->label)
                strncpy(sbp->sb_fname, cfg->label, sizeof(sbp->sb_fname));
 
-       sbp->sb_magicnum = XFS_SB_MAGIC;
-       sbp->sb_blocksize = cfg->blocksize;
        sbp->sb_dblocks = cfg->dblocks;
        sbp->sb_rblocks = cfg->rtblocks;
        sbp->sb_rextents = cfg->rtextents;
@@ -3260,12 +3290,6 @@ setup_superblock(
        sbp->sb_agcount = (xfs_agnumber_t)cfg->agcount;
        sbp->sb_rbmblocks = cfg->rtbmblocks;
        sbp->sb_logblocks = (xfs_extlen_t)cfg->logblocks;
-       sbp->sb_sectsize = (uint16_t)cfg->sectorsize;
-       sbp->sb_inodesize = (uint16_t)cfg->inodesize;
-       sbp->sb_inopblock = (uint16_t)(cfg->blocksize / cfg->inodesize);
-       sbp->sb_sectlog = (uint8_t)cfg->sectorlog;
-       sbp->sb_inodelog = (uint8_t)cfg->inodelog;
-       sbp->sb_inopblog = (uint8_t)(cfg->blocklog - cfg->inodelog);
        sbp->sb_rextslog = (uint8_t)(cfg->rtextents ?
                        libxfs_highbit32((unsigned int)cfg->rtextents) : 0);
        sbp->sb_inprogress = 1; /* mkfs is in progress */
@@ -3280,19 +3304,6 @@ setup_superblock(
        sbp->sb_qflags = 0;
        sbp->sb_unit = cfg->dsunit;
        sbp->sb_width = cfg->dswidth;
-       sbp->sb_dirblklog = cfg->dirblocklog - cfg->blocklog;
-
-       /*
-        * log stripe unit is stored in bytes on disk and cannot be zero
-        * for v2 logs.
-        */
-       if (cfg->sb_feat.log_version == 2) {
-               if (cfg->lsunit)
-                       sbp->sb_logsunit = XFS_FSB_TO_B(mp, cfg->lsunit);
-               else
-                       sbp->sb_logsunit = 1;
-       } else
-               sbp->sb_logsunit = 0;
 
 }
 
@@ -4005,6 +4016,7 @@ main(
         * the geometry information we've already validated in libxfs
         * provided functions to determine on-disk format information.
         */
+       start_superblock_setup(&cfg, mp, sbp);
        initialise_mount(&cfg, mp, sbp);
 
        /*
@@ -4020,11 +4032,7 @@ main(
                if (dry_run)
                        exit(0);
        }
-
-       /*
-        * Finish setting up the superblock state ready for formatting.
-        */
-       setup_superblock(&cfg, mp, sbp);
+       finish_superblock_setup(&cfg, mp, sbp);
 
        /*
         * we need the libxfs buffer cache from here on in.