Commit 3faafedd authored by David S. Miller's avatar David S. Miller

Merge nuts.davemloft.net:/disk1/BK/network-2.6

into nuts.davemloft.net:/disk1/BK/net-2.6
parents db80df6e 6b829b28
...@@ -1892,6 +1892,8 @@ static int b44_resume(struct pci_dev *pdev) ...@@ -1892,6 +1892,8 @@ static int b44_resume(struct pci_dev *pdev)
if (!netif_running(dev)) if (!netif_running(dev))
return 0; return 0;
pci_restore_state(pdev, bp->pci_cfg_state);
spin_lock_irq(&bp->lock); spin_lock_irq(&bp->lock);
b44_init_rings(bp); b44_init_rings(bp);
......
...@@ -125,25 +125,27 @@ static unsigned int ip_vs_conn_hashkey(unsigned proto, __u32 addr, __u16 port) ...@@ -125,25 +125,27 @@ static unsigned int ip_vs_conn_hashkey(unsigned proto, __u32 addr, __u16 port)
static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) static inline int ip_vs_conn_hash(struct ip_vs_conn *cp)
{ {
unsigned hash; unsigned hash;
int ret;
if (cp->flags & IP_VS_CONN_F_HASHED) {
IP_VS_ERR("ip_vs_conn_hash(): request for already hashed, "
"called from %p\n", __builtin_return_address(0));
return 0;
}
/* Hash by protocol, client address and port */ /* Hash by protocol, client address and port */
hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport); hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport);
ct_write_lock(hash); ct_write_lock(hash);
list_add(&cp->c_list, &ip_vs_conn_tab[hash]); if (!(cp->flags & IP_VS_CONN_F_HASHED)) {
cp->flags |= IP_VS_CONN_F_HASHED; list_add(&cp->c_list, &ip_vs_conn_tab[hash]);
atomic_inc(&cp->refcnt); cp->flags |= IP_VS_CONN_F_HASHED;
atomic_inc(&cp->refcnt);
ret = 1;
} else {
IP_VS_ERR("ip_vs_conn_hash(): request for already hashed, "
"called from %p\n", __builtin_return_address(0));
ret = 0;
}
ct_write_unlock(hash); ct_write_unlock(hash);
return 1; return ret;
} }
...@@ -154,24 +156,24 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) ...@@ -154,24 +156,24 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp)
static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp)
{ {
unsigned hash; unsigned hash;
int ret;
if (!(cp->flags & IP_VS_CONN_F_HASHED)) {
IP_VS_ERR("ip_vs_conn_unhash(): request for unhash flagged, "
"called from %p\n", __builtin_return_address(0));
return 0;
}
/* unhash it and decrease its reference counter */ /* unhash it and decrease its reference counter */
hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport); hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport);
ct_write_lock(hash); ct_write_lock(hash);
list_del(&cp->c_list); if (cp->flags & IP_VS_CONN_F_HASHED) {
cp->flags &= ~IP_VS_CONN_F_HASHED; list_del(&cp->c_list);
atomic_dec(&cp->refcnt); cp->flags &= ~IP_VS_CONN_F_HASHED;
atomic_dec(&cp->refcnt);
ret = 1;
} else
ret = 0;
ct_write_unlock(hash); ct_write_unlock(hash);
return 1; return ret;
} }
...@@ -285,12 +287,18 @@ void ip_vs_conn_put(struct ip_vs_conn *cp) ...@@ -285,12 +287,18 @@ void ip_vs_conn_put(struct ip_vs_conn *cp)
*/ */
void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __u16 cport) void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __u16 cport)
{ {
atomic_dec(&ip_vs_conn_no_cport_cnt); if (ip_vs_conn_unhash(cp)) {
ip_vs_conn_unhash(cp); spin_lock(&cp->lock);
cp->flags &= ~IP_VS_CONN_F_NO_CPORT; if (cp->flags & IP_VS_CONN_F_NO_CPORT) {
cp->cport = cport; atomic_dec(&ip_vs_conn_no_cport_cnt);
/* hash on new dport */ cp->flags &= ~IP_VS_CONN_F_NO_CPORT;
ip_vs_conn_hash(cp); cp->cport = cport;
}
spin_unlock(&cp->lock);
/* hash on new dport */
ip_vs_conn_hash(cp);
}
} }
...@@ -457,11 +465,14 @@ int ip_vs_check_template(struct ip_vs_conn *ct) ...@@ -457,11 +465,14 @@ int ip_vs_check_template(struct ip_vs_conn *ct)
/* /*
* Invalidate the connection template * Invalidate the connection template
*/ */
ip_vs_conn_unhash(ct); if (ct->cport) {
ct->dport = 65535; if (ip_vs_conn_unhash(ct)) {
ct->vport = 65535; ct->dport = 65535;
ct->cport = 0; ct->vport = 65535;
ip_vs_conn_hash(ct); ct->cport = 0;
ip_vs_conn_hash(ct);
}
}
/* /*
* Simply decrease the refcnt of the template, * Simply decrease the refcnt of the template,
...@@ -493,7 +504,8 @@ static void ip_vs_conn_expire(unsigned long data) ...@@ -493,7 +504,8 @@ static void ip_vs_conn_expire(unsigned long data)
/* /*
* unhash it if it is hashed in the conn table * unhash it if it is hashed in the conn table
*/ */
ip_vs_conn_unhash(cp); if (!ip_vs_conn_unhash(cp))
goto expire_later;
/* /*
* refcnt==1 implies I'm the only one referrer * refcnt==1 implies I'm the only one referrer
......
...@@ -363,7 +363,7 @@ config IP_NF_NAT_LOCAL ...@@ -363,7 +363,7 @@ config IP_NF_NAT_LOCAL
Please note that you will need a recent version (>= 1.2.6a) Please note that you will need a recent version (>= 1.2.6a)
of the iptables userspace program in order to use this feature. of the iptables userspace program in order to use this feature.
See http://www.iptables.org/ for download instructions. See <http://www.iptables.org/> for download instructions.
If unsure, say 'N'. If unsure, say 'N'.
...@@ -497,7 +497,7 @@ config IP_NF_TARGET_ULOG ...@@ -497,7 +497,7 @@ config IP_NF_TARGET_ULOG
which can only be viewed through syslog. which can only be viewed through syslog.
The apropriate userspace logging daemon (ulogd) may be obtained from The apropriate userspace logging daemon (ulogd) may be obtained from
http://www.gnumonks.org/projects/ulogd <http://www.gnumonks.org/projects/ulogd/>
To compile it as a module, choose M here. If unsure, say N. To compile it as a module, choose M here. If unsure, say N.
......
...@@ -221,7 +221,7 @@ static const char *masq_proto_name(u_int16_t protonum) ...@@ -221,7 +221,7 @@ static const char *masq_proto_name(u_int16_t protonum)
case IPPROTO_TCP: return "TCP"; case IPPROTO_TCP: return "TCP";
case IPPROTO_UDP: return "UDP"; case IPPROTO_UDP: return "UDP";
case IPPROTO_ICMP: return "ICMP"; case IPPROTO_ICMP: return "ICMP";
default: return "MORE-CAFFIENE-FOR-RUSTY"; default: return "MORE-CAFFEINE-FOR-RUSTY";
} }
} }
......
...@@ -101,6 +101,7 @@ ...@@ -101,6 +101,7 @@
#include <linux/stat.h> #include <linux/stat.h>
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>");
MODULE_DESCRIPTION("ipchains backwards compatibility layer"); MODULE_DESCRIPTION("ipchains backwards compatibility layer");
/* Understanding locking in this code: (thanks to Alan Cox for using /* Understanding locking in this code: (thanks to Alan Cox for using
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment