diff options
| author | Ralf Baechle <ralf@linux-mips.org> | 2006-07-10 19:21:29 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-07-12 16:58:40 -0400 |
| commit | 95ff9f4d3cc72b62b76498290d00d129e1e62545 (patch) | |
| tree | 05db2299df178da6eca5aef25dc18ece8f5053a3 | |
| parent | e55ffac6011731c455856072cb23aa20bd55c367 (diff) | |
[AX.25]: Fix locking of ax25 protocol function list.
Delivery of AX.25 frame to the layer 3 protocols happens in softirq
context so locking needs to be bh-proof.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/ax25/ax25_iface.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/ax25/ax25_iface.c b/net/ax25/ax25_iface.c index 77ba07c67682..07ac0207eb69 100644 --- a/net/ax25/ax25_iface.c +++ b/net/ax25/ax25_iface.c | |||
| @@ -66,10 +66,10 @@ int ax25_protocol_register(unsigned int pid, | |||
| 66 | protocol->pid = pid; | 66 | protocol->pid = pid; |
| 67 | protocol->func = func; | 67 | protocol->func = func; |
| 68 | 68 | ||
| 69 | write_lock(&protocol_list_lock); | 69 | write_lock_bh(&protocol_list_lock); |
| 70 | protocol->next = protocol_list; | 70 | protocol->next = protocol_list; |
| 71 | protocol_list = protocol; | 71 | protocol_list = protocol; |
| 72 | write_unlock(&protocol_list_lock); | 72 | write_unlock_bh(&protocol_list_lock); |
| 73 | 73 | ||
| 74 | return 1; | 74 | return 1; |
| 75 | } | 75 | } |
| @@ -80,16 +80,16 @@ void ax25_protocol_release(unsigned int pid) | |||
| 80 | { | 80 | { |
| 81 | struct protocol_struct *s, *protocol; | 81 | struct protocol_struct *s, *protocol; |
| 82 | 82 | ||
| 83 | write_lock(&protocol_list_lock); | 83 | write_lock_bh(&protocol_list_lock); |
| 84 | protocol = protocol_list; | 84 | protocol = protocol_list; |
| 85 | if (protocol == NULL) { | 85 | if (protocol == NULL) { |
| 86 | write_unlock(&protocol_list_lock); | 86 | write_unlock_bh(&protocol_list_lock); |
| 87 | return; | 87 | return; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | if (protocol->pid == pid) { | 90 | if (protocol->pid == pid) { |
| 91 | protocol_list = protocol->next; | 91 | protocol_list = protocol->next; |
| 92 | write_unlock(&protocol_list_lock); | 92 | write_unlock_bh(&protocol_list_lock); |
| 93 | kfree(protocol); | 93 | kfree(protocol); |
| 94 | return; | 94 | return; |
| 95 | } | 95 | } |
| @@ -98,14 +98,14 @@ void ax25_protocol_release(unsigned int pid) | |||
| 98 | if (protocol->next->pid == pid) { | 98 | if (protocol->next->pid == pid) { |
| 99 | s = protocol->next; | 99 | s = protocol->next; |
| 100 | protocol->next = protocol->next->next; | 100 | protocol->next = protocol->next->next; |
| 101 | write_unlock(&protocol_list_lock); | 101 | write_unlock_bh(&protocol_list_lock); |
| 102 | kfree(s); | 102 | kfree(s); |
| 103 | return; | 103 | return; |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | protocol = protocol->next; | 106 | protocol = protocol->next; |
| 107 | } | 107 | } |
| 108 | write_unlock(&protocol_list_lock); | 108 | write_unlock_bh(&protocol_list_lock); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | EXPORT_SYMBOL(ax25_protocol_release); | 111 | EXPORT_SYMBOL(ax25_protocol_release); |
| @@ -266,13 +266,13 @@ int ax25_protocol_is_registered(unsigned int pid) | |||
| 266 | struct protocol_struct *protocol; | 266 | struct protocol_struct *protocol; |
| 267 | int res = 0; | 267 | int res = 0; |
| 268 | 268 | ||
| 269 | read_lock(&protocol_list_lock); | 269 | read_lock_bh(&protocol_list_lock); |
| 270 | for (protocol = protocol_list; protocol != NULL; protocol = protocol->next) | 270 | for (protocol = protocol_list; protocol != NULL; protocol = protocol->next) |
| 271 | if (protocol->pid == pid) { | 271 | if (protocol->pid == pid) { |
| 272 | res = 1; | 272 | res = 1; |
| 273 | break; | 273 | break; |
| 274 | } | 274 | } |
| 275 | read_unlock(&protocol_list_lock); | 275 | read_unlock_bh(&protocol_list_lock); |
| 276 | 276 | ||
| 277 | return res; | 277 | return res; |
| 278 | } | 278 | } |
