upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / net / sched / sch_generic.c
index 1b91809..87e48a4 100644 (file)
@@ -54,7 +54,7 @@
 
    qdisc_tree_lock must be grabbed BEFORE dev->queue_lock!
  */
-rwlock_t qdisc_tree_lock = RW_LOCK_UNLOCKED;
+DEFINE_RWLOCK(qdisc_tree_lock);
 
 void qdisc_lock_tree(struct net_device *dev)
 {
@@ -179,6 +179,7 @@ requeue:
                netif_schedule(dev);
                return 1;
        }
+       BUG_ON((int) q->q.qlen < 0);
        return q->q.qlen;
 }
 
@@ -283,7 +284,7 @@ struct Qdisc noop_qdisc = {
        .list           =       LIST_HEAD_INIT(noop_qdisc.list),
 };
 
-struct Qdisc_ops noqueue_qdisc_ops = {
+static struct Qdisc_ops noqueue_qdisc_ops = {
        .next           =       NULL,
        .cl_ops         =       NULL,
        .id             =       "noqueue",
@@ -294,7 +295,7 @@ struct Qdisc_ops noqueue_qdisc_ops = {
        .owner          =       THIS_MODULE,
 };
 
-struct Qdisc noqueue_qdisc = {
+static struct Qdisc noqueue_qdisc = {
        .enqueue        =       NULL,
        .dequeue        =       noop_dequeue,
        .flags          =       TCQ_F_BUILTIN,
@@ -539,6 +540,10 @@ void dev_activate(struct net_device *dev)
                write_unlock_bh(&qdisc_tree_lock);
        }
 
+       if (!netif_carrier_ok(dev))
+               /* Delay activation until next carrier-on event */
+               return;
+
        spin_lock_bh(&dev->queue_lock);
        rcu_assign_pointer(dev->qdisc, dev->qdisc_sleeping);
        if (dev->qdisc != &noqueue_qdisc) {