struct netem_skb_cb *cb;
        struct sk_buff *skb2;
        struct sk_buff *segs = NULL;
-       unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb);
-       int nb = 0;
+       unsigned int prev_len = qdisc_pkt_len(skb);
        int count = 1;
        int rc = NET_XMIT_SUCCESS;
        int rc_drop = NET_XMIT_DROP;
                        segs = netem_segment(skb, sch, to_free);
                        if (!segs)
                                return rc_drop;
+                       qdisc_skb_cb(segs)->pkt_len = segs->len;
                } else {
                        segs = skb;
                }
 
 finish_segs:
        if (segs) {
+               unsigned int len, last_len;
+               int nb = 0;
+
+               len = skb->len;
+
                while (segs) {
                        skb2 = segs->next;
                        skb_mark_not_on_list(segs);
                        }
                        segs = skb2;
                }
-               sch->q.qlen += nb;
-               if (nb > 1)
-                       qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len);
+               qdisc_tree_reduce_backlog(sch, -nb, prev_len - len);
        }
        return NET_XMIT_SUCCESS;
 }