Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch
authorDavid S. Miller <davem@davemloft.net>
Fri, 15 Mar 2013 13:00:39 +0000 (09:00 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Mar 2013 13:00:39 +0000 (09:00 -0400)
Jesse Gross says:

====================
A few different bug fixes, including several for issues with userspace
communication that have gone unnoticed up until now.  These are intended
for net/3.9.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
net/openvswitch/datapath.c
net/openvswitch/flow.c
net/openvswitch/vport.c

@@@ -158,10 -158,11 +158,10 @@@ static struct hlist_head *vport_hash_bu
  struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no)
  {
        struct vport *vport;
 -      struct hlist_node *n;
        struct hlist_head *head;
  
        head = vport_hash_bucket(dp, port_no);
 -      hlist_for_each_entry_rcu(vport, n, head, dp_hash_node) {
 +      hlist_for_each_entry_rcu(vport, head, dp_hash_node) {
                if (vport->port_no == port_no)
                        return vport;
        }
@@@ -300,7 -301,7 +300,7 @@@ static int queue_gso_packets(struct ne
        struct sk_buff *segs, *nskb;
        int err;
  
 -      segs = skb_gso_segment(skb, NETIF_F_SG | NETIF_F_HW_CSUM);
 +      segs = __skb_gso_segment(skb, NETIF_F_SG | NETIF_F_HW_CSUM, false);
        if (IS_ERR(segs))
                return PTR_ERR(segs);
  
@@@ -394,6 -395,7 +394,7 @@@ static int queue_userspace_packet(struc
  
        skb_copy_and_csum_dev(skb, nla_data(nla));
  
+       genlmsg_end(user_skb, upcall);
        err = genlmsg_unicast(net, user_skb, upcall_info->portid);
  
  out:
@@@ -1385,9 -1387,9 +1386,9 @@@ static void __dp_destroy(struct datapat
  
        for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) {
                struct vport *vport;
 -              struct hlist_node *node, *n;
 +              struct hlist_node *n;
  
 -              hlist_for_each_entry_safe(vport, node, n, &dp->ports[i], dp_hash_node)
 +              hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node)
                        if (vport->port_no != OVSP_LOCAL)
                                ovs_dp_detach_port(vport);
        }
@@@ -1690,6 -1692,7 +1691,7 @@@ static int ovs_vport_cmd_new(struct sk_
        if (IS_ERR(vport))
                goto exit_unlock;
  
+       err = 0;
        reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq,
                                         OVS_VPORT_CMD_NEW);
        if (IS_ERR(reply)) {
@@@ -1771,6 -1774,7 +1773,7 @@@ static int ovs_vport_cmd_del(struct sk_
        if (IS_ERR(reply))
                goto exit_unlock;
  
+       err = 0;
        ovs_dp_detach_port(vport);
  
        genl_notify(reply, genl_info_net(info), info->snd_portid,
@@@ -1824,9 -1828,10 +1827,9 @@@ static int ovs_vport_cmd_dump(struct sk
        rcu_read_lock();
        for (i = bucket; i < DP_VPORT_HASH_BUCKETS; i++) {
                struct vport *vport;
 -              struct hlist_node *n;
  
                j = 0;
 -              hlist_for_each_entry_rcu(vport, n, &dp->ports[i], dp_hash_node) {
 +              hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node) {
                        if (j >= skip &&
                            ovs_vport_cmd_fill_info(vport, skb,
                                                    NETLINK_CB(cb->skb).portid,
@@@ -1987,9 -1992,10 +1990,9 @@@ static struct pernet_operations ovs_net
  
  static int __init dp_init(void)
  {
 -      struct sk_buff *dummy_skb;
        int err;
  
 -      BUILD_BUG_ON(sizeof(struct ovs_skb_cb) > sizeof(dummy_skb->cb));
 +      BUILD_BUG_ON(sizeof(struct ovs_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb));
  
        pr_info("Open vSwitch switching datapath\n");
  
diff --combined net/openvswitch/flow.c
@@@ -299,10 -299,10 +299,10 @@@ void ovs_flow_tbl_destroy(struct flow_t
        for (i = 0; i < table->n_buckets; i++) {
                struct sw_flow *flow;
                struct hlist_head *head = flex_array_get(table->buckets, i);
 -              struct hlist_node *node, *n;
 +              struct hlist_node *n;
                int ver = table->node_ver;
  
 -              hlist_for_each_entry_safe(flow, node, n, head, hash_node[ver]) {
 +              hlist_for_each_entry_safe(flow, n, head, hash_node[ver]) {
                        hlist_del_rcu(&flow->hash_node[ver]);
                        ovs_flow_free(flow);
                }
@@@ -332,6 -332,7 +332,6 @@@ struct sw_flow *ovs_flow_tbl_next(struc
  {
        struct sw_flow *flow;
        struct hlist_head *head;
 -      struct hlist_node *n;
        int ver;
        int i;
  
        while (*bucket < table->n_buckets) {
                i = 0;
                head = flex_array_get(table->buckets, *bucket);
 -              hlist_for_each_entry_rcu(flow, n, head, hash_node[ver]) {
 +              hlist_for_each_entry_rcu(flow, head, hash_node[ver]) {
                        if (i < *last) {
                                i++;
                                continue;
@@@ -366,10 -367,11 +366,10 @@@ static void flow_table_copy_flows(struc
        for (i = 0; i < old->n_buckets; i++) {
                struct sw_flow *flow;
                struct hlist_head *head;
 -              struct hlist_node *n;
  
                head = flex_array_get(old->buckets, i);
  
 -              hlist_for_each_entry(flow, n, head, hash_node[old_ver])
 +              hlist_for_each_entry(flow, head, hash_node[old_ver])
                        ovs_flow_tbl_insert(new, flow);
        }
        old->keep_flows = true;
@@@ -482,7 -484,11 +482,11 @@@ static __be16 parse_ethertype(struct sk
                return htons(ETH_P_802_2);
  
        __skb_pull(skb, sizeof(struct llc_snap_hdr));
-       return llc->ethertype;
+       if (ntohs(llc->ethertype) >= 1536)
+               return llc->ethertype;
+       return htons(ETH_P_802_2);
  }
  
  static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key,
@@@ -764,13 -770,14 +768,13 @@@ struct sw_flow *ovs_flow_tbl_lookup(str
                                struct sw_flow_key *key, int key_len)
  {
        struct sw_flow *flow;
 -      struct hlist_node *n;
        struct hlist_head *head;
        u32 hash;
  
        hash = ovs_flow_hash(key, key_len);
  
        head = find_bucket(table, hash);
 -      hlist_for_each_entry_rcu(flow, n, head, hash_node[table->node_ver]) {
 +      hlist_for_each_entry_rcu(flow, head, hash_node[table->node_ver]) {
  
                if (flow->hash == hash &&
                    !memcmp(&flow->key, key, key_len)) {
diff --combined net/openvswitch/vport.c
@@@ -86,8 -86,9 +86,8 @@@ struct vport *ovs_vport_locate(struct n
  {
        struct hlist_head *bucket = hash_bucket(net, name);
        struct vport *vport;
 -      struct hlist_node *node;
  
 -      hlist_for_each_entry_rcu(vport, node, bucket, hash_node)
 +      hlist_for_each_entry_rcu(vport, bucket, hash_node)
                if (!strcmp(name, vport->ops->get_name(vport)) &&
                    net_eq(ovs_dp_get_net(vport->dp), net))
                        return vport;
@@@ -325,8 -326,7 +325,7 @@@ int ovs_vport_get_options(const struct 
   * @skb: skb that was received
   *
   * Must be called with rcu_read_lock.  The packet cannot be shared and
-  * skb->data should point to the Ethernet header.  The caller must have already
-  * called compute_ip_summed() to initialize the checksumming fields.
+  * skb->data should point to the Ethernet header.
   */
  void ovs_vport_receive(struct vport *vport, struct sk_buff *skb)
  {