From: Christoph Hellwig Date: Fri, 30 Jan 2026 05:19:18 +0000 (+0100) Subject: xfs: don't validate error tags in the I/O path X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8862a09d8256a9037293f1da3b4617b21de26f1;p=thirdparty%2Fkernel%2Flinux.git 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 Reviewed-by: Hans Holmberg Reviewed-by: Carlos Maiolino Reviewed-by: Darrick J. Wong Signed-off-by: Carlos Maiolino --- diff --git a/fs/xfs/libxfs/xfs_errortag.h b/fs/xfs/libxfs/xfs_errortag.h index 57e47077c75a2..b7d98471684bf 100644 --- a/fs/xfs/libxfs/xfs_errortag.h +++ b/fs/xfs/libxfs/xfs_errortag.h @@ -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 diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index dfa4abf9fd1a9..52a1d51126e3e 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -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; } diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 3a78c8dfaec83..ec22546a8ca86 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -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\"", \