sctp: Fix a race between ICMP protocol unreachable and connect()
[safe/jmp/linux-2.6] / net / bluetooth / af_bluetooth.c
index 8cfb5a8..404a850 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
-#include <linux/slab.h>
 #include <linux/skbuff.h>
 #include <linux/init.h>
 #include <linux/poll.h>
@@ -45,7 +44,7 @@
 
 /* Bluetooth sockets */
 #define BT_MAX_PROTO   8
-static struct net_proto_family *bt_proto[BT_MAX_PROTO];
+static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
 static DEFINE_RWLOCK(bt_proto_lock);
 
 static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
@@ -86,7 +85,7 @@ static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
                                bt_key_strings[proto], &bt_lock_key[proto]);
 }
 
-int bt_sock_register(int proto, struct net_proto_family *ops)
+int bt_sock_register(int proto, const struct net_proto_family *ops)
 {
        int err = 0;
 
@@ -126,7 +125,8 @@ int bt_sock_unregister(int proto)
 }
 EXPORT_SYMBOL(bt_sock_unregister);
 
-static int bt_sock_create(struct net *net, struct socket *sock, int proto)
+static int bt_sock_create(struct net *net, struct socket *sock, int proto,
+                         int kern)
 {
        int err;
 
@@ -144,7 +144,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto)
        read_lock(&bt_proto_lock);
 
        if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
-               err = bt_proto[proto]->create(net, sock, proto);
+               err = bt_proto[proto]->create(net, sock, proto, kern);
                bt_sock_reclassify_lock(sock, proto);
                module_put(bt_proto[proto]->owner);
        }
@@ -257,7 +257,7 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
        skb_reset_transport_header(skb);
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        if (err == 0)
-               sock_recv_timestamp(msg, sk, skb);
+               sock_recv_ts_and_drops(msg, sk, skb);
 
        skb_free_datagram(sk, skb);