diff options
Diffstat (limited to 'net/bluetooth/sco.c')
-rw-r--r-- | net/bluetooth/sco.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 531a93d613d4..b5178d62064e 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -352,7 +352,7 @@ static void __sco_sock_close(struct sock *sk) | |||
352 | 352 | ||
353 | case BT_CONNECTED: | 353 | case BT_CONNECTED: |
354 | case BT_CONFIG: | 354 | case BT_CONFIG: |
355 | if (sco_pi(sk)->conn) { | 355 | if (sco_pi(sk)->conn->hcon) { |
356 | sk->sk_state = BT_DISCONN; | 356 | sk->sk_state = BT_DISCONN; |
357 | sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); | 357 | sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); |
358 | hci_conn_put(sco_pi(sk)->conn->hcon); | 358 | hci_conn_put(sco_pi(sk)->conn->hcon); |
@@ -900,8 +900,6 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
900 | 900 | ||
901 | BT_DBG("conn %p", conn); | 901 | BT_DBG("conn %p", conn); |
902 | 902 | ||
903 | sco_conn_lock(conn); | ||
904 | |||
905 | if (sk) { | 903 | if (sk) { |
906 | sco_sock_clear_timer(sk); | 904 | sco_sock_clear_timer(sk); |
907 | bh_lock_sock(sk); | 905 | bh_lock_sock(sk); |
@@ -909,9 +907,13 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
909 | sk->sk_state_change(sk); | 907 | sk->sk_state_change(sk); |
910 | bh_unlock_sock(sk); | 908 | bh_unlock_sock(sk); |
911 | } else { | 909 | } else { |
910 | sco_conn_lock(conn); | ||
911 | |||
912 | parent = sco_get_sock_listen(conn->src); | 912 | parent = sco_get_sock_listen(conn->src); |
913 | if (!parent) | 913 | if (!parent) { |
914 | goto done; | 914 | sco_conn_unlock(conn); |
915 | return; | ||
916 | } | ||
915 | 917 | ||
916 | bh_lock_sock(parent); | 918 | bh_lock_sock(parent); |
917 | 919 | ||
@@ -919,7 +921,8 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
919 | BTPROTO_SCO, GFP_ATOMIC); | 921 | BTPROTO_SCO, GFP_ATOMIC); |
920 | if (!sk) { | 922 | if (!sk) { |
921 | bh_unlock_sock(parent); | 923 | bh_unlock_sock(parent); |
922 | goto done; | 924 | sco_conn_unlock(conn); |
925 | return; | ||
923 | } | 926 | } |
924 | 927 | ||
925 | sco_sock_init(sk, parent); | 928 | sco_sock_init(sk, parent); |
@@ -939,10 +942,9 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
939 | parent->sk_data_ready(parent, 1); | 942 | parent->sk_data_ready(parent, 1); |
940 | 943 | ||
941 | bh_unlock_sock(parent); | 944 | bh_unlock_sock(parent); |
942 | } | ||
943 | 945 | ||
944 | done: | 946 | sco_conn_unlock(conn); |
945 | sco_conn_unlock(conn); | 947 | } |
946 | } | 948 | } |
947 | 949 | ||
948 | /* ----- SCO interface with lower layer (HCI) ----- */ | 950 | /* ----- SCO interface with lower layer (HCI) ----- */ |