]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: convert mount flags to features
authorDave Chinner <dchinner@redhat.com>
Mon, 31 Jan 2022 22:22:11 +0000 (17:22 -0500)
committerEric Sandeen <sandeen@redhat.com>
Mon, 31 Jan 2022 22:22:11 +0000 (17:22 -0500)
Source kernel commit: 0560f31a09e523090d1ab2bfe21c69d028c2bdf2

Replace m_flags feature checks with xfs_has_<feature>() calls and
rework the setup code to set flags in m_features.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
[sandeen: add small_inums to userspace unsupported features]
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
include/xfs_mount.h
libxfs/init.c
libxfs/xfs_attr.c
libxfs/xfs_attr_leaf.c
libxfs/xfs_bmap.c
libxfs/xfs_ialloc.c

index a995140d265ed0edf0afe5694edd105a15493bd9..7805394637d250d0a15607ab60a6fab6b7019a7b 100644 (file)
@@ -197,6 +197,18 @@ __XFS_HAS_FEAT(inobtcounts, INOBTCNT)
 __XFS_HAS_FEAT(bigtime, BIGTIME)
 __XFS_HAS_FEAT(needsrepair, NEEDSREPAIR)
 
+/* Kernel mount features that we don't support */
+#define __XFS_UNSUPP_FEAT(name) \
+static inline bool xfs_has_ ## name (struct xfs_mount *mp) \
+{ \
+       return false; \
+}
+__XFS_UNSUPP_FEAT(wsync)
+__XFS_UNSUPP_FEAT(noattr2)
+__XFS_UNSUPP_FEAT(ikeep)
+__XFS_UNSUPP_FEAT(swalloc)
+__XFS_UNSUPP_FEAT(small_inums)
+
 #define LIBXFS_MOUNT_DEBUGGER          0x0001
 #define LIBXFS_MOUNT_32BITINODES       0x0002
 #define LIBXFS_MOUNT_32BITINOOPT       0x0004
index 7d94b721e8d33646064518aba7ce98cad29e81af..364c357848f00ac9c8d9b9216e0db92d805fde32 100644 (file)
@@ -540,7 +540,7 @@ xfs_set_inode_alloc(
         * sufficiently large, set XFS_MOUNT_32BITINODES if we must alter
         * the allocator to accommodate the request.
         */
-       if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32)
+       if (xfs_has_small_inums(mp) && ino > XFS_MAXINUMBER_32)
                mp->m_flags |= XFS_MOUNT_32BITINODES;
        else
                mp->m_flags &= ~XFS_MOUNT_32BITINODES;
index 07b1965298ac439945fd01f1cb9b6e880e744050..3a712e36399474713dfc95b7ce7f511f2b6bc80a 100644 (file)
@@ -224,7 +224,7 @@ xfs_attr_try_sf_addname(
        if (!error && !(args->op_flags & XFS_DA_OP_NOTIME))
                xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG);
 
-       if (dp->i_mount->m_flags & XFS_MOUNT_WSYNC)
+       if (xfs_has_wsync(dp->i_mount))
                xfs_trans_set_sync(args->trans);
 
        return error;
