From: Greg Kroah-Hartman Date: Tue, 2 Sep 2025 12:35:57 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v5.4.298~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ffe077cfb3287a87dcc6b3bf33bc15e498ad881;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch --- diff --git a/queue-6.1/series b/queue-6.1/series index 8816bb602e..8f7e6257bf 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -47,3 +47,4 @@ net-rose-fix-a-typo-in-rose_clear_routes.patch hid-mcp2221-don-t-set-bus-speed-on-every-transfer.patch hid-mcp2221-handle-reads-greater-than-60-bytes.patch revert-drm-dp-change-aux-dpcd-probe-address-from-dpcd_rev-to-lane0_1_status.patch +xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch diff --git a/queue-6.1/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch b/queue-6.1/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch new file mode 100644 index 0000000000..d95c61df10 --- /dev/null +++ b/queue-6.1/xfs-do-not-propagate-enodata-disk-errors-into-xattr-code.patch @@ -0,0 +1,83 @@ +From ae668cd567a6a7622bc813ee0bb61c42bed61ba7 Mon Sep 17 00:00:00 2001 +From: Eric Sandeen +Date: Fri, 22 Aug 2025 12:55:56 -0500 +Subject: xfs: do not propagate ENODATA disk errors into xattr code + +From: Eric Sandeen + +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 +Fixes: 07120f1abdff ("xfs: Add xfs_has_attr and subroutines") +Cc: stable@vger.kernel.org # v5.9+ +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino +[ Adjust context: removed metadata health tracking calls ] +Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -2648,6 +2648,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; +