Commit 679a9949 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dan Williams
Browse files

xfs: factor out a xfs_setup_dax_always helper



Factor out another DAX setup helper to simplify future changes.  Also
move the experimental warning after the checks to not clutter the log
too much if the setup failed.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Link: https://lore.kernel.org/r/20211129102203.2243509-8-hch@lst.de


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 0c445871
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -340,6 +340,32 @@ xfs_buftarg_is_dax(
			bdev_nr_sectors(bt->bt_bdev));
}

static int
xfs_setup_dax_always(
	struct xfs_mount	*mp)
{
	struct super_block	*sb = mp->m_super;

	if (!xfs_buftarg_is_dax(sb, mp->m_ddev_targp) &&
	   (!mp->m_rtdev_targp || !xfs_buftarg_is_dax(sb, mp->m_rtdev_targp))) {
		xfs_alert(mp,
			"DAX unsupported by block device. Turning off DAX.");
		goto disable_dax;
	}

	if (xfs_has_reflink(mp)) {
		xfs_alert(mp, "DAX and reflink cannot be used together!");
		return -EINVAL;
	}

	xfs_warn(mp, "DAX enabled. Warning: EXPERIMENTAL, use at your own risk");
	return 0;

disable_dax:
	xfs_mount_set_dax_mode(mp, XFS_DAX_NEVER);
	return 0;
}

STATIC int
xfs_blkdev_get(
	xfs_mount_t		*mp,
@@ -1593,27 +1619,10 @@ xfs_fs_fill_super(
		sb->s_flags |= SB_I_VERSION;

	if (xfs_has_dax_always(mp)) {
		bool rtdev_is_dax = false, datadev_is_dax;

		xfs_warn(mp,
		"DAX enabled. Warning: EXPERIMENTAL, use at your own risk");

		datadev_is_dax = xfs_buftarg_is_dax(sb, mp->m_ddev_targp);
		if (mp->m_rtdev_targp)
			rtdev_is_dax = xfs_buftarg_is_dax(sb,
						mp->m_rtdev_targp);
		if (!rtdev_is_dax && !datadev_is_dax) {
			xfs_alert(mp,
			"DAX unsupported by block device. Turning off DAX.");
			xfs_mount_set_dax_mode(mp, XFS_DAX_NEVER);
		}
		if (xfs_has_reflink(mp)) {
			xfs_alert(mp,
		"DAX and reflink cannot be used together!");
			error = -EINVAL;
		error = xfs_setup_dax_always(mp);
		if (error)
			goto out_filestream_unmount;
	}
	}

	if (xfs_has_discard(mp)) {
		struct request_queue *q = bdev_get_queue(sb->s_bdev);