]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: don't validate error tags in the I/O path
authorChristoph Hellwig <hch@lst.de>
Fri, 30 Jan 2026 05:19:18 +0000 (06:19 +0100)
committerCarlos Maiolino <cem@kernel.org>
Fri, 30 Jan 2026 09:41:42 +0000 (10:41 +0100)
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>
fs/xfs/libxfs/xfs_errortag.h
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h

index 57e47077c75a2a00b6fc55c069b0691d8b0a7371..b7d98471684bf1d38e94f991b4234017eb968754 100644 (file)
@@ -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
index dfa4abf9fd1a9954edb71130b43881a169dc90b6..52a1d51126e3eb13ae1f8899bb1e7d8752b3fd00 100644 (file)
@@ -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;
 }
index 3a78c8dfaec83a90c53e90f505140bd549269c8c..ec22546a8ca86179d2634f953e4bb7488cc8ffef 100644 (file)
@@ -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\"", \