-diff -Naur linux-2.6.24.orig/include/linux/pkt_sched.h linux-2.6.24/include/linux/pkt_sched.h
---- linux-2.6.24.orig/include/linux/pkt_sched.h 2008-01-24 14:58:37.000000000 -0800
-+++ linux-2.6.24/include/linux/pkt_sched.h 2008-01-28 00:27:12.000000000 -0800
+diff -Naur linux-2.6.24.orig/include/uapi/linux/pkt_sched.h linux-2.6.24/include/uapi/linux/pkt_sched.h
+--- linux-2.6.24.orig/include/uapi/linux/pkt_sched.h 2008-01-24 14:58:37.000000000 -0800
++++ linux-2.6.24/include/uapi/linux/pkt_sched.h 2008-01-28 00:27:12.000000000 -0800
@@ -157,6 +157,33 @@
* to change these parameters in compile time.
*/
diff -Naur linux-2.6.24.orig/net/sched/sch_esfq.c linux-2.6.24/net/sched/sch_esfq.c
--- linux-2.6.24.orig/net/sched/sch_esfq.c 1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.24/net/sched/sch_esfq.c 2008-01-28 00:27:22.000000000 -0800
-@@ -0,0 +1,703 @@
+@@ -0,0 +1,700 @@
+/*
+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline.
+ *
+
+#include <linux/module.h>
+#include <asm/uaccess.h>
-+#include <asm/system.h>
++
+#include <linux/bitops.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+ break;
+ }
+ default:
-+ info.dst = (u32)(unsigned long)skb->dst;
++ info.dst = (u32)(unsigned long)skb_dst(skb);
+ info.src = (u32)(unsigned long)skb->sk;
+ info.proto = skb->protocol;
+ }
+ return NET_XMIT_CN;
+}
+
-+
-+static int esfq_requeue(struct sk_buff *skb, struct Qdisc* sch)
++static struct sk_buff *esfq_peek(struct Qdisc* sch)
+{
+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_HEAD);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit - 1) {
-+ sch->qstats.requeues++;
-+ return 0;
-+ }
++ esfq_index a;
+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
++ /* No active slots */
++ if (q->tail == q->depth)
++ return NULL;
++
++ a = q->next[q->tail];
++ return skb_peek(&q->qs[a]);
+}
+
+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
+ struct Qdisc *sch = (struct Qdisc*)arg;
+ struct esfq_sched_data *q = qdisc_priv(sch);
+
-+ q->perturbation = net_random()&0x1F;
++ q->perturbation = prandom_u32() & 0x1F;
+
+ if (q->perturb_period) {
+ q->perturb_timer.expires = jiffies + q->perturb_period;
+ opt.flows = q->depth;
+ opt.hash_kind = q->hash_kind;
+
-+ NLA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
++ if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt))
++ goto nla_put_failure;
+ return skb->len;
+
+nla_put_failure:
+ .priv_size = sizeof(struct esfq_sched_data),
+ .enqueue = esfq_enqueue,
+ .dequeue = esfq_dequeue,
-+ .requeue = esfq_requeue,
++ .peek = esfq_peek,
+ .drop = esfq_drop,
+ .init = esfq_init,
+ .reset = esfq_reset,