diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-13 00:19:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-13 00:19:42 -0400 |
commit | e47f31787dee5bf57453e18edefff56e17fa44f9 (patch) | |
tree | 6c86b53192526bf9b7f6581720dbd12dc085aff5 /net/netrom/af_netrom.c | |
parent | a0486407bea3f0545ee3fcfb768b6763c5c2b459 (diff) | |
parent | a6f157a88d1398d7ccb743c5a56138edf6f6ef0b (diff) |
Merge commit master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 of HEAD
* HEAD:
[NET]: fix __sk_stream_mem_reclaim
[Bluetooth] Fix deadlock in the L2CAP layer
[Bluetooth] Let BT_HIDP depend on INPUT
[Bluetooth] Avoid NULL pointer dereference with tty->driver
[Bluetooth] Remaining transitions to use kzalloc()
[WAN]: converting generic HDLC to use netif_dormant*()
[IPV4]: Fix error handling for fib_insert_node call
[NETROM] lockdep: fix false positive
[ROSE] lockdep: fix false positive
[AX.25]: Optimize AX.25 socket list lock
[IPCOMP]: Fix truesize after decompression
[IPV6]: Use ipv6_addr_src_scope for link address sorting.
[TCP] tcp_highspeed: Fix AI updates.
[MAINTAINERS]: Add proper entry for TC classifier
[NETROM]: Drop lock before calling nr_destroy_socket
[NETROM]: Fix locking order when establishing a NETROM circuit.
[AX.25]: Fix locking of ax25 protocol function list.
[IPV6]: order addresses by scope
Diffstat (limited to 'net/netrom/af_netrom.c')
-rw-r--r-- | net/netrom/af_netrom.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index ecc796878f38..1d50f801f181 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -66,6 +66,14 @@ static DEFINE_SPINLOCK(nr_list_lock); | |||
66 | static const struct proto_ops nr_proto_ops; | 66 | static const struct proto_ops nr_proto_ops; |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * NETROM network devices are virtual network devices encapsulating NETROM | ||
70 | * frames into AX.25 which will be sent through an AX.25 device, so form a | ||
71 | * special "super class" of normal net devices; split their locks off into a | ||
72 | * separate class since they always nest. | ||
73 | */ | ||
74 | static struct lock_class_key nr_netdev_xmit_lock_key; | ||
75 | |||
76 | /* | ||
69 | * Socket removal during an interrupt is now safe. | 77 | * Socket removal during an interrupt is now safe. |
70 | */ | 78 | */ |
71 | static void nr_remove_socket(struct sock *sk) | 79 | static void nr_remove_socket(struct sock *sk) |
@@ -986,18 +994,18 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) | |||
986 | nr_make->vl = 0; | 994 | nr_make->vl = 0; |
987 | nr_make->state = NR_STATE_3; | 995 | nr_make->state = NR_STATE_3; |
988 | sk_acceptq_added(sk); | 996 | sk_acceptq_added(sk); |
989 | |||
990 | nr_insert_socket(make); | ||
991 | |||
992 | skb_queue_head(&sk->sk_receive_queue, skb); | 997 | skb_queue_head(&sk->sk_receive_queue, skb); |
993 | 998 | ||
994 | nr_start_heartbeat(make); | ||
995 | nr_start_idletimer(make); | ||
996 | |||
997 | if (!sock_flag(sk, SOCK_DEAD)) | 999 | if (!sock_flag(sk, SOCK_DEAD)) |
998 | sk->sk_data_ready(sk, skb->len); | 1000 | sk->sk_data_ready(sk, skb->len); |
999 | 1001 | ||
1000 | bh_unlock_sock(sk); | 1002 | bh_unlock_sock(sk); |
1003 | |||
1004 | nr_insert_socket(make); | ||
1005 | |||
1006 | nr_start_heartbeat(make); | ||
1007 | nr_start_idletimer(make); | ||
1008 | |||
1001 | return 1; | 1009 | return 1; |
1002 | } | 1010 | } |
1003 | 1011 | ||
@@ -1405,6 +1413,7 @@ static int __init nr_proto_init(void) | |||
1405 | free_netdev(dev); | 1413 | free_netdev(dev); |
1406 | goto fail; | 1414 | goto fail; |
1407 | } | 1415 | } |
1416 | lockdep_set_class(&dev->_xmit_lock, &nr_netdev_xmit_lock_key); | ||
1408 | dev_nr[i] = dev; | 1417 | dev_nr[i] = dev; |
1409 | } | 1418 | } |
1410 | 1419 | ||