Commit 2fcddee8 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: simplify parsing of allocsize mount option



Rework xfs_parseargs to fill out the default value and then parse the
option directly into the mount structure, similar to what we do for
other updates, and open code the now trivial updates based on on the
on-disk superblock directly into xfs_mountfs.

Note that this change rejects the allocsize=0 mount option that has been
documented as invalid for a long time instead of just ignoring it.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 5da8a07c
Loading
Loading
Loading
Loading
+5 −26
Original line number Diff line number Diff line
@@ -425,30 +425,6 @@ xfs_update_alignment(xfs_mount_t *mp)
	return 0;
}

/*
 * Set the default minimum read and write sizes unless
 * already specified in a mount option.
 * We use smaller I/O sizes when the file system
 * is being used for NFS service (wsync mount option).
 */
STATIC void
xfs_set_rw_sizes(xfs_mount_t *mp)
{
	xfs_sb_t	*sbp = &(mp->m_sb);
	int		readio_log, writeio_log;

	if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE))
		writeio_log = XFS_WRITEIO_LOG_LARGE;
	else
		writeio_log = mp->m_allocsize_log;

	if (sbp->sb_blocklog > writeio_log)
		mp->m_allocsize_log = sbp->sb_blocklog;
	} else
		mp->m_allocsize_log = writeio_log;
	mp->m_allocsize_blocks = 1 << (mp->m_allocsize_log - sbp->sb_blocklog);
}

/*
 * precalculate the low space thresholds for dynamic speculative preallocation.
 */
@@ -713,9 +689,12 @@ xfs_mountfs(
		goto out_remove_errortag;

	/*
	 * Set the minimum read and write sizes
	 * Update the preferred write size based on the information from the
	 * on-disk superblock.
	 */
	xfs_set_rw_sizes(mp);
	mp->m_allocsize_log =
		max_t(uint32_t, sbp->sb_blocklog, mp->m_allocsize_log);
	mp->m_allocsize_blocks = 1U << (mp->m_allocsize_log - sbp->sb_blocklog);

	/* set the low space thresholds for dynamic preallocation */
	xfs_set_low_space_thresholds(mp);
+0 −6
Original line number Diff line number Diff line
@@ -244,12 +244,6 @@ typedef struct xfs_mount {

#define XFS_MOUNT_DAX		(1ULL << 62)	/* TEST ONLY! */


/*
 * Default write size.
 */
#define XFS_WRITEIO_LOG_LARGE	16

/*
 * Max and min values for mount-option defined I/O
 * preallocation sizes.
+11 −15
Original line number Diff line number Diff line
@@ -159,8 +159,7 @@ xfs_parseargs(
	const struct super_block *sb = mp->m_super;
	char			*p;
	substring_t		args[MAX_OPT_ARGS];
	int			iosize = 0;
	uint8_t			iosizelog = 0;
	int			size = 0;

	/*
	 * set up the mount name first so all the errors will refer to the
@@ -192,6 +191,7 @@ xfs_parseargs(
	 */
	mp->m_logbufs = -1;
	mp->m_logbsize = -1;
	mp->m_allocsize_log = 16; /* 64k */

	if (!options)
		goto done;
@@ -225,9 +225,10 @@ xfs_parseargs(
				return -ENOMEM;
			break;
		case Opt_allocsize:
			if (suffix_kstrtoint(args, 10, &iosize))
			if (suffix_kstrtoint(args, 10, &size))
				return -EINVAL;
			iosizelog = ffs(iosize) - 1;
			mp->m_allocsize_log = ffs(size) - 1;
			mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE;
			break;
		case Opt_grpid:
		case Opt_bsdgroups:
@@ -395,19 +396,14 @@ xfs_parseargs(
		return -EINVAL;
	}

	if (iosizelog) {
		if (iosizelog > XFS_MAX_IO_LOG ||
		    iosizelog < XFS_MIN_IO_LOG) {
	if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) &&
	    (mp->m_allocsize_log > XFS_MAX_IO_LOG ||
	     mp->m_allocsize_log < XFS_MIN_IO_LOG)) {
		xfs_warn(mp, "invalid log iosize: %d [not %d-%d]",
				iosizelog, XFS_MIN_IO_LOG,
				XFS_MAX_IO_LOG);
			mp->m_allocsize_log, XFS_MIN_IO_LOG, XFS_MAX_IO_LOG);
		return -EINVAL;
	}

		mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE;
		mp->m_allocsize_log = iosizelog;
	}

	return 0;
}