xfs: remove deprecated mount options

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>
This commit is contained in:
Darrick J. Wong 2025-09-02 14:33:53 -07:00
parent f69260511c
commit b9a176e541
9 changed files with 25 additions and 142 deletions

View 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 to the file. Specifying a fixed ``allocsize`` value turns off
the dynamic behaviour. 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) discard or nodiscard (default)
Enable/disable the issuing of commands to let the block Enable/disable the issuing of commands to let the block
device reclaim space freed by the filesystem. This is 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 across the entire filesystem rather than just on directories
configured to use it. 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) inode32 or inode64 (default)
When ``inode32`` is specified, it indicates that XFS limits When ``inode32`` is specified, it indicates that XFS limits
inode creation to locations which will not result in inode inode creation to locations which will not result in inode
@ -267,8 +245,6 @@ Deprecated Mount Options
============================ ================ ============================ ================
Mounting with V4 filesystem September 2030 Mounting with V4 filesystem September 2030
Mounting ascii-ci 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 osyncisdsync/osyncisosync v4.0
barrier v4.19 barrier v4.19
nobarrier v4.19 nobarrier v4.19
ikeep/noikeep v6.18
attr2/noattr2 v6.18
=========================== ======= =========================== =======
sysctls sysctls

View File

@ -667,12 +667,8 @@ xfs_attr_shortform_bytesfit(
/* /*
* For attr2 we can try to move the forkoff if there is space in the * 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 * literal area
* space in the fixed attribute fork.
*/ */
if (!xfs_has_attr2(mp))
return 0;
dsize = dp->i_df.if_bytes; dsize = dp->i_df.if_bytes;
switch (dp->i_df.if_format) { switch (dp->i_df.if_format) {
@ -723,22 +719,16 @@ xfs_attr_shortform_bytesfit(
} }
/* /*
* Switch on the ATTR2 superblock bit (implies also FEATURES2) unless: * Switch on the ATTR2 superblock bit (implies also FEATURES2) unless
* - noattr2 mount option is set, * on-disk version bit says it is already 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 STATIC void
xfs_sbversion_add_attr2( xfs_sbversion_add_attr2(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_trans *tp) struct xfs_trans *tp)
{ {
if (xfs_has_noattr2(mp))
return;
if (mp->m_sb.sb_features2 & XFS_SB_VERSION2_ATTR2BIT) if (mp->m_sb.sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
return; return;
if (!xfs_has_attr2(mp))
return;
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
xfs_add_attr2(mp); xfs_add_attr2(mp);
@ -889,7 +879,7 @@ xfs_attr_sf_removename(
/* /*
* Fix up the start offset of the attribute fork * 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) && (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
!(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE)) && !(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE)) &&
!xfs_has_parent(mp)) { !xfs_has_parent(mp)) {
@ -900,7 +890,6 @@ xfs_attr_sf_removename(
ASSERT(dp->i_forkoff); ASSERT(dp->i_forkoff);
ASSERT(totsize > sizeof(struct xfs_attr_sf_hdr) || ASSERT(totsize > sizeof(struct xfs_attr_sf_hdr) ||
(args->op_flags & XFS_DA_OP_ADDNAME) || (args->op_flags & XFS_DA_OP_ADDNAME) ||
!xfs_has_attr2(mp) ||
dp->i_df.if_format == XFS_DINODE_FMT_BTREE || dp->i_df.if_format == XFS_DINODE_FMT_BTREE ||
xfs_has_parent(mp)); xfs_has_parent(mp));
xfs_trans_log_inode(args->trans, dp, xfs_trans_log_inode(args->trans, dp,
@ -1040,8 +1029,7 @@ xfs_attr_shortform_allfit(
bytes += xfs_attr_sf_entsize_byname(name_loc->namelen, bytes += xfs_attr_sf_entsize_byname(name_loc->namelen,
be16_to_cpu(name_loc->valuelen)); be16_to_cpu(name_loc->valuelen));
} }
if (xfs_has_attr2(dp->i_mount) && if ((dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
(dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
(bytes == sizeof(struct xfs_attr_sf_hdr))) (bytes == sizeof(struct xfs_attr_sf_hdr)))
return -1; return -1;
return xfs_attr_shortform_bytesfit(dp, bytes); return xfs_attr_shortform_bytesfit(dp, bytes);
@ -1161,7 +1149,6 @@ xfs_attr3_leaf_to_shortform(
* this case. * this case.
*/ */
if (!(args->op_flags & XFS_DA_OP_REPLACE)) { 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); ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
xfs_attr_fork_remove(dp, args->trans); xfs_attr_fork_remove(dp, args->trans);
} }

