diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c index 35668ce0b4a8f5016cd36862caf0b92e20d862c9..e7c7b92ff37b3c8da680bbef486e735847ae79e0 100644 --- a/net/sched/act_ct.c +++ b/net/sched/act_ct.c @@ -699,7 +699,6 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb, if (err || !frag) return err; - skb_get(skb); cb = *qdisc_skb_cb(skb); if (family == NFPROTO_IPV4) { @@ -973,12 +972,8 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a, nh_ofs = skb_network_offset(skb); skb_pull_rcsum(skb, nh_ofs); err = tcf_ct_handle_fragments(net, skb, family, p->zone, &defrag); - if (err == -EINPROGRESS) { - retval = TC_ACT_STOLEN; - goto out; - } if (err) - goto drop; + goto out_frag; err = tcf_ct_skb_network_trim(skb, family); if (err) @@ -1046,6 +1041,11 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a, qdisc_skb_cb(skb)->pkt_len = skb->len; return retval; +out_frag: + if (err != -EINPROGRESS) + tcf_action_inc_drop_qstats(&c->common); + return TC_ACT_CONSUMED; + drop: tcf_action_inc_drop_qstats(&c->common); return TC_ACT_SHOT;