Commit b8862a09 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino
Browse files

xfs: don't validate error tags in the I/O path



We can trust XFS developers enough to not pass random stuff to
XFS_ERROR_TEST/DELAY.  Open code the validity check in xfs_errortag_add,
which is the only place that receives unvalidated error tag values from
user space, and drop the now pointless xfs_errortag_enabled helper.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHans Holmberg <hans.holmberg@wdc.com>
Reviewed-by: default avatarCarlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent 394969e2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@
 * Drop-writes support removed because write error handling cannot trash
 * pre-existing delalloc extents in any useful way anymore. We retain the
 * definition so that we can reject it as an invalid value in
 * xfs_errortag_valid().
 * xfs_errortag_add().
 */
#define XFS_ERRTAG_DROP_WRITES				28
#define XFS_ERRTAG_LOG_BAD_CRC				29
+10 −28
Original line number Diff line number Diff line
@@ -125,30 +125,6 @@ xfs_errortag_del(
	xfs_sysfs_del(&mp->m_errortag_kobj);
}

static bool
xfs_errortag_valid(
	unsigned int		error_tag)
{
	if (error_tag >= XFS_ERRTAG_MAX)
		return false;

	/* Error out removed injection types */
	if (error_tag == XFS_ERRTAG_DROP_WRITES)
		return false;
	return true;
}

bool
xfs_errortag_enabled(
	struct xfs_mount	*mp,
	unsigned int		tag)
{
	if (!xfs_errortag_valid(tag))
		return false;

	return mp->m_errortag[tag] != 0;
}

bool
xfs_errortag_test(
	struct xfs_mount	*mp,
@@ -158,9 +134,6 @@ xfs_errortag_test(
{
	unsigned int		randfactor;

	if (!xfs_errortag_valid(error_tag))
		return false;

	randfactor = mp->m_errortag[error_tag];
	if (!randfactor || get_random_u32_below(randfactor))
		return false;
@@ -178,8 +151,17 @@ xfs_errortag_add(
{
	BUILD_BUG_ON(ARRAY_SIZE(xfs_errortag_random_default) != XFS_ERRTAG_MAX);

	if (!xfs_errortag_valid(error_tag))
	if (error_tag >= XFS_ERRTAG_MAX)
		return -EINVAL;

	/* Error out removed injection types */
	switch (error_tag) {
	case XFS_ERRTAG_DROP_WRITES:
		return -EINVAL;
	default:
		break;
	}

	mp->m_errortag[error_tag] = xfs_errortag_random_default[error_tag];
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ bool xfs_errortag_enabled(struct xfs_mount *mp, unsigned int tag);
#define XFS_ERRORTAG_DELAY(mp, tag)		\
	do { \
		might_sleep(); \
		if (!xfs_errortag_enabled((mp), (tag))) \
		if (!mp->m_errortag[tag]) \
			break; \
		xfs_warn_ratelimited((mp), \
"Injecting %ums delay at file %s, line %d, on filesystem \"%s\"", \