View File

@ -997,8 +997,7 @@ xfs_bmap_add_attrfork_local(
static int static int
xfs_bmap_set_attrforkoff( xfs_bmap_set_attrforkoff(
struct xfs_inode *ip, struct xfs_inode *ip,
int size, int size)
int *version)
{ {
int default_size = xfs_default_attroffset(ip) >> 3; 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); ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size);
if (!ip->i_forkoff) if (!ip->i_forkoff)
ip->i_forkoff = default_size; ip->i_forkoff = default_size;
else if (xfs_has_attr2(ip->i_mount) && version)
*version = 2;
break; break;
default: default:
ASSERT(0); ASSERT(0);
@ -1035,7 +1032,6 @@ xfs_bmap_add_attrfork(
int rsvd) /* xact may use reserved blks */ int rsvd) /* xact may use reserved blks */
{ {
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
int version = 1; /* superblock attr version */
int logflags; /* logging flags */ int logflags; /* logging flags */
int error; /* error return value */ int error; /* error return value */
@ -1045,7 +1041,7 @@ xfs_bmap_add_attrfork(
ASSERT(!xfs_inode_has_attr_fork(ip)); ASSERT(!xfs_inode_has_attr_fork(ip));
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 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) if (error)
return error; return error;
@ -1069,16 +1065,12 @@ xfs_bmap_add_attrfork(
xfs_trans_log_inode(tp, ip, logflags); xfs_trans_log_inode(tp, ip, logflags);
if (error) if (error)
return error; return error;
if (!xfs_has_attr(mp) || if (!xfs_has_attr(mp)) {
(!xfs_has_attr2(mp) && version == 2)) {
bool log_sb = false; bool log_sb = false;
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
if (!xfs_has_attr(mp)) { if (!xfs_has_attr(mp)) {
xfs_add_attr(mp); xfs_add_attr(mp);
log_sb = true;
}
if (!xfs_has_attr2(mp) && version == 2) {
xfs_add_attr2(mp); xfs_add_attr2(mp);
log_sb = true; log_sb = true;
} }

View File

@ -2140,7 +2140,7 @@ xfs_difree_inobt(
* remove the chunk if the block size is large enough for multiple inode * remove the chunk if the block size is large enough for multiple inode
* chunks (that might not be free). * 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) { mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
xic->deleted = true; xic->deleted = true;
xic->first_ino = xfs_agino_to_ino(pag, rec.ir_startino); 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 * enough for multiple chunks. Leave the finobt record to remain in sync
* with the inobt. * 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) { mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
error = xfs_btree_delete(cur, &i); error = xfs_btree_delete(cur, &i);
if (error) if (error)

View File

@ -142,8 +142,6 @@ xfs_sb_version_to_features(
if (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) { if (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) {
if (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT) if (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)
features |= XFS_FEAT_LAZYSBCOUNT; features |= XFS_FEAT_LAZYSBCOUNT;
if (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
features |= XFS_FEAT_ATTR2;
if (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT) if (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)
features |= XFS_FEAT_PROJID32; features |= XFS_FEAT_PROJID32;
if (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE) if (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)
@ -155,7 +153,7 @@ xfs_sb_version_to_features(
/* Always on V5 features */ /* Always on V5 features */
features |= XFS_FEAT_ALIGN | XFS_FEAT_LOGV2 | XFS_FEAT_EXTFLG | 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; XFS_FEAT_V3INODES | XFS_FEAT_CRC | XFS_FEAT_PQUOTINO;
/* Optional V5 features */ /* Optional V5 features */
@ -1524,7 +1522,8 @@ xfs_fs_geometry(
geo->version = XFS_FSOP_GEOM_VERSION; geo->version = XFS_FSOP_GEOM_VERSION;
geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK |
XFS_FSOP_GEOM_FLAGS_DIRV2 | 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)) if (xfs_has_attr(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR; geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR;
if (xfs_has_quota(mp)) if (xfs_has_quota(mp))
@ -1537,8 +1536,6 @@ xfs_fs_geometry(
geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI; geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI;
if (xfs_has_lazysbcount(mp)) if (xfs_has_lazysbcount(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB; geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB;
if (xfs_has_attr2(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR2;
if (xfs_has_projid32(mp)) if (xfs_has_projid32(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32; geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32;
if (xfs_has_crc(mp)) if (xfs_has_crc(mp))

View File

@ -646,8 +646,7 @@ xfs_iget_cache_miss(
goto out_destroy; goto out_destroy;
/* /*
* For version 5 superblocks, if we are initialising a new inode and we * For version 5 superblocks, if we are initialising a new inode, we
* are not utilising the XFS_FEAT_IKEEP inode cluster mode, we can
* simply build the new inode core with a random generation number. * simply build the new inode core with a random generation number.
* *
* For version 4 (and older) superblocks, log recovery is dependent on * 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 * value and hence we must also read the inode off disk even when
* initializing new inodes. * initializing new inodes.
*/ */
if (xfs_has_v3inodes(mp) && if (xfs_has_v3inodes(mp) && (flags & XFS_IGET_CREATE)) {
(flags & XFS_IGET_CREATE) && !xfs_has_ikeep(mp)) {
VFS_I(ip)->i_generation = get_random_u32(); VFS_I(ip)->i_generation = get_random_u32();
} else { } else {
struct xfs_buf *bp; struct xfs_buf *bp;

View File

@ -1057,19 +1057,6 @@ xfs_mountfs(
xfs_inodegc_start(mp); xfs_inodegc_start(mp);
xfs_blockgc_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)) { if (xfs_has_metadir(mp)) {
error = xfs_mount_setup_metadir(mp); error = xfs_mount_setup_metadir(mp);
if (error) if (error)

View File

@ -363,7 +363,6 @@ typedef struct xfs_mount {
#define XFS_FEAT_EXTFLG (1ULL << 7) /* unwritten extents */ #define XFS_FEAT_EXTFLG (1ULL << 7) /* unwritten extents */
#define XFS_FEAT_ASCIICI (1ULL << 8) /* ASCII only case-insens. */ #define XFS_FEAT_ASCIICI (1ULL << 8) /* ASCII only case-insens. */
#define XFS_FEAT_LAZYSBCOUNT (1ULL << 9) /* Superblk counters */ #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_PARENT (1ULL << 11) /* parent pointers */
#define XFS_FEAT_PROJID32 (1ULL << 12) /* 32 bit project id */ #define XFS_FEAT_PROJID32 (1ULL << 12) /* 32 bit project id */
#define XFS_FEAT_CRC (1ULL << 13) /* metadata CRCs */ #define XFS_FEAT_CRC (1ULL << 13) /* metadata CRCs */
@ -386,7 +385,6 @@ typedef struct xfs_mount {
/* Mount features */ /* Mount features */
#define XFS_FEAT_NOLIFETIME (1ULL << 47) /* disable lifetime hints */ #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_NOALIGN (1ULL << 49) /* ignore alignment */
#define XFS_FEAT_ALLOCSIZE (1ULL << 50) /* user specified allocation size */ #define XFS_FEAT_ALLOCSIZE (1ULL << 50) /* user specified allocation size */
#define XFS_FEAT_LARGE_IOSIZE (1ULL << 51) /* report large preferred #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_DISCARD (1ULL << 54) /* discard unused blocks */
#define XFS_FEAT_GRPID (1ULL << 55) /* group-ID assigned from directory */ #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_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_SWALLOC (1ULL << 58) /* stripe width allocation */
#define XFS_FEAT_FILESTREAMS (1ULL << 59) /* use filestreams allocator */ #define XFS_FEAT_FILESTREAMS (1ULL << 59) /* use filestreams allocator */
#define XFS_FEAT_DAX_ALWAYS (1ULL << 60) /* DAX always enabled */ #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(logv2, LOGV2)
__XFS_HAS_V4_FEAT(extflg, EXTFLG) __XFS_HAS_V4_FEAT(extflg, EXTFLG)
__XFS_HAS_V4_FEAT(lazysbcount, LAZYSBCOUNT) __XFS_HAS_V4_FEAT(lazysbcount, LAZYSBCOUNT)
__XFS_ADD_V4_FEAT(attr2, ATTR2)
__XFS_ADD_V4_FEAT(projid32, PROJID32) __XFS_ADD_V4_FEAT(projid32, PROJID32)
__XFS_HAS_V4_FEAT(v3inodes, V3INODES) __XFS_HAS_V4_FEAT(v3inodes, V3INODES)
__XFS_HAS_V4_FEAT(crc, CRC) __XFS_HAS_V4_FEAT(crc, CRC)
__XFS_HAS_V4_FEAT(pquotino, PQUOTINO) __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 * 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 * bit inodes and read-only state, are kept as operational state rather than
* features. * features.
*/ */
__XFS_HAS_FEAT(noattr2, NOATTR2)
__XFS_HAS_FEAT(noalign, NOALIGN) __XFS_HAS_FEAT(noalign, NOALIGN)
__XFS_HAS_FEAT(allocsize, ALLOCSIZE) __XFS_HAS_FEAT(allocsize, ALLOCSIZE)
__XFS_HAS_FEAT(large_iosize, LARGE_IOSIZE) __XFS_HAS_FEAT(large_iosize, LARGE_IOSIZE)
@ -526,7 +527,6 @@ __XFS_HAS_FEAT(dirsync, DIRSYNC)
__XFS_HAS_FEAT(discard, DISCARD) __XFS_HAS_FEAT(discard, DISCARD)
__XFS_HAS_FEAT(grpid, GRPID) __XFS_HAS_FEAT(grpid, GRPID)
__XFS_HAS_FEAT(small_inums, SMALL_INUMS) __XFS_HAS_FEAT(small_inums, SMALL_INUMS)
__XFS_HAS_FEAT(ikeep, IKEEP)
__XFS_HAS_FEAT(swalloc, SWALLOC) __XFS_HAS_FEAT(swalloc, SWALLOC)
__XFS_HAS_FEAT(filestreams, FILESTREAMS) __XFS_HAS_FEAT(filestreams, FILESTREAMS)
__XFS_HAS_FEAT(dax_always, DAX_ALWAYS) __XFS_HAS_FEAT(dax_always, DAX_ALWAYS)

View File

@ -105,8 +105,8 @@ enum {
Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev, Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev,
Opt_wsync, Opt_noalign, Opt_swalloc, Opt_sunit, Opt_swidth, Opt_nouuid, Opt_wsync, Opt_noalign, Opt_swalloc, Opt_sunit, Opt_swidth, Opt_nouuid,
Opt_grpid, Opt_nogrpid, Opt_bsdgroups, Opt_sysvgroups, Opt_grpid, Opt_nogrpid, Opt_bsdgroups, Opt_sysvgroups,
Opt_allocsize, Opt_norecovery, Opt_inode64, Opt_inode32, Opt_ikeep, Opt_allocsize, Opt_norecovery, Opt_inode64, Opt_inode32,
Opt_noikeep, Opt_largeio, Opt_nolargeio, Opt_attr2, Opt_noattr2, Opt_largeio, Opt_nolargeio,
Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota, Opt_grpquota, Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota, Opt_grpquota,
Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota, Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota,
Opt_uqnoenforce, Opt_gqnoenforce, Opt_pqnoenforce, Opt_qnoenforce, 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("norecovery", Opt_norecovery),
fsparam_flag("inode64", Opt_inode64), fsparam_flag("inode64", Opt_inode64),
fsparam_flag("inode32", Opt_inode32), fsparam_flag("inode32", Opt_inode32),
fsparam_flag("ikeep", Opt_ikeep),
fsparam_flag("noikeep", Opt_noikeep),
fsparam_flag("largeio", Opt_largeio), fsparam_flag("largeio", Opt_largeio),
fsparam_flag("nolargeio", Opt_nolargeio), fsparam_flag("nolargeio", Opt_nolargeio),
fsparam_flag("attr2", Opt_attr2),
fsparam_flag("noattr2", Opt_noattr2),
fsparam_flag("filestreams", Opt_filestreams), fsparam_flag("filestreams", Opt_filestreams),
fsparam_flag("quota", Opt_quota), fsparam_flag("quota", Opt_quota),
fsparam_flag("noquota", Opt_noquota), fsparam_flag("noquota", Opt_noquota),
@ -175,13 +171,11 @@ xfs_fs_show_options(
{ {
static struct proc_xfs_info xfs_info_set[] = { static struct proc_xfs_info xfs_info_set[] = {
/* the few simple ones we can get from the mount struct */ /* the few simple ones we can get from the mount struct */
{ XFS_FEAT_IKEEP, ",ikeep" },
{ XFS_FEAT_WSYNC, ",wsync" }, { XFS_FEAT_WSYNC, ",wsync" },
{ XFS_FEAT_NOALIGN, ",noalign" }, { XFS_FEAT_NOALIGN, ",noalign" },
{ XFS_FEAT_SWALLOC, ",swalloc" }, { XFS_FEAT_SWALLOC, ",swalloc" },
{ XFS_FEAT_NOUUID, ",nouuid" }, { XFS_FEAT_NOUUID, ",nouuid" },
{ XFS_FEAT_NORECOVERY, ",norecovery" }, { XFS_FEAT_NORECOVERY, ",norecovery" },
{ XFS_FEAT_ATTR2, ",attr2" },
{ XFS_FEAT_FILESTREAMS, ",filestreams" }, { XFS_FEAT_FILESTREAMS, ",filestreams" },
{ XFS_FEAT_GRPID, ",grpid" }, { XFS_FEAT_GRPID, ",grpid" },
{ XFS_FEAT_DISCARD, ",discard" }, { 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 * prohibit r/w mounts of read-only filesystems
*/ */
@ -1542,22 +1527,6 @@ xfs_fs_parse_param(
return 0; return 0;
#endif #endif
/* Following mount options will be removed in September 2025 */ /* 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: case Opt_max_open_zones:
parsing_mp->m_max_open_zones = result.uint_32; parsing_mp->m_max_open_zones = result.uint_32;
return 0; return 0;
@ -1593,16 +1562,6 @@ xfs_fs_validate_params(
return -EINVAL; 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)) { if (xfs_has_noalign(mp) && (mp->m_dalign || mp->m_swidth)) {
xfs_warn(mp, xfs_warn(mp,
"sunit and swidth options incompatible with the noalign option"); "sunit and swidth options incompatible with the noalign option");
@ -2177,21 +2136,6 @@ xfs_fs_reconfigure(
if (error) if (error)
return 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 */ /* Validate new max_atomic_write option before making other changes */
if (mp->m_awu_max_bytes != new_mp->m_awu_max_bytes) { if (mp->m_awu_max_bytes != new_mp->m_awu_max_bytes) {
error = xfs_set_max_atomic_write_opt(mp, error = xfs_set_max_atomic_write_opt(mp,