]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: remove deprecated mount options
authorDarrick J. Wong <djwong@kernel.org>
Tue, 2 Sep 2025 21:33:53 +0000 (14:33 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 5 Sep 2025 15:48:23 +0000 (08:48 -0700)
These four mount options were scheduled for removal in September 2025,
so remove them now.

Cc: preichl@redhat.com
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Documentation/admin-guide/xfs.rst
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_sb.c
fs/xfs/xfs_icache.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_super.c

index 693b09ca62922f184cea951fb08c6f0a6229ae6c..7ad746a3e66c25c59f0effe9541ca151dffeb249 100644 (file)
@@ -34,22 +34,6 @@ When mounting an XFS filesystem, the following options are accepted.
        to the file. Specifying a fixed ``allocsize`` value turns off
        the dynamic behaviour.
 
-  attr2 or noattr2
-       The options enable/disable an "opportunistic" improvement to
-       be made in the way inline extended attributes are stored
-       on-disk.  When the new form is used for the first time when
-       ``attr2`` is selected (either when setting or removing extended
-       attributes) the on-disk superblock feature bit field will be
-       updated to reflect this format being in use.
-
-       The default behaviour is determined by the on-disk feature
-       bit indicating that ``attr2`` behaviour is active. If either
-       mount option is set, then that becomes the new default used
-       by the filesystem.
-
-       CRC enabled filesystems always use the ``attr2`` format, and so
-       will reject the ``noattr2`` mount option if it is set.
-
   discard or nodiscard (default)
        Enable/disable the issuing of commands to let the block
        device reclaim space freed by the filesystem.  This is
@@ -75,12 +59,6 @@ When mounting an XFS filesystem, the following options are accepted.
        across the entire filesystem rather than just on directories
        configured to use it.
 
-  ikeep or noikeep (default)
-       When ``ikeep`` is specified, XFS does not delete empty inode
-       clusters and keeps them around on disk.  When ``noikeep`` is
-       specified, empty inode clusters are returned to the free
-       space pool.
-
   inode32 or inode64 (default)
        When ``inode32`` is specified, it indicates that XFS limits
        inode creation to locations which will not result in inode
@@ -267,8 +245,6 @@ Deprecated Mount Options
 ============================    ================
 Mounting with V4 filesystem     September 2030
 Mounting ascii-ci filesystem    September 2030
-ikeep/noikeep                  September 2025
-attr2/noattr2                  September 2025
 ============================    ================
 
 
@@ -284,6 +260,8 @@ Removed Mount Options
   osyncisdsync/osyncisosync    v4.0
   barrier                      v4.19
   nobarrier                    v4.19
+  ikeep/noikeep                        v6.18
+  attr2/noattr2                        v6.18
 ===========================     =======
 
 sysctls
index fddb55605e0cc64471190f6622a70ad7edb4f043..47213e6023dd4bdbcae9bff4c403c97e07aff274 100644 (file)
@@ -667,12 +667,8 @@ xfs_attr_shortform_bytesfit(
 
        /*
         * For attr2 we can try to move the forkoff if there is space in the
-        * literal area, but for the old format we are done if there is no
-        * space in the fixed attribute fork.
+        * literal area
         */
-       if (!xfs_has_attr2(mp))
-               return 0;
-
        dsize = dp->i_df.if_bytes;
 
        switch (dp->i_df.if_format) {
@@ -723,22 +719,16 @@ xfs_attr_shortform_bytesfit(
 }
 
 /*
- * 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.
+ * Switch on the ATTR2 superblock bit (implies also FEATURES2) unless
+ * on-disk version bit says it is already set
  */
 STATIC void
 xfs_sbversion_add_attr2(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp)
 {
-       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);
@@ -889,7 +879,7 @@ xfs_attr_sf_removename(
        /*
         * Fix up the start offset of the attribute fork
         */
-       if (totsize == sizeof(struct xfs_attr_sf_hdr) && xfs_has_attr2(mp) &&
+       if (totsize == sizeof(struct xfs_attr_sf_hdr) &&
            (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
            !(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE)) &&
            !xfs_has_parent(mp)) {
@@ -900,7 +890,6 @@ xfs_attr_sf_removename(
                ASSERT(dp->i_forkoff);
                ASSERT(totsize > sizeof(struct xfs_attr_sf_hdr) ||
                                (args->op_flags & XFS_DA_OP_ADDNAME) ||
-                               !xfs_has_attr2(mp) ||
                                dp->i_df.if_format == XFS_DINODE_FMT_BTREE ||
                                xfs_has_parent(mp));
                xfs_trans_log_inode(args->trans, dp,
@@ -1040,8 +1029,7 @@ xfs_attr_shortform_allfit(
                bytes += xfs_attr_sf_entsize_byname(name_loc->namelen,
                                        be16_to_cpu(name_loc->valuelen));
        }
-       if (xfs_has_attr2(dp->i_mount) &&
-           (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
+       if ((dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
            (bytes == sizeof(struct xfs_attr_sf_hdr)))
                return -1;
        return xfs_attr_shortform_bytesfit(dp, bytes);
@@ -1161,7 +1149,6 @@ xfs_attr3_leaf_to_shortform(
                 * this case.
                 */
                if (!(args->op_flags & XFS_DA_OP_REPLACE)) {
-                       ASSERT(xfs_has_attr2(dp->i_mount));
                        ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
                        xfs_attr_fork_remove(dp, args->trans);
                }
index d954f9b8071f4b8e28e8083d71bcf403da7d2c61..80bdb537fcf7832566d207d5a64dd842a02fbeef 100644 (file)
@@ -997,8 +997,7 @@ xfs_bmap_add_attrfork_local(
 static int
 xfs_bmap_set_attrforkoff(
        struct xfs_inode        *ip,
-       int                     size,
-       int                     *version)
+       int                     size)
 {
        int                     default_size = xfs_default_attroffset(ip) >> 3;
 
@@ -1012,8 +1011,6 @@ xfs_bmap_set_attrforkoff(
                ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size);
                if (!ip->i_forkoff)
                        ip->i_forkoff = default_size;
-               else if (xfs_has_attr2(ip->i_mount) && version)
-                       *version = 2;
                break;
        default:
                ASSERT(0);
@@ -1035,7 +1032,6 @@ xfs_bmap_add_attrfork(
        int                     rsvd)           /* xact may use reserved blks */
 {
        struct xfs_mount        *mp = tp->t_mountp;
-       int                     version = 1;    /* superblock attr version */
        int                     logflags;       /* logging flags */
        int                     error;          /* error return value */
 
@@ -1045,7 +1041,7 @@ xfs_bmap_add_attrfork(
        ASSERT(!xfs_inode_has_attr_fork(ip));
 
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-       error = xfs_bmap_set_attrforkoff(ip, size, &version);
+       error = xfs_bmap_set_attrforkoff(ip, size);
        if (error)
                return error;
 
@@ -1069,16 +1065,12 @@ xfs_bmap_add_attrfork(
                xfs_trans_log_inode(tp, ip, logflags);
        if (error)
                return error;
-       if (!xfs_has_attr(mp) ||
-          (!xfs_has_attr2(mp) && version == 2)) {
+       if (!xfs_has_attr(mp)) {
                bool log_sb = false;
 
                spin_lock(&mp->m_sb_lock);
                if (!xfs_has_attr(mp)) {
                        xfs_add_attr(mp);
-                       log_sb = true;
-               }
-               if (!xfs_has_attr2(mp) && version == 2) {
                        xfs_add_attr2(mp);
                        log_sb = true;
                }
index 750111634d9f7b82b953f606e13aa7169b0ce7f6..5fefdd4fe75dbd2a11b628b4e0d525e2f2f8e080 100644 (file)
@@ -2140,7 +2140,7 @@ xfs_difree_inobt(
         * remove the chunk if the block size is large enough for multiple inode
         * chunks (that might not be free).
         */
-       if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
+       if (rec.ir_free == XFS_INOBT_ALL_FREE &&
            mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
                xic->deleted = true;
                xic->first_ino = xfs_agino_to_ino(pag, rec.ir_startino);
@@ -2286,7 +2286,7 @@ xfs_difree_finobt(
         * enough for multiple chunks. Leave the finobt record to remain in sync
         * with the inobt.
         */
-       if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
+       if (rec.ir_free == XFS_INOBT_ALL_FREE &&
            mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
                error = xfs_btree_delete(cur, &i);
                if (error)
index 711e180f9ebb835296afda1949f320d3425ecca6..cdd16dd805d77cf2d876108a1baaed79b6f70f04 100644 (file)
@@ -142,8 +142,6 @@ xfs_sb_version_to_features(
        if (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) {
                if (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)
                        features |= XFS_FEAT_LAZYSBCOUNT;
-               if (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
-                       features |= XFS_FEAT_ATTR2;
                if (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)
                        features |= XFS_FEAT_PROJID32;
                if (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)
@@ -155,7 +153,7 @@ xfs_sb_version_to_features(
 
        /* Always on V5 features */
        features |= XFS_FEAT_ALIGN | XFS_FEAT_LOGV2 | XFS_FEAT_EXTFLG |
-                   XFS_FEAT_LAZYSBCOUNT | XFS_FEAT_ATTR2 | XFS_FEAT_PROJID32 |
+                   XFS_FEAT_LAZYSBCOUNT | XFS_FEAT_PROJID32 |
                    XFS_FEAT_V3INODES | XFS_FEAT_CRC | XFS_FEAT_PQUOTINO;
 
        /* Optional V5 features */
@@ -1524,7 +1522,8 @@ xfs_fs_geometry(
        geo->version = XFS_FSOP_GEOM_VERSION;
        geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK |
                     XFS_FSOP_GEOM_FLAGS_DIRV2 |
-                    XFS_FSOP_GEOM_FLAGS_EXTFLG;
+                    XFS_FSOP_GEOM_FLAGS_EXTFLG |
+                    XFS_FSOP_GEOM_FLAGS_ATTR2;
        if (xfs_has_attr(mp))
                geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR;
        if (xfs_has_quota(mp))
@@ -1537,8 +1536,6 @@ xfs_fs_geometry(
                geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI;
        if (xfs_has_lazysbcount(mp))
                geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB;
-       if (xfs_has_attr2(mp))
-               geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR2;
        if (xfs_has_projid32(mp))
                geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32;
        if (xfs_has_crc(mp))
index 4cf7abe5014371a5c560a49ff74e71742dd9d8a7..e44040206851fcdbdf174b56b6eec17ed660a883 100644 (file)
@@ -646,8 +646,7 @@ xfs_iget_cache_miss(
                goto out_destroy;
 
        /*
-        * For version 5 superblocks, if we are initialising a new inode and we
-        * are not utilising the XFS_FEAT_IKEEP inode cluster mode, we can
+        * For version 5 superblocks, if we are initialising a new inode, we
         * simply build the new inode core with a random generation number.
         *
         * For version 4 (and older) superblocks, log recovery is dependent on
@@ -655,8 +654,7 @@ xfs_iget_cache_miss(
         * value and hence we must also read the inode off disk even when
         * initializing new inodes.
         */
-       if (xfs_has_v3inodes(mp) &&
-           (flags & XFS_IGET_CREATE) && !xfs_has_ikeep(mp)) {
+       if (xfs_has_v3inodes(mp) && (flags & XFS_IGET_CREATE)) {
                VFS_I(ip)->i_generation = get_random_u32();
        } else {
                struct xfs_buf          *bp;
index dc32c5e34d817616fe60fc4e12c088e4c1774fe3..0953f6ae94abc83eab5ce7a0064c30eba1d6ca51 100644 (file)
@@ -1057,19 +1057,6 @@ xfs_mountfs(
        xfs_inodegc_start(mp);
        xfs_blockgc_start(mp);
 
-       /*
-        * Now that we've recovered any pending superblock feature bit
-        * additions, we can finish setting up the attr2 behaviour for the
-        * mount. The noattr2 option overrides the superblock flag, so only
-        * check the superblock feature flag if the mount option is not set.
-        */
-       if (xfs_has_noattr2(mp)) {
-               mp->m_features &= ~XFS_FEAT_ATTR2;
-       } else if (!xfs_has_attr2(mp) &&
-                  (mp->m_sb.sb_features2 & XFS_SB_VERSION2_ATTR2BIT)) {
-               mp->m_features |= XFS_FEAT_ATTR2;
-       }
-
        if (xfs_has_metadir(mp)) {
                error = xfs_mount_setup_metadir(mp);
                if (error)
index 97de44c32272f256ba25bd2d4652b559b80d4c24..f046d1215b043c918be5599012d9160f3d2a3d50 100644 (file)
@@ -363,7 +363,6 @@ typedef struct xfs_mount {
 #define XFS_FEAT_EXTFLG                (1ULL << 7)     /* unwritten extents */
 #define XFS_FEAT_ASCIICI       (1ULL << 8)     /* ASCII only case-insens. */
 #define XFS_FEAT_LAZYSBCOUNT   (1ULL << 9)     /* Superblk counters */
-#define XFS_FEAT_ATTR2         (1ULL << 10)    /* dynamic attr fork */
 #define XFS_FEAT_PARENT                (1ULL << 11)    /* parent pointers */
 #define XFS_FEAT_PROJID32      (1ULL << 12)    /* 32 bit project id */
 #define XFS_FEAT_CRC           (1ULL << 13)    /* metadata CRCs */
@@ -386,7 +385,6 @@ typedef struct xfs_mount {
 
 /* Mount features */
 #define XFS_FEAT_NOLIFETIME    (1ULL << 47)    /* disable lifetime hints */
-#define XFS_FEAT_NOATTR2       (1ULL << 48)    /* disable attr2 creation */
 #define XFS_FEAT_NOALIGN       (1ULL << 49)    /* ignore alignment */
 #define XFS_FEAT_ALLOCSIZE     (1ULL << 50)    /* user specified allocation size */
 #define XFS_FEAT_LARGE_IOSIZE  (1ULL << 51)    /* report large preferred
@@ -396,7 +394,6 @@ typedef struct xfs_mount {
 #define XFS_FEAT_DISCARD       (1ULL << 54)    /* discard unused blocks */
 #define XFS_FEAT_GRPID         (1ULL << 55)    /* group-ID assigned from directory */
 #define XFS_FEAT_SMALL_INUMS   (1ULL << 56)    /* user wants 32bit inodes */
-#define XFS_FEAT_IKEEP         (1ULL << 57)    /* keep empty inode clusters*/
 #define XFS_FEAT_SWALLOC       (1ULL << 58)    /* stripe width allocation */
 #define XFS_FEAT_FILESTREAMS   (1ULL << 59)    /* use filestreams allocator */
 #define XFS_FEAT_DAX_ALWAYS    (1ULL << 60)    /* DAX always enabled */
@@ -504,12 +501,17 @@ __XFS_HAS_V4_FEAT(align, ALIGN)
 __XFS_HAS_V4_FEAT(logv2, LOGV2)
 __XFS_HAS_V4_FEAT(extflg, EXTFLG)
 __XFS_HAS_V4_FEAT(lazysbcount, LAZYSBCOUNT)
-__XFS_ADD_V4_FEAT(attr2, ATTR2)
 __XFS_ADD_V4_FEAT(projid32, PROJID32)
 __XFS_HAS_V4_FEAT(v3inodes, V3INODES)
 __XFS_HAS_V4_FEAT(crc, CRC)
 __XFS_HAS_V4_FEAT(pquotino, PQUOTINO)
 
+static inline void xfs_add_attr2(struct xfs_mount *mp)
+{
+       if (IS_ENABLED(CONFIG_XFS_SUPPORT_V4))
+               xfs_sb_version_addattr2(&mp->m_sb);
+}
+
 /*
  * Mount features
  *
@@ -517,7 +519,6 @@ __XFS_HAS_V4_FEAT(pquotino, PQUOTINO)
  * bit inodes and read-only state, are kept as operational state rather than
  * features.
  */
-__XFS_HAS_FEAT(noattr2, NOATTR2)
 __XFS_HAS_FEAT(noalign, NOALIGN)
 __XFS_HAS_FEAT(allocsize, ALLOCSIZE)
 __XFS_HAS_FEAT(large_iosize, LARGE_IOSIZE)
@@ -526,7 +527,6 @@ __XFS_HAS_FEAT(dirsync, DIRSYNC)
 __XFS_HAS_FEAT(discard, DISCARD)
 __XFS_HAS_FEAT(grpid, GRPID)
 __XFS_HAS_FEAT(small_inums, SMALL_INUMS)
-__XFS_HAS_FEAT(ikeep, IKEEP)
 __XFS_HAS_FEAT(swalloc, SWALLOC)
 __XFS_HAS_FEAT(filestreams, FILESTREAMS)
 __XFS_HAS_FEAT(dax_always, DAX_ALWAYS)
index bb0a82635a770d48a8562b994fe13eb28b922069..77acb3e5a4eca18b1e6cfdc4cffd94c935faea3c 100644 (file)
@@ -105,8 +105,8 @@ enum {
        Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev,
        Opt_wsync, Opt_noalign, Opt_swalloc, Opt_sunit, Opt_swidth, Opt_nouuid,
        Opt_grpid, Opt_nogrpid, Opt_bsdgroups, Opt_sysvgroups,
-       Opt_allocsize, Opt_norecovery, Opt_inode64, Opt_inode32, Opt_ikeep,
-       Opt_noikeep, Opt_largeio, Opt_nolargeio, Opt_attr2, Opt_noattr2,
+       Opt_allocsize, Opt_norecovery, Opt_inode64, Opt_inode32,
+       Opt_largeio, Opt_nolargeio,
        Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota, Opt_grpquota,
        Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota,
        Opt_uqnoenforce, Opt_gqnoenforce, Opt_pqnoenforce, Opt_qnoenforce,
@@ -133,12 +133,8 @@ static const struct fs_parameter_spec xfs_fs_parameters[] = {
        fsparam_flag("norecovery",      Opt_norecovery),
        fsparam_flag("inode64",         Opt_inode64),
        fsparam_flag("inode32",         Opt_inode32),
-       fsparam_flag("ikeep",           Opt_ikeep),
-       fsparam_flag("noikeep",         Opt_noikeep),
        fsparam_flag("largeio",         Opt_largeio),
        fsparam_flag("nolargeio",       Opt_nolargeio),
-       fsparam_flag("attr2",           Opt_attr2),
-       fsparam_flag("noattr2",         Opt_noattr2),
        fsparam_flag("filestreams",     Opt_filestreams),
        fsparam_flag("quota",           Opt_quota),
        fsparam_flag("noquota",         Opt_noquota),
@@ -175,13 +171,11 @@ xfs_fs_show_options(
 {
        static struct proc_xfs_info xfs_info_set[] = {
                /* the few simple ones we can get from the mount struct */
-               { XFS_FEAT_IKEEP,               ",ikeep" },
                { XFS_FEAT_WSYNC,               ",wsync" },
                { XFS_FEAT_NOALIGN,             ",noalign" },
                { XFS_FEAT_SWALLOC,             ",swalloc" },
                { XFS_FEAT_NOUUID,              ",nouuid" },
                { XFS_FEAT_NORECOVERY,          ",norecovery" },
-               { XFS_FEAT_ATTR2,               ",attr2" },
                { XFS_FEAT_FILESTREAMS,         ",filestreams" },
                { XFS_FEAT_GRPID,               ",grpid" },
                { XFS_FEAT_DISCARD,             ",discard" },
@@ -1087,15 +1081,6 @@ xfs_finish_flags(
                }
        }
 
-       /*
-        * V5 filesystems always use attr2 format for attributes.
-        */
-       if (xfs_has_crc(mp) && xfs_has_noattr2(mp)) {
-               xfs_warn(mp, "Cannot mount a V5 filesystem as noattr2. "
-                            "attr2 is always enabled for V5 filesystems.");
-               return -EINVAL;
-       }
-
        /*
         * prohibit r/w mounts of read-only filesystems
         */
@@ -1542,22 +1527,6 @@ xfs_fs_parse_param(
                return 0;
 #endif
        /* Following mount options will be removed in September 2025 */
-       case Opt_ikeep:
-               xfs_fs_warn_deprecated(fc, param, XFS_FEAT_IKEEP, true);
-               parsing_mp->m_features |= XFS_FEAT_IKEEP;
-               return 0;
-       case Opt_noikeep:
-               xfs_fs_warn_deprecated(fc, param, XFS_FEAT_IKEEP, false);
-               parsing_mp->m_features &= ~XFS_FEAT_IKEEP;
-               return 0;
-       case Opt_attr2:
-               xfs_fs_warn_deprecated(fc, param, XFS_FEAT_ATTR2, true);
-               parsing_mp->m_features |= XFS_FEAT_ATTR2;
-               return 0;
-       case Opt_noattr2:
-               xfs_fs_warn_deprecated(fc, param, XFS_FEAT_NOATTR2, true);
-               parsing_mp->m_features |= XFS_FEAT_NOATTR2;
-               return 0;
        case Opt_max_open_zones:
                parsing_mp->m_max_open_zones = result.uint_32;
                return 0;
@@ -1593,16 +1562,6 @@ xfs_fs_validate_params(
                return -EINVAL;
        }
 
-       /*
-        * We have not read the superblock at this point, so only the attr2
-        * mount option can set the attr2 feature by this stage.
-        */
-       if (xfs_has_attr2(mp) && xfs_has_noattr2(mp)) {
-               xfs_warn(mp, "attr2 and noattr2 cannot both be specified.");
-               return -EINVAL;
-       }
-
-
        if (xfs_has_noalign(mp) && (mp->m_dalign || mp->m_swidth)) {
                xfs_warn(mp,
        "sunit and swidth options incompatible with the noalign option");
@@ -2177,21 +2136,6 @@ xfs_fs_reconfigure(
        if (error)
                return error;
 
-       /* attr2 -> noattr2 */
-       if (xfs_has_noattr2(new_mp)) {
-               if (xfs_has_crc(mp)) {
-                       xfs_warn(mp,
-                       "attr2 is always enabled for a V5 filesystem - can't be changed.");
-                       return -EINVAL;
-               }
-               mp->m_features &= ~XFS_FEAT_ATTR2;
-               mp->m_features |= XFS_FEAT_NOATTR2;
-       } else if (xfs_has_attr2(new_mp)) {
-               /* noattr2 -> attr2 */
-               mp->m_features &= ~XFS_FEAT_NOATTR2;
-               mp->m_features |= XFS_FEAT_ATTR2;
-       }
-
        /* Validate new max_atomic_write option before making other changes */
        if (mp->m_awu_max_bytes != new_mp->m_awu_max_bytes) {
                error = xfs_set_max_atomic_write_opt(mp,