ChangeSet 1.2009.16.7, 2005/03/14 21:29:54-08:00, [EMAIL PROTECTED]
[AX25]: Fix ax25_get_socket locking
In an attempt to return a locked socket ax25_get_socket() was calling
lock_sock() with a spinlock held, bad idea. Making matters worse it's
only user is running in bottom half context resulting in a potencial
attempt to sleep in bottom half context, so fix the locking there as
well.
Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
af_ax25.c | 3 +--
ax25_in.c | 4 +++-
2 files changed, 4 insertions(+), 3 deletions(-)
diff -Nru a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
--- a/net/ax25/af_ax25.c 2005-03-15 00:08:39 -08:00
+++ b/net/ax25/af_ax25.c 2005-03-15 00:08:39 -08:00
@@ -180,8 +180,7 @@
!ax25cmp(&s->dest_addr, dest_addr) &&
s->sk->sk_type == type) {
sk = s->sk;
- /* XXX Sleeps with spinlock held, use refcounts
instead. XXX */
- lock_sock(sk);
+ sock_hold(sk);
break;
}
}
diff -Nru a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
--- a/net/ax25/ax25_in.c 2005-03-15 00:08:39 -08:00
+++ b/net/ax25/ax25_in.c 2005-03-15 00:08:39 -08:00
@@ -275,6 +275,7 @@
/* Now find a suitable dgram socket */
sk = ax25_get_socket(&dest, &src, SOCK_DGRAM);
if (sk != NULL) {
+ bh_lock_sock(sk);
if (atomic_read(&sk->sk_rmem_alloc) >=
sk->sk_rcvbuf) {
kfree_skb(skb);
@@ -286,7 +287,8 @@
if (sock_queue_rcv_skb(sk, skb) != 0)
kfree_skb(skb);
}
- release_sock(sk);
+ bh_unlock_sock(sk);
+ sock_put(sk);
} else {
kfree_skb(skb);
}
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html