@@ -808,7 +808,7 @@ xfs_attr_set(
         * If this is a synchronous mount, make sure that the
         * transaction goes to disk before returning to the user.
         */
-       if (mp->m_flags & XFS_MOUNT_WSYNC)
+       if (xfs_has_wsync(mp))
                xfs_trans_set_sync(args->trans);
 
        if (!(args->op_flags & XFS_DA_OP_NOTIME))
index 3fff838e9bb6acc9984553163c009b4e9cf6e861..308fc0f74c824e0ba079b06fb0af0c21997f4b53 100644 (file)
@@ -565,7 +565,7 @@ xfs_attr_shortform_bytesfit(
         * literal area, but for the old format we are done if there is no
         * space in the fixed attribute fork.
         */
-       if (!(mp->m_flags & XFS_MOUNT_ATTR2))
+       if (!xfs_has_attr2(mp))
                return 0;
 
        dsize = dp->i_df.if_bytes;
@@ -618,21 +618,27 @@ xfs_attr_shortform_bytesfit(
 }
 
 /*
- * Switch on the ATTR2 superblock bit (implies also FEATURES2)
+ * Switch on the ATTR2 superblock bit (implies also FEATURES2) unless:
+ * - noattr2 mount option is set,
+ * - on-disk version bit says it is already set, or
+ * - the attr2 mount option is not set to enable automatic upgrade from attr1.
  */
 STATIC void
-xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp)
+xfs_sbversion_add_attr2(
+       struct xfs_mount        *mp,
+       struct xfs_trans        *tp)
 {
-       if ((mp->m_flags & XFS_MOUNT_ATTR2) &&
-           !(xfs_has_attr2(mp))) {
-               spin_lock(&mp->m_sb_lock);
-               if (!xfs_has_attr2(mp)) {
-                       xfs_add_attr2(mp);
-                       spin_unlock(&mp->m_sb_lock);
-                       xfs_log_sb(tp);
-               } else
-                       spin_unlock(&mp->m_sb_lock);
-       }
+       if (xfs_has_noattr2(mp))
+               return;
+       if (mp->m_sb.sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
+               return;
+       if (!xfs_has_attr2(mp))
+               return;
+
+       spin_lock(&mp->m_sb_lock);
+       xfs_add_attr2(mp);
+       spin_unlock(&mp->m_sb_lock);
+       xfs_log_sb(tp);
 }
 
 /*
@@ -807,8 +813,7 @@ xfs_attr_sf_removename(
         * Fix up the start offset of the attribute fork
         */
        totsize -= size;
-       if (totsize == sizeof(xfs_attr_sf_hdr_t) &&
-           (mp->m_flags & XFS_MOUNT_ATTR2) &&
+       if (totsize == sizeof(xfs_attr_sf_hdr_t) && xfs_has_attr2(mp) &&
            (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
            !(args->op_flags & XFS_DA_OP_ADDNAME)) {
                xfs_attr_fork_remove(dp, args->trans);
@@ -818,7 +823,7 @@ xfs_attr_sf_removename(
                ASSERT(dp->i_forkoff);
                ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) ||
                                (args->op_flags & XFS_DA_OP_ADDNAME) ||
-                               !(mp->m_flags & XFS_MOUNT_ATTR2) ||
+                               !xfs_has_attr2(mp) ||
                                dp->i_df.if_format == XFS_DINODE_FMT_BTREE);
                xfs_trans_log_inode(args->trans, dp,
                                        XFS_ILOG_CORE | XFS_ILOG_ADATA);
@@ -994,7 +999,7 @@ xfs_attr_shortform_allfit(
                bytes += xfs_attr_sf_entsize_byname(name_loc->namelen,
                                        be16_to_cpu(name_loc->valuelen));
        }
-       if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
+       if (xfs_has_attr2(dp->i_mount) &&
            (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
            (bytes == sizeof(struct xfs_attr_sf_hdr)))
                return -1;
@@ -1119,7 +1124,7 @@ xfs_attr3_leaf_to_shortform(
                goto out;
 
        if (forkoff == -1) {
-               ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2);
+               ASSERT(xfs_has_attr2(dp->i_mount));
                ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
                xfs_attr_fork_remove(dp, args->trans);
                goto out;
index db9e8566b230a8b86b81f6c60da6dfb6122a6ee4..bea9340ae82e98a15c6cfd465a5bbf805d63662d 100644 (file)
@@ -1040,7 +1040,7 @@ xfs_bmap_set_attrforkoff(
                ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size);
                if (!ip->i_forkoff)
                        ip->i_forkoff = default_size;
-               else if ((ip->i_mount->m_flags & XFS_MOUNT_ATTR2) && version)
+               else if (xfs_has_attr2(ip->i_mount) && version)
                        *version = 2;
                break;
        default:
@@ -3415,7 +3415,7 @@ xfs_bmap_compute_alignments(
        int                     stripe_align = 0;
 
        /* stripe alignment for allocation is determined by mount parameters */
-       if (mp->m_swidth && (mp->m_flags & XFS_MOUNT_SWALLOC))
+       if (mp->m_swidth && xfs_has_swalloc(mp))
                stripe_align = mp->m_swidth;
        else if (mp->m_dalign)
                stripe_align = mp->m_dalign;
index 567f999638772d26400ae56b231215fd983824f7..4075ff5ad242151030a62a2b5340b0ef09affc0e 100644 (file)
@@ -707,7 +707,7 @@ xfs_ialloc_ag_alloc(
                 */
                isaligned = 0;
                if (igeo->ialloc_align) {
-                       ASSERT(!(args.mp->m_flags & XFS_MOUNT_NOALIGN));
+                       ASSERT(!xfs_has_noalign(args.mp));
                        args.alignment = args.mp->m_dalign;
                        isaligned = 1;
                } else
@@ -1948,8 +1948,7 @@ xfs_difree_inobt(
         * remove the chunk if the block size is large enough for multiple inode
         * chunks (that might not be free).
         */
-       if (!(mp->m_flags & XFS_MOUNT_IKEEP) &&
-           rec.ir_free == XFS_INOBT_ALL_FREE &&
+       if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
            mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
                struct xfs_perag        *pag = agbp->b_pag;
 
@@ -2093,9 +2092,8 @@ xfs_difree_finobt(
         * enough for multiple chunks. Leave the finobt record to remain in sync
         * with the inobt.
         */
-       if (rec.ir_free == XFS_INOBT_ALL_FREE &&
-           mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK &&
-           !(mp->m_flags & XFS_MOUNT_IKEEP)) {
+       if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
+           mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
                error = xfs_btree_delete(cur, &i);
                if (error)
                        goto error;