]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: set inode alignment and cluster size for minimum log size estimation
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 13 Jul 2017 16:51:27 +0000 (11:51 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 13 Jul 2017 16:51:27 +0000 (11:51 -0500)
In order for mkfs to calculate the minimum log size correctly, it must
be able to find the transaction type with the largest reservation.  The
iunlink transaction reservation size calculation depends on having the
inode cluster size set correctly, which in turn depends on the inode
alignment parameters being set as they will be in the final filesystem.
Therefore we have to set up the inoalignmt field in max_trans_res.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
include/xfs_multidisk.h
libxfs/init.c
mkfs/maxtrres.c
mkfs/xfs_mkfs.c

index ce9bbced05621ddd6562c8c1bec7830ea3b027df..e5f53b7ea0654d821949854ddd8a9ba35a1e783f 100644 (file)
@@ -69,6 +69,6 @@ extern void res_failed (int err);
 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 reflink, int inode_align);
 
 #endif /* __XFS_MULTIDISK_H__ */
index 85e0d159194a7ea77161a53011b018310a67fdb2..fc14c5e436b2487c5cc236c36248fa4dfefb8865 100644 (file)
@@ -705,6 +705,13 @@ libxfs_mount(
                mp->m_maxicount = 0;
 
        mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE;
+       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               int     new_size = mp->m_inode_cluster_size;
+
+               new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
+               if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size))
+                       mp->m_inode_cluster_size = new_size;
+       }
 
        /*
         * Set whether we're using stripe alignment.
index 69ec67a92e3b8bbee16b83846659a317d8f0c65c..04028bf8ae5864b25b5a2832af1708f4707163fd 100644 (file)
@@ -40,7 +40,8 @@ max_trans_res(
        int             log_sunit,
        int             finobt,
        int             rmapbt,
-       int             reflink)
+       int             reflink,
+       int             inode_align)
 {
        xfs_sb_t        *sbp;
        xfs_mount_t     mount;
@@ -61,6 +62,13 @@ max_trans_res(
        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;
index 3d2117f113df0a7f406bf066ffa14e048bdecebd..a69190b9e8dd69e8cbe96dd8ba1a2182aab027e1 100644 (file)
@@ -2619,7 +2619,8 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
                                   sb_feat.crcs_enabled, sb_feat.dir_version,
                                   sectorlog, blocklog, inodelog, dirblocklog,
                                   sb_feat.log_version, lsunit, sb_feat.finobt,
-                                  sb_feat.rmapbt, sb_feat.reflink);
+                                  sb_feat.rmapbt, sb_feat.reflink,
+                                  sb_feat.inode_align);
        ASSERT(min_logblocks);
        min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks);
        if (!logsize && dblocks >= (1024*1024*1024) >> blocklog)