From: "Darrick J. Wong" <djwong@kernel.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 03/16] xfs: rework attr2 feature and mount options
Date: Wed, 14 Jul 2021 15:51:03 -0700 [thread overview]
Message-ID: <20210714225103.GV22402@magnolia> (raw)
In-Reply-To: <20210714041912.2625692-4-david@fromorbit.com>
On Wed, Jul 14, 2021 at 02:18:59PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> The attr2 feature is someone unique in that it has both a superblock
s/someone/somewhat/
> feature bit to enable it and mount options to enable and disable it.
>
> Back when it was first introduced in 2005, attr2 was disabled unless
> either the attr2 superblock feature bit was set, or the attr2 mount
> option was set. If the superblock feature bit was not set but the
> mount option was set, then when the first attr2 format inode fork
> was created, it would set the superblock feature bit. This is as it
> should be - the superblock feature bit indicated the presence of the
> attr2 on disk format.
>
> The noattr2 mount option, however, did not affect the superblock
> feature bit. If noattr2 was specified, the on-disk superblock
> feature bit was ignored and the code always just created attr1
> format inode forks. If neither of the attr2 or noattr2 mounts
> option were specified, then the behaviour was determined by the
> superblock feature bit.
>
> This was all pretty sane.
>
> Fast foward 3 years, and we are dealing with fallout from the
> botched sb_features2 addition and having to deal with feature
> mismatches between the sb_features2 and sb_bad_features2 fields. The
> attr2 feature bit was one of these flags. The reconciliation was
> done well after mount option parsing and, unfortunately, the feature
> reconcilliation had a bug where it ignored the noattr2 mount option.
"reconciliation.."
> For reasons lost to the mists of time, it was decided that resolving
> this issue in commit 7c12f296500e ("[XFS] Fix up noattr2 so that it
> will properly update the versionnum and features2 fields.") required
> noattr2 to clear the superblock attr2 feature bit. This greatly
> complicated the attr2 behaviour and broke rules about feature bits
> needing to be set when those specific features are present in the
> filesystem.
Yikes, WTH.
> By complicated, I mean that it introduced problems due to feature
> bit interactions with log recovery. All of the superblock feature
> bit checks are done prior to log recovery, but if we crash after
> removing a feature bit, then on the next mount we see the feature
> bit in the unrecovered superblock, only to have it go away after the
> log has been replayed. This means our mount time feature processing
> could be all wrong.
>
> Hence you can mount with noattr2, crash shortly afterwards, and
> mount again without attr2 or noattr2 and still have attr2 enabled
> because the second mount sees attr2 still enabled in the superblock
> before recovery runs and removes the feature bit. It's just a mess.
>
> Further, this is all legacy code as the v5 format requires attr2 to
> be enabled at al times and it cannot be disabled. i.e. the noattr2
"..at all times..."
> mount option returns an error when used on v5 format filesystems.
>
> To straighten this all out, this patch reverts the attr2/noattr2
> mount option behaviour back to the original behaviour. There is no
> reason for disabling attr2 these days, so we will only do this when
> the noattr2 mount option is set. This will not remove the superblock
> feature bit. The superblock bit will provide the default behaviour
> and only track whether attr2 is present on disk or not. The attr2
> mount option will enable the creation of attr2 format inode forks,
> and if the superblock feature bit is not set it will be added when
> the first attr2 inode fork is created.
...and the whole V4 format is clanking towards deprecation anyway. :)
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
With the commit message fixed up and Christoph's other suggestions
resolved,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> fs/xfs/libxfs/xfs_format.h | 7 -------
> fs/xfs/xfs_mount.c | 27 ++++++++++-----------------
> fs/xfs/xfs_super.c | 16 +++++++---------
> 3 files changed, 17 insertions(+), 33 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h
> index 76e2461b9e66..a8215bf478b2 100644
> --- a/fs/xfs/libxfs/xfs_format.h
> +++ b/fs/xfs/libxfs/xfs_format.h
> @@ -398,13 +398,6 @@ static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
> sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
> }
>
> -static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp)
> -{
> - sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
> - if (!sbp->sb_features2)
> - sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
> -}
> -
> static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp)
> {
> return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index d0755494597f..6be2a1c5b0f4 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -607,25 +607,8 @@ xfs_mountfs(
> xfs_warn(mp, "correcting sb_features alignment problem");
> sbp->sb_features2 |= sbp->sb_bad_features2;
> mp->m_update_sb = true;
> -
> - /*
> - * Re-check for ATTR2 in case it was found in bad_features2
> - * slot.
> - */
> - if (xfs_sb_version_hasattr2(&mp->m_sb) &&
> - !(mp->m_flags & XFS_MOUNT_NOATTR2))
> - mp->m_flags |= XFS_MOUNT_ATTR2;
> }
>
> - if (xfs_sb_version_hasattr2(&mp->m_sb) &&
> - (mp->m_flags & XFS_MOUNT_NOATTR2)) {
> - xfs_sb_version_removeattr2(&mp->m_sb);
> - mp->m_update_sb = true;
> -
> - /* update sb_versionnum for the clearing of the morebits */
> - if (!sbp->sb_features2)
> - mp->m_update_sb = true;
> - }
>
> /* always use v2 inodes by default now */
> if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) {
> @@ -782,6 +765,16 @@ xfs_mountfs(
> if (error)
> goto out_log_dealloc;
>
> + /*
> + * Now that we've recovered any pending superblock feature bit
> + * additions, we can finish setting up the attr2 behaviour for the
> + * mount. If no attr2 mount options were specified, the we use the
> + * behaviour specified by the superblock feature bit.
> + */
> + if (!(mp->m_flags & (XFS_MOUNT_ATTR2|XFS_MOUNT_NOATTR2)) &&
> + xfs_sb_version_hasattr2(&mp->m_sb))
> + mp->m_flags |= XFS_MOUNT_ATTR2;
> +
> /*
> * Get and sanity-check the root inode.
> * Save the pointer to it in the mount structure.
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 29bec1f6476e..eba25dd4bdb7 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -945,14 +945,6 @@ xfs_finish_flags(
> return -EINVAL;
> }
>
> - /*
> - * mkfs'ed attr2 will turn on attr2 mount unless explicitly
> - * told by noattr2 to turn it off
> - */
> - if (xfs_sb_version_hasattr2(&mp->m_sb) &&
> - !(mp->m_flags & XFS_MOUNT_NOATTR2))
> - mp->m_flags |= XFS_MOUNT_ATTR2;
> -
> /*
> * prohibit r/w mounts of read-only filesystems
> */
> @@ -1288,7 +1280,6 @@ xfs_fs_parse_param(
> return 0;
> case Opt_noattr2:
> xfs_fs_warn_deprecated(fc, param, XFS_MOUNT_NOATTR2, true);
> - parsing_mp->m_flags &= ~XFS_MOUNT_ATTR2;
> parsing_mp->m_flags |= XFS_MOUNT_NOATTR2;
> return 0;
> default:
> @@ -1312,6 +1303,13 @@ xfs_fs_validate_params(
> return -EINVAL;
> }
>
> + if ((mp->m_flags & (XFS_MOUNT_ATTR2|XFS_MOUNT_NOATTR2)) ==
> + (XFS_MOUNT_ATTR2|XFS_MOUNT_NOATTR2)) {
> + xfs_warn(mp, "attr2 and noattr2 cannot both be specified.");
> + return -EINVAL;
> + }
> +
> +
> if ((mp->m_flags & XFS_MOUNT_NOALIGN) &&
> (mp->m_dalign || mp->m_swidth)) {
> xfs_warn(mp,
> --
> 2.31.1
>
next prev parent reply other threads:[~2021-07-14 22:51 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-14 4:18 [PATCH 00/16] xfs: rework feature flags Dave Chinner
2021-07-14 4:18 ` [PATCH 01/16] xfs: sb verifier doesn't handle uncached sb buffer Dave Chinner
2021-07-14 6:43 ` Christoph Hellwig
2021-07-14 9:37 ` Dave Chinner
2021-07-14 22:44 ` Darrick J. Wong
2021-07-14 23:00 ` Dave Chinner
2021-07-14 23:03 ` Darrick J. Wong
2021-07-14 4:18 ` [PATCH 02/16] xfs: rename xfs_has_attr() Dave Chinner
2021-07-14 6:49 ` Christoph Hellwig
2021-07-14 22:46 ` Darrick J. Wong
2021-07-14 4:18 ` [PATCH 03/16] xfs: rework attr2 feature and mount options Dave Chinner
2021-07-14 6:58 ` Christoph Hellwig
2021-07-14 9:45 ` Dave Chinner
2021-07-15 5:55 ` Christoph Hellwig
2021-07-15 23:47 ` Dave Chinner
2021-07-16 9:43 ` Christoph Hellwig
2021-07-14 22:51 ` Darrick J. Wong [this message]
2021-07-14 4:19 ` [PATCH 04/16] xfs: reflect sb features in xfs_mount Dave Chinner
2021-07-14 7:01 ` Christoph Hellwig
2021-07-14 22:56 ` Darrick J. Wong
2021-07-14 23:07 ` Dave Chinner
2021-07-14 23:17 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 05/16] xfs: replace xfs_sb_version checks with feature flag checks Dave Chinner
2021-07-14 7:03 ` Christoph Hellwig
2021-07-14 22:57 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 06/16] xfs: consolidate mount option features in m_features Dave Chinner
2021-07-14 7:05 ` Christoph Hellwig
2021-07-14 9:55 ` Dave Chinner
2021-07-15 5:59 ` Christoph Hellwig
2021-07-15 23:43 ` Dave Chinner
2021-07-14 23:02 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 07/16] xfs: convert mount flags to features Dave Chinner
2021-07-14 23:07 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 08/16] xfs: convert remaining mount flags to state flags Dave Chinner
2021-07-14 23:10 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 09/16] xfs: replace XFS_FORCED_SHUTDOWN with xfs_is_shutdown Dave Chinner
2021-07-14 23:11 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 10/16] xfs: convert xfs_fs_geometry to use mount feature checks Dave Chinner
2021-07-14 7:11 ` Christoph Hellwig
2021-07-14 23:15 ` Darrick J. Wong
2021-07-14 23:35 ` Dave Chinner
2021-07-14 23:38 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 11/16] xfs: open code sb verifier " Dave Chinner
2021-07-14 7:19 ` Christoph Hellwig
2021-07-16 0:26 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 12/16] xfs: convert scrub to use mount-based " Dave Chinner
2021-07-14 23:18 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 13/16] xfs: convert xfs_sb_version_has checks to use mount features Dave Chinner
2021-07-14 23:19 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 14/16] xfs: remove unused xfs_sb_version_has wrappers Dave Chinner
2021-07-14 23:21 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 15/16] xfs: introduce xfs_sb_is_v5 helper Dave Chinner
2021-07-14 23:24 ` Darrick J. Wong
2021-07-14 4:19 ` [PATCH 16/16] xfs: kill xfs_sb_version_has_v3inode() Dave Chinner
2021-07-14 23:24 ` Darrick J. Wong
-- strict thread matches above, loose matches on Subject: below --
2021-08-10 5:24 [PATCH 00/16 v2] xfs: rework feature flags Dave Chinner
2021-08-10 5:24 ` [PATCH 03/16] xfs: rework attr2 feature and mount options Dave Chinner
2021-08-11 23:04 ` Darrick J. Wong
2021-08-18 1:18 ` Dave Chinner
2021-08-12 0:27 ` Darrick J. Wong
2021-08-18 1:25 ` Dave Chinner
2021-08-18 23:59 [PATCH 00/16 v3] xfs: rework feature flags Dave Chinner
2021-08-18 23:59 ` [PATCH 03/16] xfs: rework attr2 feature and mount options Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210714225103.GV22402@magnolia \
--to=djwong@kernel.org \
--cc=david@fromorbit.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.