xfs: add a new xfs_sb_version_has_v3inode helper
authorChristoph Hellwig <hch@lst.de>
Wed, 18 Mar 2020 15:15:09 +0000 (08:15 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 19 Mar 2020 15:47:34 +0000 (08:47 -0700)
Add a new wrapper to check if a file system supports the v3 inode format
with a larger dinode core.  Previously we used xfs_sb_version_hascrc for
that, which is technically correct but a little confusing to read.

Also move xfs_dinode_good_version next to xfs_sb_version_has_v3inode
so that we have one place that documents the superblock version to
inode version relationship.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/libxfs/xfs_format.h
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/libxfs/xfs_inode_buf.h
fs/xfs/libxfs/xfs_trans_resv.c
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_log_recover.c

index cd814f99da28d05f9a0dfd95ca462e8a881d974b..19899d48517c9552e8824feec212f63865b67c6f 100644 (file)
@@ -497,6 +497,23 @@ static inline bool xfs_sb_version_hascrc(struct xfs_sb *sbp)
        return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
 }
 
+/*
+ * v5 file systems support V3 inodes only, earlier file systems support
+ * v2 and v1 inodes.
+ */
+static inline bool xfs_sb_version_has_v3inode(struct xfs_sb *sbp)
+{
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
+}
+
+static inline bool xfs_dinode_good_version(struct xfs_sb *sbp,
+               uint8_t version)
+{
+       if (xfs_sb_version_has_v3inode(sbp))
+               return version == 3;
+       return version == 1 || version == 2;
+}
+
 static inline bool xfs_sb_version_has_pquotino(struct xfs_sb *sbp)
 {
        return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
index 21ac3fb52f4e6a60fc31737828088f284bd66fda..4de61af3b84099a474019c79903f2f9ae2edf95b 100644 (file)
@@ -304,7 +304,7 @@ xfs_ialloc_inode_init(
         * That means for v3 inode we log the entire buffer rather than just the
         * inode cores.
         */
-       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+       if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
                version = 3;
                ino = XFS_AGINO_TO_INO(mp, agno, XFS_AGB_TO_AGINO(mp, agbno));
 
@@ -2872,7 +2872,7 @@ xfs_ialloc_setup_geometry(
         * cannot change the behavior.
         */
        igeo->inode_cluster_size_raw = XFS_INODE_BIG_CLUSTER_SIZE;
-       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+       if (xfs_sb_version_has_v3inode(&mp->m_sb)) {
                int     new_size = igeo->inode_cluster_size_raw;
 
                new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
index 17e88a8c8353dd30de47e532f3a22d17a3eb5d7c..c862c8f1aaa94b318d7f5eff698dd12c6432dec1 100644 (file)
@@ -44,17 +44,6 @@ xfs_inobp_check(
 }
 #endif
 
-bool
-xfs_dinode_good_version(
-       struct xfs_mount *mp,
-       __u8            version)
-{
-       if (xfs_sb_version_hascrc(&mp->m_sb))
-               return version == 3;
-
-       return version == 1 || version == 2;
-}
-
 /*
  * If we are doing readahead on an inode buffer, we might be in log recovery
  * reading an inode allocation buffer that hasn't yet been replayed, and hence
@@ -93,7 +82,7 @@ xfs_inode_buf_verify(
                dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog));
                unlinked_ino = be32_to_cpu(dip->di_next_unlinked);
                di_ok = xfs_verify_magic16(bp, dip->di_magic) &&
-                       xfs_dinode_good_version(mp, dip->di_version) &&
+                       xfs_dinode_good_version(&mp->m_sb, dip->di_version) &&
                        xfs_verify_agino_or_null(mp, agno, unlinked_ino);
                if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
                                                XFS_ERRTAG_ITOBP_INOTOBP))) {
@@ -454,7 +443,7 @@ xfs_dinode_verify(
 
        /* Verify v3 integrity information first */
        if (dip->di_version >= 3) {
-               if (!xfs_sb_version_hascrc(&mp->m_sb))
+               if (!xfs_sb_version_has_v3inode(&mp->m_sb))
                        return __this_address;
                if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize,
                                      XFS_DINODE_CRC_OFF))
@@ -629,7 +618,7 @@ xfs_iread(
 
        /* shortcut IO on inode allocation if possible */
        if ((iget_flags & XFS_IGET_CREATE) &&
-           xfs_sb_version_hascrc(&mp->m_sb) &&
+           xfs_sb_version_has_v3inode(&mp->m_sb) &&
            !(mp->m_flags & XFS_MOUNT_IKEEP)) {
                VFS_I(ip)->i_generation = prandom_u32();
                ip->i_d.di_version = 3;
index 2683e1e2c4a69f94921bed12c0625f67c31031f1..66de5964045c33d65425ff7cac83b73a7c64a5f4 100644 (file)
@@ -59,8 +59,6 @@ void  xfs_inode_from_disk(struct xfs_inode *ip, struct xfs_dinode *from);
 void   xfs_log_dinode_to_disk(struct xfs_log_dinode *from,
                               struct xfs_dinode *to);
 
-bool   xfs_dinode_good_version(struct xfs_mount *mp, __u8 version);
-
 #if defined(DEBUG)
 void   xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
 #else
index 7a9c04920505af327cd7a4e490273051b93479d5..d1a0848cb52eca6698cd2a224f3f78179be2e9ad 100644 (file)
@@ -187,7 +187,7 @@ xfs_calc_inode_chunk_res(
                               XFS_FSB_TO_B(mp, 1));
        if (alloc) {
                /* icreate tx uses ordered buffers */
-               if (xfs_sb_version_hascrc(&mp->m_sb))
+               if (xfs_sb_version_has_v3inode(&mp->m_sb))
                        return res;
                size = XFS_FSB_TO_B(mp, 1);
        }
index 663810e6cd5997df58a678e24b68b50794c0ab3b..1545657c3ca02a4e0924885c75b79ea9afa36377 100644 (file)
@@ -345,7 +345,7 @@ xfs_buf_item_format(
         * occurs during recovery.
         */
        if (bip->bli_flags & XFS_BLI_INODE_BUF) {
-               if (xfs_sb_version_hascrc(&lip->li_mountp->m_sb) ||
+               if (xfs_sb_version_has_v3inode(&lip->li_mountp->m_sb) ||
                    !((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&
                      xfs_log_item_in_current_chkpt(lip)))
                        bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF;
index 6abc0863c9c3572fe0d6775215370ff97f95c3ac..c467488212c27b169af32f18f179f703792ef155 100644 (file)
@@ -2997,7 +2997,7 @@ xlog_recover_inode_pass2(
         * superblock flag to determine whether we need to look at di_flushiter
         * to skip replay when the on disk inode is newer than the log one
         */
-       if (!xfs_sb_version_hascrc(&mp->m_sb) &&
+       if (!xfs_sb_version_has_v3inode(&mp->m_sb) &&
            ldip->di_flushiter < be16_to_cpu(dip->di_flushiter)) {
                /*
                 * Deal with the wrap case, DI_MAX_FLUSH is less