linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ian Kent <raven@themaw.net>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs <linux-xfs@vger.kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	Brian Foster <bfoster@redhat.com>,
	Eric Sandeen <sandeen@sandeen.net>,
	David Howells <dhowells@redhat.com>,
	Dave Chinner <dchinner@redhat.com>,
	Al Viro <viro@ZenIV.linux.org.uk>
Subject: Re: [PATCH v8 14/16] xfs: move xfs_fc_reconfigure() above xfs_fc_free()
Date: Sat, 02 Nov 2019 12:48:00 +0800	[thread overview]
Message-ID: <dcc36cb56b2b8a27fe6a9cecf6dc91fee6750c25.camel@themaw.net> (raw)
In-Reply-To: <20191101201635.GH15222@magnolia>

On Fri, 2019-11-01 at 13:16 -0700, Darrick J. Wong wrote:
> On Fri, Nov 01, 2019 at 03:51:16PM +0800, Ian Kent wrote:
> > Grouping the options parsing and mount handling functions above the
> > struct fs_context_operations but below the struct super_operations
> > should improve (some) the grouping of the super operations while
> > also
> > improving the grouping of the options parsing and mount handling
> > code.
> > 
> > Start by moving xfs_fc_reconfigure() and friends.
> > 
> > Signed-off-by: Ian Kent <raven@themaw.net>
> 
> No functional changes, right?  I didn't see any...

Yeah, it seemed sensible to do this after all the changes were
done since that way there's better visibility of what's actually
changing and these three patches just move code to a gain better
locality.

Locating this code here does seem to result in quite good locality
and removes quite a bit of noise from the remaining code for a
readability improvement there too.

Overall it appears to be a good choice.

