summary refs log tree commit diff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-10-11 12:30:34 -0700
committerDavid S. Miller <davem@davemloft.net>2010-10-11 12:30:34 -0700
commitd122179a3c0fdc71b88cb9e3605f372b1651a9ff (patch)
tree63a48b333e7565967b6d7c9e246557bfcb9f225f /include
parent419c20465d6319274e7286f0966e2390540e6e0a (diff)
parentb00916b189d13a615ff05c9242201135992fcda3 (diff)
downloadlinux-d122179a3c0fdc71b88cb9e3605f372b1651a9ff.tar.gz
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	net/core/ethtool.c
Diffstat (limited to 'include')
-rw-r--r--include/net/bluetooth/bluetooth.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 27a902d9b3a9..30fce0128dd7 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/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);