FAILED: patch "[PATCH] net/sched: act_ct: preserve tc_skb_cb across defragmentation" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 9092e15defbe6c7bc241c306093ca9d358a578e7
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072018-sixtieth-darkness-30c6@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 9092e15defbe6c7bc241c306093ca9d358a578e7 Mon Sep 17 00:00:00 2001
From: Zihan Xi <[email protected]>
Date: Sun, 14 Jun 2026 01:42:39 +0800
Subject: [PATCH] net/sched: act_ct: preserve tc_skb_cb across defragmentation
tcf_ct_handle_fragments() calls nf_ct_handle_fragments() without saving and restoring skb->cb. The defrag helper clears IPCB/IP6CB, which aliases the tc_skb_cb/qdisc_skb_cb control buffer. Fragmented traffic through act_ct therefore loses qdisc metadata such as pkt_segs and can trigger WARN_ON_ONCE() in qdisc_pkt_segs() when panic_on_warn is enabled.
Save and restore the full tc_skb_cb around nf_ct_handle_fragments(), matching the pattern used by ovs_ct_handle_fragments().
net/sched/act_ct.c +4 -3
@@ -844,11 +844,11 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb, u8 family, u16 zone, bool *defrag) { enum ip_conntrack_info ctinfo; +struct tc_skb_cb cb;struct nf_conn *ct;int err =0 ;bool frag;u8 proto; -u16 mru;/* Previously seen (loopback)? Ignore. */ ct =nf_ct_get (skb, &ctinfo);
@@ -862,12 +862,13 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,if (err || !frag)return err; - err =nf_ct_handle_fragments (net, skb, zone, family, &proto, &mru); + cb = *tc_skb_cb (skb); + err =nf_ct_handle_fragments (net, skb, zone, family, &proto, &cb.mru);if (err)return err; *defrag = true; -tc_skb_cb (skb)->mru = mru; + *tc_skb_cb (skb) = cb;return 0 ; }
Sasha Levin
maintainerPATCH 1/1 net/sched: act_ct: preserve tc_skb_cb across defragmentation
From: Zihan Xi <[email protected]>
[ Upstream commit 9092e15defbe6c7bc241c306093ca9d358a578e7 ]
tcf_ct_handle_fragments() calls nf_ct_handle_fragments() without saving and restoring skb->cb. The defrag helper clears IPCB/IP6CB, which aliases the tc_skb_cb/qdisc_skb_cb control buffer. Fragmented traffic through act_ct therefore loses qdisc metadata such as pkt_segs and can trigger WARN_ON_ONCE() in qdisc_pkt_segs() when panic_on_warn is enabled.
Save and restore the full tc_skb_cb around nf_ct_handle_fragments(), matching the pattern used by ovs_ct_handle_fragments().
--- net/sched/act_ct.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
net/sched/act_ct.c +5 -5
@@ -858,10 +858,10 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb, u8 family, u16 zone, bool *defrag) { enum ip_conntrack_info ctinfo; +struct tc_skb_cb cb;struct nf_conn *ct;int err =0 ;bool frag; -u16 mru;/* Previously seen (loopback)? Ignore. */ ct =nf_ct_get (skb, &ctinfo);
@@ -875,7 +875,7 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,if (err || !frag)return err; - mru =tc_skb_cb (skb)->mru; + cb = *tc_skb_cb (skb);if (family ==NFPROTO_IPV4 ) {enum ip_defrag_users user =IP_DEFRAG_CONNTRACK_IN + zone;
@@ -889,7 +889,7 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,if (!err) { *defrag = true; - mru =IPCB (skb)->frag_max_size; + cb.mru =IPCB (skb)->frag_max_size; } }else {/* NFPROTO_IPV6 */ #if IS_ENABLED (CONFIG_NF_DEFRAG_IPV6 )
@@ -902,7 +902,7 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,if (!err) { *defrag = true; - mru =IP6CB (skb)->frag_max_size; + cb.mru =IP6CB (skb)->frag_max_size; }#else err = -EOPNOTSUPP ;
@@ -911,7 +911,7 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb, }if (err != -EINPROGRESS ) -tc_skb_cb (skb)->mru = mru; + *tc_skb_cb (skb) = cb;skb_clear_hash (skb); skb->ignore_df =1 ;return err;
Signature · 1 line
2.53.0