> 
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> 
> --D
> 
> > ---
> >  fs/xfs/xfs_super.c |  324 ++++++++++++++++++++++++++------------
> > --------------
> >  1 file changed, 162 insertions(+), 162 deletions(-)
> > 
> > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> > index bed914bc087b..9c5ea74dbfd5 100644
> > --- a/fs/xfs/xfs_super.c
> > +++ b/fs/xfs/xfs_super.c
> > @@ -1139,168 +1139,6 @@ xfs_quiesce_attr(
> >  	xfs_log_quiesce(mp);
> >  }
> >  
> > -static int
> > -xfs_remount_rw(
> > -	struct xfs_mount	*mp)
> > -{
> > -	struct xfs_sb		*sbp = &mp->m_sb;
> > -	int error;
> > -
> > -	if (mp->m_flags & XFS_MOUNT_NORECOVERY) {
> > -		xfs_warn(mp,
> > -			"ro->rw transition prohibited on norecovery
> > mount");
> > -		return -EINVAL;
> > -	}
> > -
> > -	if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
> > -	    xfs_sb_has_ro_compat_feature(sbp,
> > XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
> > -		xfs_warn(mp,
> > -	"ro->rw transition prohibited on unknown (0x%x) ro-compat
> > filesystem",
> > -			(sbp->sb_features_ro_compat &
> > -				XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
> > -		return -EINVAL;
> > -	}
> > -
> > -	mp->m_flags &= ~XFS_MOUNT_RDONLY;
> > -
> > -	/*
> > -	 * If this is the first remount to writeable state we might
> > have some
> > -	 * superblock changes to update.
> > -	 */
> > -	if (mp->m_update_sb) {
> > -		error = xfs_sync_sb(mp, false);
> > -		if (error) {
> > -			xfs_warn(mp, "failed to write sb changes");
> > -			return error;
> > -		}
> > -		mp->m_update_sb = false;
> > -	}
> > -
> > -	/*
> > -	 * Fill out the reserve pool if it is empty. Use the stashed
> > value if
> > -	 * it is non-zero, otherwise go with the default.
> > -	 */
> > -	xfs_restore_resvblks(mp);
> > -	xfs_log_work_queue(mp);
> > -
> > -	/* Recover any CoW blocks that never got remapped. */
> > -	error = xfs_reflink_recover_cow(mp);
> > -	if (error) {
> > -		xfs_err(mp,
> > -			"Error %d recovering leftover CoW
> > allocations.", error);
> > -			xfs_force_shutdown(mp,
> > SHUTDOWN_CORRUPT_INCORE);
> > -		return error;
> > -	}
> > -	xfs_start_block_reaping(mp);
> > -
> > -	/* Create the per-AG metadata reservation pool .*/
> > -	error = xfs_fs_reserve_ag_blocks(mp);
> > -	if (error && error != -ENOSPC)
> > -		return error;
> > -
> > -	return 0;
> > -}
> > -
> > -static int
> > -xfs_remount_ro(
> > -	struct xfs_mount	*mp)
> > -{
> > -	int error;
> > -
> > -	/*
> > -	 * Cancel background eofb scanning so it cannot race with the
> > final
> > -	 * log force+buftarg wait and deadlock the remount.
> > -	 */
> > -	xfs_stop_block_reaping(mp);
> > -
> > -	/* Get rid of any leftover CoW reservations... */
> > -	error = xfs_icache_free_cowblocks(mp, NULL);
> > -	if (error) {
> > -		xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
> > -		return error;
> > -	}
> > -
> > -	/* Free the per-AG metadata reservation pool. */
> > -	error = xfs_fs_unreserve_ag_blocks(mp);
> > -	if (error) {
> > -		xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
> > -		return error;
> > -	}
> > -
> > -	/*
> > -	 * Before we sync the metadata, we need to free up the reserve
> > block
> > -	 * pool so that the used block count in the superblock on disk
> > is
> > -	 * correct at the end of the remount. Stash the current*
> > reserve pool
> > -	 * size so that if we get remounted rw, we can return it to the
> > same
> > -	 * size.
> > -	 */
> > -	xfs_save_resvblks(mp);
> > -
> > -	xfs_quiesce_attr(mp);
> > -	mp->m_flags |= XFS_MOUNT_RDONLY;
> > -
> > -	return 0;
> > -}
> > -
> > -/*
> > - * Logically we would return an error here to prevent users from
> > believing
> > - * they might have changed mount options using remount which can't
> > be changed.
> > - *
> > - * But unfortunately mount(8) adds all options from mtab and fstab
> > to the mount
> > - * arguments in some cases so we can't blindly reject options, but
> > have to
> > - * check for each specified option if it actually differs from the
> > currently
> > - * set option and only reject it if that's the case.
> > - *
> > - * Until that is implemented we return success for every remount
> > request, and
> > - * silently ignore all options that we can't actually change.
> > - */
> > -static int
> > -xfs_fc_reconfigure(
> > -	struct fs_context *fc)
> > -{
> > -	struct xfs_mount	*mp = XFS_M(fc->root->d_sb);
> > -	struct xfs_mount        *new_mp = fc->s_fs_info;
> > -	xfs_sb_t		*sbp = &mp->m_sb;
> > -	int			flags = fc->sb_flags;
> > -	int			error;
> > -
> > -	sync_filesystem(mp->m_super);
> > -
> > -	error = xfs_fc_validate_params(new_mp);
> > -	if (error)
> > -		return error;
> > -
> > -	/* inode32 -> inode64 */
> > -	if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > -	    !(new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > -		mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
> > -		mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > -	}
> > -
> > -	/* inode64 -> inode32 */
> > -	if (!(mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > -	    (new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > -		mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
> > -		mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > -	}
> > -
> > -	/* ro -> rw */
> > -	if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(flags & SB_RDONLY)) {
> > -		error = xfs_remount_rw(mp);
> > -		if (error)
> > -			return error;
> > -	}
> > -
> > -	/* rw -> ro */
> > -	if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (flags & SB_RDONLY)) {
> > -		error = xfs_remount_ro(mp);
> > -		if (error)
> > -			return error;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> >  /*
> >   * Second stage of a freeze. The data is already frozen so we only
> >   * need to take care of the metadata. Once that's done sync the
> > superblock
> > @@ -1735,6 +1573,168 @@ static const struct super_operations
> > xfs_super_operations = {
> >  	.free_cached_objects	= xfs_fs_free_cached_objects,
> >  };
> >  
> > +static int
> > +xfs_remount_rw(
> > +	struct xfs_mount	*mp)
> > +{
> > +	struct xfs_sb		*sbp = &mp->m_sb;
> > +	int error;
> > +
> > +	if (mp->m_flags & XFS_MOUNT_NORECOVERY) {
> > +		xfs_warn(mp,
> > +			"ro->rw transition prohibited on norecovery
> > mount");
> > +		return -EINVAL;
> > +	}
> > +
> > +	if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
> > +	    xfs_sb_has_ro_compat_feature(sbp,
> > XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
> > +		xfs_warn(mp,
> > +	"ro->rw transition prohibited on unknown (0x%x) ro-compat
> > filesystem",
> > +			(sbp->sb_features_ro_compat &
> > +				XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
> > +		return -EINVAL;
> > +	}
> > +
> > +	mp->m_flags &= ~XFS_MOUNT_RDONLY;
> > +
> > +	/*
> > +	 * If this is the first remount to writeable state we might
> > have some
> > +	 * superblock changes to update.
> > +	 */
> > +	if (mp->m_update_sb) {
> > +		error = xfs_sync_sb(mp, false);
> > +		if (error) {
> > +			xfs_warn(mp, "failed to write sb changes");
> > +			return error;
> > +		}
> > +		mp->m_update_sb = false;
> > +	}
> > +
> > +	/*
> > +	 * Fill out the reserve pool if it is empty. Use the stashed
> > value if
> > +	 * it is non-zero, otherwise go with the default.
> > +	 */
> > +	xfs_restore_resvblks(mp);
> > +	xfs_log_work_queue(mp);
> > +
> > +	/* Recover any CoW blocks that never got remapped. */
> > +	error = xfs_reflink_recover_cow(mp);
> > +	if (error) {
> > +		xfs_err(mp,
> > +			"Error %d recovering leftover CoW
> > allocations.", error);
> > +			xfs_force_shutdown(mp,
> > SHUTDOWN_CORRUPT_INCORE);
> > +		return error;
> > +	}
> > +	xfs_start_block_reaping(mp);
> > +
> > +	/* Create the per-AG metadata reservation pool .*/
> > +	error = xfs_fs_reserve_ag_blocks(mp);
> > +	if (error && error != -ENOSPC)
> > +		return error;
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +xfs_remount_ro(
> > +	struct xfs_mount	*mp)
> > +{
> > +	int error;
> > +
> > +	/*
> > +	 * Cancel background eofb scanning so it cannot race with the
> > final
> > +	 * log force+buftarg wait and deadlock the remount.
> > +	 */
> > +	xfs_stop_block_reaping(mp);
> > +
> > +	/* Get rid of any leftover CoW reservations... */
> > +	error = xfs_icache_free_cowblocks(mp, NULL);
> > +	if (error) {
> > +		xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
> > +		return error;
> > +	}
> > +
> > +	/* Free the per-AG metadata reservation pool. */
> > +	error = xfs_fs_unreserve_ag_blocks(mp);
> > +	if (error) {
> > +		xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
> > +		return error;
> > +	}
> > +
> > +	/*
> > +	 * Before we sync the metadata, we need to free up the reserve
> > block
> > +	 * pool so that the used block count in the superblock on disk
> > is
> > +	 * correct at the end of the remount. Stash the current*
> > reserve pool
> > +	 * size so that if we get remounted rw, we can return it to the
> > same
> > +	 * size.
> > +	 */
> > +	xfs_save_resvblks(mp);
> > +
> > +	xfs_quiesce_attr(mp);
> > +	mp->m_flags |= XFS_MOUNT_RDONLY;
> > +
> > +	return 0;
> > +}
> > +
> > +/*
> > + * Logically we would return an error here to prevent users from
> > believing
> > + * they might have changed mount options using remount which can't
> > be changed.
> > + *
> > + * But unfortunately mount(8) adds all options from mtab and fstab
> > to the mount
> > + * arguments in some cases so we can't blindly reject options, but
> > have to
> > + * check for each specified option if it actually differs from the
> > currently
> > + * set option and only reject it if that's the case.
> > + *
> > + * Until that is implemented we return success for every remount
> > request, and
> > + * silently ignore all options that we can't actually change.
> > + */
> > +static int
> > +xfs_fc_reconfigure(
> > +	struct fs_context *fc)
> > +{
> > +	struct xfs_mount	*mp = XFS_M(fc->root->d_sb);
> > +	struct xfs_mount        *new_mp = fc->s_fs_info;
> > +	xfs_sb_t		*sbp = &mp->m_sb;
> > +	int			flags = fc->sb_flags;
> > +	int			error;
> > +
> > +	sync_filesystem(mp->m_super);
> > +
> > +	error = xfs_fc_validate_params(new_mp);
> > +	if (error)
> > +		return error;
> > +
> > +	/* inode32 -> inode64 */
> > +	if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > +	    !(new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > +		mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
> > +		mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > +	}
> > +
> > +	/* inode64 -> inode32 */
> > +	if (!(mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > +	    (new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > +		mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
> > +		mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > +	}
> > +
> > +	/* ro -> rw */
> > +	if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(flags & SB_RDONLY)) {
> > +		error = xfs_remount_rw(mp);
> > +		if (error)
> > +			return error;
> > +	}
> > +
> > +	/* rw -> ro */
> > +	if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (flags & SB_RDONLY)) {
> > +		error = xfs_remount_ro(mp);
> > +		if (error)
> > +			return error;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  static void xfs_fc_free(struct fs_context *fc)
> >  {
> >  	struct xfs_mount	*mp = fc->s_fs_info;
> > 


  reply	other threads:[~2019-11-02  4:48 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-01  7:49 [PATCH v8 00/16] xfs: mount API patch series Ian Kent
2019-11-01  7:50 ` [PATCH v8 01/16] xfs: remove unused struct xfs_mount field m_fsname_len Ian Kent
2019-11-01  7:50 ` [PATCH v8 02/16] xfs: use super s_id instead of struct xfs_mount m_fsname Ian Kent
2019-11-01  7:50 ` [PATCH v8 03/16] xfs: dont use XFS_IS_QUOTA_RUNNING() for option check Ian Kent
2019-11-01 17:01   ` Christoph Hellwig
2019-11-01 18:50   ` Darrick J. Wong
2019-11-01  7:50 ` [PATCH v8 04/16] xfs: use kmem functions for struct xfs_mount Ian Kent
2019-11-01  7:50 ` [PATCH v8 05/16] xfs: merge freeing of mp names and mp Ian Kent
2019-11-01  7:50 ` [PATCH v8 06/16] xfs: add xfs_remount_rw() helper Ian Kent
2019-11-01 19:35   ` Darrick J. Wong
2019-11-01  7:50 ` [PATCH v8 07/16] xfs: add xfs_remount_ro() helper Ian Kent
2019-11-01 19:35   ` Darrick J. Wong
2019-11-01  7:50 ` [PATCH v8 08/16] xfs: refactor suffix_kstrtoint() Ian Kent
2019-11-01 19:35   ` Darrick J. Wong
2019-11-01  7:50 ` [PATCH v8 09/16] xfs: avoid redundant checks when options is empty Ian Kent
2019-11-01  7:50 ` [PATCH v8 10/16] xfs: refactor xfs_parseags() Ian Kent
2019-11-01  7:51 ` [PATCH v8 11/16] xfs: move xfs_parseargs() validation to a helper Ian Kent
2019-11-01 17:03   ` Christoph Hellwig
2019-11-01  7:51 ` [PATCH v8 12/16] xfs: dont set sb in xfs_mount_alloc() Ian Kent
2019-11-01 20:15   ` Darrick J. Wong
2019-11-02  4:41     ` Ian Kent
2019-11-04 21:12       ` Darrick J. Wong
2019-11-05  2:47         ` Ian Kent
2019-11-01  7:51 ` [PATCH v8 13/16] xfs: switch to use the new mount-api Ian Kent
2019-11-02 16:18   ` Christoph Hellwig
2019-11-01  7:51 ` [PATCH v8 14/16] xfs: move xfs_fc_reconfigure() above xfs_fc_free() Ian Kent
2019-11-01 20:16   ` Darrick J. Wong
2019-11-02  4:48     ` Ian Kent [this message]
2019-11-02 16:19   ` Christoph Hellwig
2019-11-01  7:51 ` [PATCH v8 15/16] xfs: move xfs_fc_get_tree() above xfs_fc_reconfigure() Ian Kent
2019-11-01 20:17   ` Darrick J. Wong
2019-11-02 16:19   ` Christoph Hellwig
2019-11-01  7:51 ` [PATCH v8 16/16] xfs: move xfs_fc_parse_param() above xfs_fc_get_tree() Ian Kent
2019-11-01 20:17   ` Darrick J. Wong
2019-11-02 16:19   ` Christoph Hellwig

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=dcc36cb56b2b8a27fe6a9cecf6dc91fee6750c25.camel@themaw.net \
    --to=raven@themaw.net \
    --cc=bfoster@redhat.com \
    --cc=darrick.wong@oracle.com \
    --cc=dchinner@redhat.com \
    --cc=dhowells@redhat.com \
    --cc=hch@infradead.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@sandeen.net \
    --cc=viro@ZenIV.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).