]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Sep 2025 12:35:34 +0000 (14:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Sep 2025 12:35:34 +0000 (14:35 +0200)
added patches:
xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch

queue-5.10/series
queue-5.10/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch [new file with mode: 0644]

index d31f70a56412773d23c3cb7a8d0c5a348eaf4445..fdc7bea663ba86e1928d42db5799116245fe3726 100644 (file)
@@ -31,3 +31,4 @@ asoc-intel-bxt_da7219_max98357a-shrink-platform_id-below-20-characters.patch
 asoc-intel-sof_rt5682-shrink-platform_id-names-below-20-characters.patch
 asoc-intel-glk_rt5682_max98357a-shrink-platform_id-below-20-characters.patch
 asoc-intel-sof_da7219_mx98360a-fail-to-initialize-soundcard.patch
+xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch
diff --git a/queue-5.10/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch b/queue-5.10/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch
new file mode 100644 (file)
index 0000000..9030b4c
--- /dev/null
@@ -0,0 +1,83 @@
+From ae668cd567a6a7622bc813ee0bb61c42bed61ba7 Mon Sep 17 00:00:00 2001
+From: Eric Sandeen <sandeen@redhat.com>
+Date: Fri, 22 Aug 2025 12:55:56 -0500
+Subject: xfs: do not propagate ENODATA disk errors into xattr code
+
+From: Eric Sandeen <sandeen@redhat.com>
+
+commit ae668cd567a6a7622bc813ee0bb61c42bed61ba7 upstream.
+
+ENODATA (aka ENOATTR) has a very specific meaning in the xfs xattr code;
+namely, that the requested attribute name could not be found.
+
+However, a medium error from disk may also return ENODATA. At best,
+this medium error may escape to userspace as "attribute not found"
+when in fact it's an IO (disk) error.
+
+At worst, we may oops in xfs_attr_leaf_get() when we do:
+
+       error = xfs_attr_leaf_hasname(args, &bp);
+       if (error == -ENOATTR)  {
+               xfs_trans_brelse(args->trans, bp);
+               return error;
+       }
+
+because an ENODATA/ENOATTR error from disk leaves us with a null bp,
+and the xfs_trans_brelse will then null-deref it.
+
+As discussed on the list, we really need to modify the lower level
+IO functions to trap all disk errors and ensure that we don't let
+unique errors like this leak up into higher xfs functions - many
+like this should be remapped to EIO.
+
+However, this patch directly addresses a reported bug in the xattr
+code, and should be safe to backport to stable kernels. A larger-scope
+patch to handle more unique errors at lower levels can follow later.
+
+(Note, prior to 07120f1abdff we did not oops, but we did return the
+wrong error code to userspace.)
+
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+Fixes: 07120f1abdff ("xfs: Add xfs_has_attr and subroutines")
+Cc: stable@vger.kernel.org # v5.9+
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Carlos Maiolino <cem@kernel.org>
+[ Adjust context: removed metadata health tracking calls ]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/libxfs/xfs_attr_remote.c |    7 +++++++
+ fs/xfs/libxfs/xfs_da_btree.c    |    6 ++++++
+ 2 files changed, 13 insertions(+)
+
+--- a/fs/xfs/libxfs/xfs_attr_remote.c
++++ b/fs/xfs/libxfs/xfs_attr_remote.c
+@@ -418,6 +418,13 @@ xfs_attr_rmtval_get(
+                       dblkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount);
+                       error = xfs_buf_read(mp->m_ddev_targp, dblkno, dblkcnt,
+                                       0, &bp, &xfs_attr3_rmt_buf_ops);
++                      /*
++                       * ENODATA from disk implies a disk medium failure;
++                       * ENODATA for xattrs means attribute not found, so
++                       * disambiguate that here.
++                       */
++                      if (error == -ENODATA)
++                              error = -EIO;
+                       if (error)
+                               return error;
+--- a/fs/xfs/libxfs/xfs_da_btree.c
++++ b/fs/xfs/libxfs/xfs_da_btree.c
+@@ -2639,6 +2639,12 @@ xfs_da_read_buf(
+       error = xfs_trans_read_buf_map(mp, tp, mp->m_ddev_targp, mapp, nmap, 0,
+                       &bp, ops);
++      /*
++       * ENODATA from disk implies a disk medium failure; ENODATA for
++       * xattrs means attribute not found, so disambiguate that here.
++       */
++      if (error == -ENODATA && whichfork == XFS_ATTR_FORK)
++              error = -EIO;
+       if (error)
+               goto out_free;