From: Greg Kroah-Hartman Date: Sun, 15 Dec 2024 08:50:37 +0000 (+0100) Subject: 6.6-stable patches X-Git-Tag: v5.4.288~57 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=31d76dd82188ba41e97e5fb54caa3e594df69492;p=thirdparty%2Fkernel%2Fstable-queue.git 6.6-stable patches added patches: xfs-fix-scrub-tracepoints-when-inode-rooted-btrees-are-involved.patch xfs-only-run-precommits-once-per-transaction-object.patch xfs-return-from-xfs_symlink_verify-early-on-v4-filesystems.patch --- diff --git a/queue-6.6/series b/queue-6.6/series index 05b107e1344..02a09c848ad 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -23,3 +23,6 @@ drm-i915-fix-memory-leak-by-correcting-cache-object-name-in-error-handler.patch drm-i915-fix-null-pointer-dereference-in-capture_engine.patch xfs-update-btree-keys-correctly-when-_insrec-splits-an-inode-root-block.patch xfs-don-t-drop-errno-values-when-we-fail-to-ficlone-the-entire-range.patch +xfs-return-from-xfs_symlink_verify-early-on-v4-filesystems.patch +xfs-fix-scrub-tracepoints-when-inode-rooted-btrees-are-involved.patch +xfs-only-run-precommits-once-per-transaction-object.patch diff --git a/queue-6.6/xfs-fix-scrub-tracepoints-when-inode-rooted-btrees-are-involved.patch b/queue-6.6/xfs-fix-scrub-tracepoints-when-inode-rooted-btrees-are-involved.patch new file mode 100644 index 00000000000..d34b005cfdb --- /dev/null +++ b/queue-6.6/xfs-fix-scrub-tracepoints-when-inode-rooted-btrees-are-involved.patch @@ -0,0 +1,33 @@ +From ffc3ea4f3c1cc83a86b7497b0c4b0aee7de5480d Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 2 Dec 2024 10:57:32 -0800 +Subject: xfs: fix scrub tracepoints when inode-rooted btrees are involved + +From: Darrick J. Wong + +commit ffc3ea4f3c1cc83a86b7497b0c4b0aee7de5480d upstream. + +Fix a minor mistakes in the scrub tracepoints that can manifest when +inode-rooted btrees are enabled. The existing code worked fine for bmap +btrees, but we should tighten the code up to be less sloppy. + +Cc: # v5.7 +Fixes: 92219c292af8dd ("xfs: convert btree cursor inode-private member names") +Signed-off-by: "Darrick J. Wong" +Reviewed-by: Christoph Hellwig +Signed-off-by: Greg Kroah-Hartman +--- + fs/xfs/scrub/trace.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/xfs/scrub/trace.h ++++ b/fs/xfs/scrub/trace.h +@@ -506,7 +506,7 @@ TRACE_EVENT(xchk_ifork_btree_error, + TP_fast_assign( + xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); + __entry->dev = sc->mp->m_super->s_dev; +- __entry->ino = sc->ip->i_ino; ++ __entry->ino = cur->bc_ino.ip->i_ino; + __entry->whichfork = cur->bc_ino.whichfork; + __entry->type = sc->sm->sm_type; + __entry->btnum = cur->bc_btnum; diff --git a/queue-6.6/xfs-only-run-precommits-once-per-transaction-object.patch b/queue-6.6/xfs-only-run-precommits-once-per-transaction-object.patch new file mode 100644 index 00000000000..c5848228ba7 --- /dev/null +++ b/queue-6.6/xfs-only-run-precommits-once-per-transaction-object.patch @@ -0,0 +1,84 @@ +From 44d9b07e52db25035680713c3428016cadcd2ea1 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 2 Dec 2024 10:57:33 -0800 +Subject: xfs: only run precommits once per transaction object + +From: Darrick J. Wong + +commit 44d9b07e52db25035680713c3428016cadcd2ea1 upstream. + +Committing a transaction tx0 with a defer ops chain of (A, B, C) +creates a chain of transactions that looks like this: + +tx0 -> txA -> txB -> txC + +Prior to commit cb042117488dbf, __xfs_trans_commit would run precommits +on tx0, then call xfs_defer_finish_noroll to convert A-C to tx[A-C]. +Unfortunately, after the finish_noroll loop we forgot to run precommits +on txC. That was fixed by adding the second precommit call. + +Unfortunately, none of us remembered that xfs_defer_finish_noroll +calls __xfs_trans_commit a second time to commit tx0 before finishing +work A in txA and committing that. In other words, we run precommits +twice on tx0: + +xfs_trans_commit(tx0) + __xfs_trans_commit(tx0, false) + xfs_trans_run_precommits(tx0) + xfs_defer_finish_noroll(tx0) + xfs_trans_roll(tx0) + txA = xfs_trans_dup(tx0) + __xfs_trans_commit(tx0, true) + xfs_trans_run_precommits(tx0) + +This currently isn't an issue because the inode item precommit is +idempotent; the iunlink item precommit deletes itself so it can't be +called again; and the buffer/dquot item precommits only check the incore +objects for corruption. However, it doesn't make sense to run +precommits twice. + +Fix this situation by only running precommits after finish_noroll. + +Cc: # v6.4 +Fixes: cb042117488dbf ("xfs: defered work could create precommits") +Signed-off-by: "Darrick J. Wong" +Reviewed-by: Christoph Hellwig +Signed-off-by: Greg Kroah-Hartman +--- + fs/xfs/xfs_trans.c | 16 ++++------------ + 1 file changed, 4 insertions(+), 12 deletions(-) + +--- a/fs/xfs/xfs_trans.c ++++ b/fs/xfs/xfs_trans.c +@@ -955,13 +955,6 @@ __xfs_trans_commit( + + trace_xfs_trans_commit(tp, _RET_IP_); + +- error = xfs_trans_run_precommits(tp); +- if (error) { +- if (tp->t_flags & XFS_TRANS_PERM_LOG_RES) +- xfs_defer_cancel(tp); +- goto out_unreserve; +- } +- + /* + * Finish deferred items on final commit. Only permanent transactions + * should ever have deferred ops. +@@ -972,13 +965,12 @@ __xfs_trans_commit( + error = xfs_defer_finish_noroll(&tp); + if (error) + goto out_unreserve; +- +- /* Run precommits from final tx in defer chain. */ +- error = xfs_trans_run_precommits(tp); +- if (error) +- goto out_unreserve; + } + ++ error = xfs_trans_run_precommits(tp); ++ if (error) ++ goto out_unreserve; ++ + /* + * If there is nothing to be logged by the transaction, + * then unlock all of the items associated with the diff --git a/queue-6.6/xfs-return-from-xfs_symlink_verify-early-on-v4-filesystems.patch b/queue-6.6/xfs-return-from-xfs_symlink_verify-early-on-v4-filesystems.patch new file mode 100644 index 00000000000..1f4d8bb07ac --- /dev/null +++ b/queue-6.6/xfs-return-from-xfs_symlink_verify-early-on-v4-filesystems.patch @@ -0,0 +1,35 @@ +From 7f8b718c58783f3ff0810b39e2f62f50ba2549f6 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 2 Dec 2024 10:57:43 -0800 +Subject: xfs: return from xfs_symlink_verify early on V4 filesystems + +From: Darrick J. Wong + +commit 7f8b718c58783f3ff0810b39e2f62f50ba2549f6 upstream. + +V4 symlink blocks didn't have headers, so return early if this is a V4 +filesystem. + +Cc: # v5.1 +Fixes: 39708c20ab5133 ("xfs: miscellaneous verifier magic value fixups") +Signed-off-by: "Darrick J. Wong" +Reviewed-by: Christoph Hellwig +Signed-off-by: Greg Kroah-Hartman +--- + fs/xfs/libxfs/xfs_symlink_remote.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/fs/xfs/libxfs/xfs_symlink_remote.c ++++ b/fs/xfs/libxfs/xfs_symlink_remote.c +@@ -89,8 +89,10 @@ xfs_symlink_verify( + struct xfs_mount *mp = bp->b_mount; + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + ++ /* no verification of non-crc buffers */ + if (!xfs_has_crc(mp)) +- return __this_address; ++ return NULL; ++ + if (!xfs_verify_magic(bp, dsl->sl_magic)) + return __this_address; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_meta_uuid))