Index: chromeos/compat-wireless/include/net/bluetooth/bluetooth.h |
diff --git a/chromeos/compat-wireless/include/net/bluetooth/bluetooth.h b/chromeos/compat-wireless/include/net/bluetooth/bluetooth.h |
index 27a902d9b3a9a431c6b3162a4c6fe479aa99504c..30fce0128dd72fa0281795bc0ae03809b85bc9d0 100644 |
--- a/chromeos/compat-wireless/include/net/bluetooth/bluetooth.h |
+++ b/chromeos/compat-wireless/include/net/bluetooth/bluetooth.h |
@@ -161,12 +161,30 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk, unsigned long l |
{ |
struct sk_buff *skb; |
+ release_sock(sk); |
if ((skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err))) { |
skb_reserve(skb, BT_SKB_RESERVE); |
bt_cb(skb)->incoming = 0; |
} |
+ lock_sock(sk); |
+ |
+ if (!skb && *err) |
+ return NULL; |
+ |
+ *err = sock_error(sk); |
+ if (*err) |
+ goto out; |
+ |
+ if (sk->sk_shutdown) { |
+ *err = -ECONNRESET; |
+ goto out; |
+ } |
return skb; |
+ |
+out: |
+ kfree_skb(skb); |
+ return NULL; |
} |
int bt_err(__u16 code); |