Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 25 Apr 2010 23:28:56 +0000 (16:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 25 Apr 2010 23:28:56 +0000 (16:28 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  ipv6: Fix inet6_csk_bind_conflict()
  e100: Fix the TX workqueue race

drivers/net/e100.c
net/ipv6/inet6_connection_sock.c

index b997e57..7910803 100644 (file)
 #include <linux/ethtool.h>
 #include <linux/string.h>
 #include <linux/firmware.h>
+#include <linux/rtnetlink.h>
 #include <asm/unaligned.h>
 
 
@@ -2265,8 +2266,13 @@ static void e100_tx_timeout_task(struct work_struct *work)
 
        DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
                ioread8(&nic->csr->scb.status));
-       e100_down(netdev_priv(netdev));
-       e100_up(netdev_priv(netdev));
+
+       rtnl_lock();
+       if (netif_running(netdev)) {
+               e100_down(netdev_priv(netdev));
+               e100_up(netdev_priv(netdev));
+       }
+       rtnl_unlock();
 }
 
 static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
index b4b7d40..3a4d92b 100644 (file)
@@ -48,7 +48,7 @@ int inet6_csk_bind_conflict(const struct sock *sk,
                             ipv6_rcv_saddr_equal(sk, sk2))
                                break;
                        else if (sk->sk_reuse && sk2->sk_reuse &&
-                               !ipv6_addr_any(inet6_rcv_saddr(sk2)) &&
+                               !ipv6_addr_any(inet6_rcv_saddr(sk)) &&
                                ipv6_rcv_saddr_equal(sk, sk2))
                                break;
                }