Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[linux-2.6.git] / net / sched / sch_mqprio.c
index fbc6f53..28de430 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/skbuff.h>
+#include <linux/module.h>
 #include <net/netlink.h>
 #include <net/pkt_sched.h>
 #include <net/sch_generic.h>
@@ -29,18 +30,18 @@ static void mqprio_destroy(struct Qdisc *sch)
        struct mqprio_sched *priv = qdisc_priv(sch);
        unsigned int ntx;
 
-       if (!priv->qdiscs)
-               return;
-
-       for (ntx = 0; ntx < dev->num_tx_queues && priv->qdiscs[ntx]; ntx++)
-               qdisc_destroy(priv->qdiscs[ntx]);
+       if (priv->qdiscs) {
+               for (ntx = 0;
+                    ntx < dev->num_tx_queues && priv->qdiscs[ntx];
+                    ntx++)
+                       qdisc_destroy(priv->qdiscs[ntx]);
+               kfree(priv->qdiscs);
+       }
 
        if (priv->hw_owned && dev->netdev_ops->ndo_setup_tc)
                dev->netdev_ops->ndo_setup_tc(dev, 0);
        else
                netdev_set_num_tc(dev, 0);
-
-       kfree(priv->qdiscs);
 }
 
 static int mqprio_parse_opt(struct net_device *dev, struct tc_mqprio_qopt *qopt)
@@ -106,7 +107,7 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt)
        if (!netif_is_multiqueue(dev))
                return -EOPNOTSUPP;
 
-       if (nla_len(opt) < sizeof(*qopt))
+       if (!opt || nla_len(opt) < sizeof(*qopt))
                return -EINVAL;
 
        qopt = nla_data(opt);
@@ -215,7 +216,7 @@ static int mqprio_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct net_device *dev = qdisc_dev(sch);
        struct mqprio_sched *priv = qdisc_priv(sch);
        unsigned char *b = skb_tail_pointer(skb);
-       struct tc_mqprio_qopt opt;
+       struct tc_mqprio_qopt opt = { 0 };
        struct Qdisc *qdisc;
        unsigned int i;
 
@@ -311,7 +312,9 @@ static int mqprio_dump_class(struct Qdisc *sch, unsigned long cl,
 }
 
 static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
-                              struct gnet_dump *d)
+                                  struct gnet_dump *d)
+       __releases(d->lock)
+       __acquires(d->lock)
 {
        struct net_device *dev = qdisc_dev(sch);
 
@@ -389,7 +392,7 @@ static const struct Qdisc_class_ops mqprio_class_ops = {
        .dump_stats     = mqprio_dump_class_stats,
 };
 
-struct Qdisc_ops mqprio_qdisc_ops __read_mostly = {
+static struct Qdisc_ops mqprio_qdisc_ops __read_mostly = {
        .cl_ops         = &mqprio_class_ops,
        .id             = "mqprio",
        .priv_size      = sizeof(struct mqprio_sched),