Commit ff7095c0 authored by David S. Miller's avatar David S. Miller

Merge bk://kernel.bkbits.net/acme/net-2.5

into nuts.ninka.net:/home/davem/src/BK/net-2.5
parents c618808d dec22cdc
...@@ -289,21 +289,53 @@ static __inline__ void sk_node_init(struct hlist_node *node) ...@@ -289,21 +289,53 @@ static __inline__ void sk_node_init(struct hlist_node *node)
node->pprev = NULL; node->pprev = NULL;
} }
static __inline__ int sk_del_node_init(struct sock *sk) static __inline__ void __sk_del_node(struct sock *sk)
{
__hlist_del(&sk->sk_node);
}
static __inline__ int __sk_del_node_init(struct sock *sk)
{ {
if (sk_hashed(sk)) { if (sk_hashed(sk)) {
__hlist_del(&sk->sk_node); __sk_del_node(sk);
sk_node_init(&sk->sk_node); sk_node_init(&sk->sk_node);
return 1; return 1;
} }
return 0; return 0;
} }
static __inline__ void sk_add_node(struct sock *sk, struct hlist_head *list) static inline void __sock_put(struct sock *sk);
static __inline__ int sk_del_node_init(struct sock *sk)
{
int rc = __sk_del_node_init(sk);
if (rc) {
/* paranoid for a while -acme */
WARN_ON(atomic_read(&sk->sk_refcnt) == 1);
__sock_put(sk);
}
return rc;
}
static __inline__ void __sk_add_node(struct sock *sk, struct hlist_head *list)
{ {
hlist_add_head(&sk->sk_node, list); hlist_add_head(&sk->sk_node, list);
} }
static inline void sock_hold(struct sock *sk);
static __inline__ void sk_add_node(struct sock *sk, struct hlist_head *list)
{
sock_hold(sk);
__sk_add_node(sk, list);
}
static __inline__ void __sk_del_bind_node(struct sock *sk)
{
__hlist_del(&sk->sk_bind_node);
}
static __inline__ void sk_add_bind_node(struct sock *sk, static __inline__ void sk_add_bind_node(struct sock *sk,
struct hlist_head *list) struct hlist_head *list)
{ {
......
...@@ -143,15 +143,13 @@ void bt_sock_link(struct bt_sock_list *l, struct sock *sk) ...@@ -143,15 +143,13 @@ void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
{ {
write_lock_bh(&l->lock); write_lock_bh(&l->lock);
sk_add_node(sk, &l->head); sk_add_node(sk, &l->head);
sock_hold(sk);
write_unlock_bh(&l->lock); write_unlock_bh(&l->lock);
} }
void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk) void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
{ {
write_lock_bh(&l->lock); write_lock_bh(&l->lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
write_unlock_bh(&l->lock); write_unlock_bh(&l->lock);
} }
......
...@@ -276,7 +276,7 @@ static void dn_rehash_sock(struct sock *sk) ...@@ -276,7 +276,7 @@ static void dn_rehash_sock(struct sock *sk)
return; return;
write_lock_bh(&dn_hash_lock); write_lock_bh(&dn_hash_lock);
hlist_del(&sk->sk_node); sk_del_node_init(sk);
DN_SK(sk)->addrloc = 0; DN_SK(sk)->addrloc = 0;
list = listen_hash(&DN_SK(sk)->addr); list = listen_hash(&DN_SK(sk)->addr);
sk_add_node(sk, list); sk_add_node(sk, list);
......
...@@ -96,8 +96,7 @@ struct ec_cb ...@@ -96,8 +96,7 @@ struct ec_cb
static void econet_remove_socket(struct hlist_head *list, struct sock *sk) static void econet_remove_socket(struct hlist_head *list, struct sock *sk)
{ {
write_lock_bh(&econet_lock); write_lock_bh(&econet_lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
sock_put(sk);
write_unlock_bh(&econet_lock); write_unlock_bh(&econet_lock);
} }
...@@ -105,7 +104,6 @@ static void econet_insert_socket(struct hlist_head *list, struct sock *sk) ...@@ -105,7 +104,6 @@ static void econet_insert_socket(struct hlist_head *list, struct sock *sk)
{ {
write_lock_bh(&econet_lock); write_lock_bh(&econet_lock);
sk_add_node(sk, list); sk_add_node(sk, list);
sock_hold(sk);
write_unlock_bh(&econet_lock); write_unlock_bh(&econet_lock);
} }
......
...@@ -91,17 +91,14 @@ static void raw_v4_hash(struct sock *sk) ...@@ -91,17 +91,14 @@ static void raw_v4_hash(struct sock *sk)
write_lock_bh(&raw_v4_lock); write_lock_bh(&raw_v4_lock);
sk_add_node(sk, head); sk_add_node(sk, head);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
sock_hold(sk);
write_unlock_bh(&raw_v4_lock); write_unlock_bh(&raw_v4_lock);
} }
static void raw_v4_unhash(struct sock *sk) static void raw_v4_unhash(struct sock *sk)
{ {
write_lock_bh(&raw_v4_lock); write_lock_bh(&raw_v4_lock);
if (sk_del_node_init(sk)) { if (sk_del_node_init(sk))
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
__sock_put(sk);
}
write_unlock_bh(&raw_v4_lock); write_unlock_bh(&raw_v4_lock);
} }
......
...@@ -302,7 +302,7 @@ static void __tcp_put_port(struct sock *sk) ...@@ -302,7 +302,7 @@ static void __tcp_put_port(struct sock *sk)
spin_lock(&head->lock); spin_lock(&head->lock);
tb = tcp_sk(sk)->bind_hash; tb = tcp_sk(sk)->bind_hash;
__hlist_del(&sk->sk_bind_node); __sk_del_bind_node(sk);
tcp_sk(sk)->bind_hash = NULL; tcp_sk(sk)->bind_hash = NULL;
inet->num = 0; inet->num = 0;
tcp_bucket_destroy(tb); tcp_bucket_destroy(tb);
...@@ -359,7 +359,7 @@ static __inline__ void __tcp_v4_hash(struct sock *sk, const int listen_possible) ...@@ -359,7 +359,7 @@ static __inline__ void __tcp_v4_hash(struct sock *sk, const int listen_possible)
lock = &tcp_ehash[sk->sk_hashent].lock; lock = &tcp_ehash[sk->sk_hashent].lock;
write_lock(lock); write_lock(lock);
} }
sk_add_node(sk, list); __sk_add_node(sk, list);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
write_unlock(lock); write_unlock(lock);
if (listen_possible && sk->sk_state == TCP_LISTEN) if (listen_possible && sk->sk_state == TCP_LISTEN)
...@@ -392,7 +392,7 @@ void tcp_unhash(struct sock *sk) ...@@ -392,7 +392,7 @@ void tcp_unhash(struct sock *sk)
write_lock_bh(&head->lock); write_lock_bh(&head->lock);
} }
if (sk_del_node_init(sk)) if (__sk_del_node_init(sk))
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
write_unlock_bh(lock); write_unlock_bh(lock);
...@@ -608,7 +608,7 @@ static int __tcp_v4_check_established(struct sock *sk, __u16 lport, ...@@ -608,7 +608,7 @@ static int __tcp_v4_check_established(struct sock *sk, __u16 lport,
inet->sport = htons(lport); inet->sport = htons(lport);
sk->sk_hashent = hash; sk->sk_hashent = hash;
BUG_TRAP(sk_unhashed(sk)); BUG_TRAP(sk_unhashed(sk));
sk_add_node(sk, &head->chain); __sk_add_node(sk, &head->chain);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
write_unlock(&head->lock); write_unlock(&head->lock);
......
...@@ -309,7 +309,7 @@ static void __tcp_tw_hashdance(struct sock *sk, struct tcp_tw_bucket *tw) ...@@ -309,7 +309,7 @@ static void __tcp_tw_hashdance(struct sock *sk, struct tcp_tw_bucket *tw)
write_lock(&ehead->lock); write_lock(&ehead->lock);
/* Step 2: Remove SK from established hash. */ /* Step 2: Remove SK from established hash. */
if (sk_del_node_init(sk)) if (__sk_del_node_init(sk))
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
/* Step 3: Hash TW into TIMEWAIT half of established hash table. */ /* Step 3: Hash TW into TIMEWAIT half of established hash table. */
......
...@@ -189,7 +189,6 @@ static int udp_v4_get_port(struct sock *sk, unsigned short snum) ...@@ -189,7 +189,6 @@ static int udp_v4_get_port(struct sock *sk, unsigned short snum)
sk_add_node(sk, h); sk_add_node(sk, h);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
sock_hold(sk);
} }
write_unlock_bh(&udp_hash_lock); write_unlock_bh(&udp_hash_lock);
return 0; return 0;
...@@ -210,7 +209,6 @@ static void udp_v4_unhash(struct sock *sk) ...@@ -210,7 +209,6 @@ static void udp_v4_unhash(struct sock *sk)
if (sk_del_node_init(sk)) { if (sk_del_node_init(sk)) {
inet_sk(sk)->num = 0; inet_sk(sk)->num = 0;
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
__sock_put(sk);
} }
write_unlock_bh(&udp_hash_lock); write_unlock_bh(&udp_hash_lock);
} }
......
...@@ -64,17 +64,14 @@ static void raw_v6_hash(struct sock *sk) ...@@ -64,17 +64,14 @@ static void raw_v6_hash(struct sock *sk)
write_lock_bh(&raw_v6_lock); write_lock_bh(&raw_v6_lock);
sk_add_node(sk, list); sk_add_node(sk, list);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
sock_hold(sk);
write_unlock_bh(&raw_v6_lock); write_unlock_bh(&raw_v6_lock);
} }
static void raw_v6_unhash(struct sock *sk) static void raw_v6_unhash(struct sock *sk)
{ {
write_lock_bh(&raw_v6_lock); write_lock_bh(&raw_v6_lock);
if (sk_del_node_init(sk)) { if (sk_del_node_init(sk))
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
__sock_put(sk);
}
write_unlock_bh(&raw_v6_lock); write_unlock_bh(&raw_v6_lock);
} }
......
...@@ -160,7 +160,6 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum) ...@@ -160,7 +160,6 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum)
if (sk_unhashed(sk)) { if (sk_unhashed(sk)) {
sk_add_node(sk, &udp_hash[snum & (UDP_HTABLE_SIZE - 1)]); sk_add_node(sk, &udp_hash[snum & (UDP_HTABLE_SIZE - 1)]);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
sock_hold(sk);
} }
write_unlock_bh(&udp_hash_lock); write_unlock_bh(&udp_hash_lock);
return 0; return 0;
...@@ -181,7 +180,6 @@ static void udp_v6_unhash(struct sock *sk) ...@@ -181,7 +180,6 @@ static void udp_v6_unhash(struct sock *sk)
if (sk_del_node_init(sk)) { if (sk_del_node_init(sk)) {
inet_sk(sk)->num = 0; inet_sk(sk)->num = 0;
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
__sock_put(sk);
} }
write_unlock_bh(&udp_hash_lock); write_unlock_bh(&udp_hash_lock);
} }
......
...@@ -142,7 +142,6 @@ static void ipx_remove_socket(struct sock *sk) ...@@ -142,7 +142,6 @@ static void ipx_remove_socket(struct sock *sk)
spin_lock_bh(&intrfc->if_sklist_lock); spin_lock_bh(&intrfc->if_sklist_lock);
sk_del_node_init(sk); sk_del_node_init(sk);
spin_unlock_bh(&intrfc->if_sklist_lock); spin_unlock_bh(&intrfc->if_sklist_lock);
sock_put(sk);
ipxitf_put(intrfc); ipxitf_put(intrfc);
out: out:
return; return;
...@@ -229,7 +228,6 @@ struct ipx_interface *ipxitf_find_using_net(__u32 net) ...@@ -229,7 +228,6 @@ struct ipx_interface *ipxitf_find_using_net(__u32 net)
static void ipxitf_insert_socket(struct ipx_interface *intrfc, struct sock *sk) static void ipxitf_insert_socket(struct ipx_interface *intrfc, struct sock *sk)
{ {
ipxitf_hold(intrfc); ipxitf_hold(intrfc);
sock_hold(sk);
spin_lock_bh(&intrfc->if_sklist_lock); spin_lock_bh(&intrfc->if_sklist_lock);
ipx_sk(sk)->intrfc = intrfc; ipx_sk(sk)->intrfc = intrfc;
sk_add_node(sk, &intrfc->if_sklist); sk_add_node(sk, &intrfc->if_sklist);
......
...@@ -115,15 +115,13 @@ static void pfkey_insert(struct sock *sk) ...@@ -115,15 +115,13 @@ static void pfkey_insert(struct sock *sk)
{ {
pfkey_table_grab(); pfkey_table_grab();
sk_add_node(sk, &pfkey_table); sk_add_node(sk, &pfkey_table);
sock_hold(sk);
pfkey_table_ungrab(); pfkey_table_ungrab();
} }
static void pfkey_remove(struct sock *sk) static void pfkey_remove(struct sock *sk)
{ {
pfkey_table_grab(); pfkey_table_grab();
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
pfkey_table_ungrab(); pfkey_table_ungrab();
} }
......
...@@ -35,7 +35,6 @@ void llc_sap_assign_sock(struct llc_sap *sap, struct sock *sk) ...@@ -35,7 +35,6 @@ void llc_sap_assign_sock(struct llc_sap *sap, struct sock *sk)
write_lock_bh(&sap->sk_list.lock); write_lock_bh(&sap->sk_list.lock);
llc_sk(sk)->sap = sap; llc_sk(sk)->sap = sap;
sk_add_node(sk, &sap->sk_list.list); sk_add_node(sk, &sap->sk_list.list);
sock_hold(sk);
write_unlock_bh(&sap->sk_list.lock); write_unlock_bh(&sap->sk_list.lock);
} }
...@@ -50,8 +49,7 @@ void llc_sap_assign_sock(struct llc_sap *sap, struct sock *sk) ...@@ -50,8 +49,7 @@ void llc_sap_assign_sock(struct llc_sap *sap, struct sock *sk)
void llc_sap_unassign_sock(struct llc_sap *sap, struct sock *sk) void llc_sap_unassign_sock(struct llc_sap *sap, struct sock *sk)
{ {
write_lock_bh(&sap->sk_list.lock); write_lock_bh(&sap->sk_list.lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
sock_put(sk);
write_unlock_bh(&sap->sk_list.lock); write_unlock_bh(&sap->sk_list.lock);
} }
......
...@@ -193,7 +193,6 @@ static int netlink_insert(struct sock *sk, u32 pid) ...@@ -193,7 +193,6 @@ static int netlink_insert(struct sock *sk, u32 pid)
if (nlk_sk(sk)->pid == 0) { if (nlk_sk(sk)->pid == 0) {
nlk_sk(sk)->pid = pid; nlk_sk(sk)->pid = pid;
sk_add_node(sk, &nl_table[sk->sk_protocol]); sk_add_node(sk, &nl_table[sk->sk_protocol]);
sock_hold(sk);
err = 0; err = 0;
} }
} }
...@@ -204,8 +203,7 @@ static int netlink_insert(struct sock *sk, u32 pid) ...@@ -204,8 +203,7 @@ static int netlink_insert(struct sock *sk, u32 pid)
static void netlink_remove(struct sock *sk) static void netlink_remove(struct sock *sk)
{ {
netlink_table_grab(); netlink_table_grab();
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
netlink_table_ungrab(); netlink_table_ungrab();
} }
......
...@@ -758,8 +758,7 @@ static int packet_release(struct socket *sock) ...@@ -758,8 +758,7 @@ static int packet_release(struct socket *sock)
return 0; return 0;
write_lock_bh(&packet_sklist_lock); write_lock_bh(&packet_sklist_lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
write_unlock_bh(&packet_sklist_lock); write_unlock_bh(&packet_sklist_lock);
/* /*
...@@ -984,7 +983,6 @@ static int packet_create(struct socket *sock, int protocol) ...@@ -984,7 +983,6 @@ static int packet_create(struct socket *sock, int protocol)
write_lock_bh(&packet_sklist_lock); write_lock_bh(&packet_sklist_lock);
sk_add_node(sk, &packet_sklist); sk_add_node(sk, &packet_sklist);
sock_hold(sk);
write_unlock_bh(&packet_sklist_lock); write_unlock_bh(&packet_sklist_lock);
return(0); return(0);
......
...@@ -3346,7 +3346,7 @@ static __inline__ void __sctp_put_port(struct sock *sk) ...@@ -3346,7 +3346,7 @@ static __inline__ void __sctp_put_port(struct sock *sk)
sctp_spin_lock(&head->lock); sctp_spin_lock(&head->lock);
pp = sctp_sk(sk)->bind_hash; pp = sctp_sk(sk)->bind_hash;
hlist_del(&sk->sk_bind_node); __sk_del_bind_node(sk);
sctp_sk(sk)->bind_hash = NULL; sctp_sk(sk)->bind_hash = NULL;
inet_sk(sk)->num = 0; inet_sk(sk)->num = 0;
sctp_bucket_destroy(pp); sctp_bucket_destroy(pp);
......
...@@ -211,15 +211,13 @@ static int unix_mkname(struct sockaddr_un * sunaddr, int len, unsigned *hashp) ...@@ -211,15 +211,13 @@ static int unix_mkname(struct sockaddr_un * sunaddr, int len, unsigned *hashp)
static void __unix_remove_socket(struct sock *sk) static void __unix_remove_socket(struct sock *sk)
{ {
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
} }
static void __unix_insert_socket(struct hlist_head *list, struct sock *sk) static void __unix_insert_socket(struct hlist_head *list, struct sock *sk)
{ {
BUG_TRAP(sk_unhashed(sk)); BUG_TRAP(sk_unhashed(sk));
sk_add_node(sk, list); sk_add_node(sk, list);
sock_hold(sk);
} }
static inline void unix_remove_socket(struct sock *sk) static inline void unix_remove_socket(struct sock *sk)
......
...@@ -982,8 +982,7 @@ static int wanpipe_release(struct socket *sock) ...@@ -982,8 +982,7 @@ static int wanpipe_release(struct socket *sock)
set_bit(1,&wanpipe_tx_critical); set_bit(1,&wanpipe_tx_critical);
write_lock(&wanpipe_sklist_lock); write_lock(&wanpipe_sklist_lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
clear_bit(1,&wanpipe_tx_critical); clear_bit(1,&wanpipe_tx_critical);
...@@ -1143,8 +1142,7 @@ static void wanpipe_kill_sock_timer (unsigned long data) ...@@ -1143,8 +1142,7 @@ static void wanpipe_kill_sock_timer (unsigned long data)
} }
write_lock(&wanpipe_sklist_lock); write_lock(&wanpipe_sklist_lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
__sock_put(sk);
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
...@@ -1206,8 +1204,7 @@ static void wanpipe_kill_sock_accept (struct sock *sk) ...@@ -1206,8 +1204,7 @@ static void wanpipe_kill_sock_accept (struct sock *sk)
* appropriate locks */ * appropriate locks */
write_lock(&wanpipe_sklist_lock); write_lock(&wanpipe_sklist_lock);
if (sk_del_node_init(init)) sk_del_node_init(sk);
__sock_put(sk);
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
sk->sk_socket = NULL; sk->sk_socket = NULL;
...@@ -1536,7 +1533,6 @@ static int wanpipe_create(struct socket *sock, int protocol) ...@@ -1536,7 +1533,6 @@ static int wanpipe_create(struct socket *sock, int protocol)
set_bit(1,&wanpipe_tx_critical); set_bit(1,&wanpipe_tx_critical);
write_lock(&wanpipe_sklist_lock); write_lock(&wanpipe_sklist_lock);
sk_add_node(sk, &wanpipe_sklist); sk_add_node(sk, &wanpipe_sklist);
sock_hold(sk);
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
clear_bit(1,&wanpipe_tx_critical); clear_bit(1,&wanpipe_tx_critical);
...@@ -2434,7 +2430,6 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags ...@@ -2434,7 +2430,6 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
set_bit(1,&wanpipe_tx_critical); set_bit(1,&wanpipe_tx_critical);
write_lock(&wanpipe_sklist_lock); write_lock(&wanpipe_sklist_lock);
sk_add_node(newsk, &wanpipe_sklist); sk_add_node(newsk, &wanpipe_sklist);
sock_hold(sk);
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
clear_bit(1,&wanpipe_tx_critical); clear_bit(1,&wanpipe_tx_critical);
......
...@@ -154,8 +154,7 @@ int x25_addr_aton(unsigned char *p, struct x25_address *called_addr, ...@@ -154,8 +154,7 @@ int x25_addr_aton(unsigned char *p, struct x25_address *called_addr,
static void x25_remove_socket(struct sock *sk) static void x25_remove_socket(struct sock *sk)
{ {
write_lock_bh(&x25_list_lock); write_lock_bh(&x25_list_lock);
if (sk_del_node_init(sk)) sk_del_node_init(sk);
sock_put(sk);
write_unlock_bh(&x25_list_lock); write_unlock_bh(&x25_list_lock);
} }
...@@ -219,7 +218,6 @@ static void x25_insert_socket(struct sock *sk) ...@@ -219,7 +218,6 @@ static void x25_insert_socket(struct sock *sk)
{ {
write_lock_bh(&x25_list_lock); write_lock_bh(&x25_list_lock);
sk_add_node(sk, &x25_list); sk_add_node(sk, &x25_list);
sock_hold(sk);
write_unlock_bh(&x25_list_lock); write_unlock_bh(&x25_list_lock);
} }
......
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