mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
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: Christoph Hellwig <hch@lst.de> Reviewed-by: Hans Holmberg <hans.holmberg@wdc.com> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
394969e2f9
commit
b8862a09d8
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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\"", \
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user