diff options
| author | David S. Miller <davem@davemloft.net> | 2008-04-03 01:35:23 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-04-03 01:35:23 -0400 |
| commit | e1ec1b8ccdf0df6000faa8c2d985ca5f94157e5a (patch) | |
| tree | 4e1ca325dde22f1ac21c9da0be509e87e922e604 /net/bluetooth | |
| parent | c0f39322c335412339dec16ebfd2a05ceba5ebcf (diff) | |
| parent | 802fb176d8c635ae42da31b80841c26e8c7338a0 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/s2io.c
Diffstat (limited to 'net/bluetooth')
| -rw-r--r-- | net/bluetooth/af_bluetooth.c | 40 | ||||
| -rw-r--r-- | net/bluetooth/hci_sock.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/tty.c | 5 | ||||
| -rw-r--r-- | net/bluetooth/sco.c | 2 |
7 files changed, 45 insertions, 10 deletions
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 1220d8a41eb5..d366423c8392 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
| @@ -53,6 +53,30 @@ | |||
| 53 | /* Bluetooth sockets */ | 53 | /* Bluetooth sockets */ |
| 54 | #define BT_MAX_PROTO 8 | 54 | #define BT_MAX_PROTO 8 |
| 55 | static struct net_proto_family *bt_proto[BT_MAX_PROTO]; | 55 | static struct net_proto_family *bt_proto[BT_MAX_PROTO]; |
| 56 | |||
| 57 | static struct lock_class_key bt_slock_key[BT_MAX_PROTO]; | ||
| 58 | static struct lock_class_key bt_lock_key[BT_MAX_PROTO]; | ||
| 59 | static const char *bt_key_strings[BT_MAX_PROTO] = { | ||
| 60 | "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP", | ||
| 61 | "sk_lock-AF_BLUETOOTH-BTPROTO_HCI", | ||
| 62 | "sk_lock-AF_BLUETOOTH-BTPROTO_SCO", | ||
| 63 | "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM", | ||
| 64 | "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP", | ||
| 65 | "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP", | ||
| 66 | "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP", | ||
| 67 | "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP", | ||
| 68 | }; | ||
| 69 | |||
| 70 | static const char *bt_slock_key_strings[BT_MAX_PROTO] = { | ||
| 71 | "slock-AF_BLUETOOTH-BTPROTO_L2CAP", | ||
| 72 | "slock-AF_BLUETOOTH-BTPROTO_HCI", | ||
| 73 | "slock-AF_BLUETOOTH-BTPROTO_SCO", | ||
| 74 | "slock-AF_BLUETOOTH-BTPROTO_RFCOMM", | ||
| 75 | "slock-AF_BLUETOOTH-BTPROTO_BNEP", | ||
| 76 | "slock-AF_BLUETOOTH-BTPROTO_CMTP", | ||
| 77 | "slock-AF_BLUETOOTH-BTPROTO_HIDP", | ||
| 78 | "slock-AF_BLUETOOTH-BTPROTO_AVDTP", | ||
| 79 | }; | ||
| 56 | static DEFINE_RWLOCK(bt_proto_lock); | 80 | static DEFINE_RWLOCK(bt_proto_lock); |
| 57 | 81 | ||
| 58 | int bt_sock_register(int proto, struct net_proto_family *ops) | 82 | int bt_sock_register(int proto, struct net_proto_family *ops) |
| @@ -95,6 +119,21 @@ int bt_sock_unregister(int proto) | |||
| 95 | } | 119 | } |
| 96 | EXPORT_SYMBOL(bt_sock_unregister); | 120 | EXPORT_SYMBOL(bt_sock_unregister); |
| 97 | 121 | ||
| 122 | static void bt_reclassify_sock_lock(struct socket *sock, int proto) | ||
| 123 | { | ||
| 124 | struct sock *sk = sock->sk; | ||
| 125 | |||
| 126 | if (!sk) | ||
| 127 | return; | ||
| 128 | BUG_ON(sock_owned_by_user(sk)); | ||
| 129 | |||
| 130 | sock_lock_init_class_and_name(sk, | ||
| 131 | bt_slock_key_strings[proto], | ||
| 132 | &bt_slock_key[proto], | ||
| 133 | bt_key_strings[proto], | ||
| 134 | &bt_lock_key[proto]); | ||
| 135 | } | ||
| 136 | |||
| 98 | static int bt_sock_create(struct net *net, struct socket *sock, int proto) | 137 | static int bt_sock_create(struct net *net, struct socket *sock, int proto) |
| 99 | { | 138 | { |
| 100 | int err; | 139 | int err; |
| @@ -117,6 +156,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto) | |||
| 117 | 156 | ||
| 118 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { | 157 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { |
| 119 | err = bt_proto[proto]->create(net, sock, proto); | 158 | err = bt_proto[proto]->create(net, sock, proto); |
| 159 | bt_reclassify_sock_lock(sock, proto); | ||
| 120 | module_put(bt_proto[proto]->owner); | 160 | module_put(bt_proto[proto]->owner); |
| 121 | } | 161 | } |
| 122 | 162 | ||
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index b5d4019d3572..1d36c093523b 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
| @@ -84,7 +84,7 @@ static struct hci_sec_filter hci_sec_filter = { | |||
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | static struct bt_sock_list hci_sk_list = { | 86 | static struct bt_sock_list hci_sk_list = { |
| 87 | .lock = RW_LOCK_UNLOCKED | 87 | .lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock) |
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| 90 | /* Send frame to RAW socket */ | 90 | /* Send frame to RAW socket */ |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 6b995ac832f5..a4849f2c1d81 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -62,7 +62,7 @@ static u32 l2cap_feat_mask = 0x0000; | |||
| 62 | static const struct proto_ops l2cap_sock_ops; | 62 | static const struct proto_ops l2cap_sock_ops; |
| 63 | 63 | ||
| 64 | static struct bt_sock_list l2cap_sk_list = { | 64 | static struct bt_sock_list l2cap_sk_list = { |
| 65 | .lock = RW_LOCK_UNLOCKED | 65 | .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock) |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | static void __l2cap_sock_close(struct sock *sk, int reason); | 68 | static void __l2cap_sock_close(struct sock *sk, int reason); |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 0c2c93735e93..eb62558e9b09 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -423,8 +423,8 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err) | |||
| 423 | 423 | ||
| 424 | rfcomm_dlc_lock(d); | 424 | rfcomm_dlc_lock(d); |
| 425 | d->state = BT_CLOSED; | 425 | d->state = BT_CLOSED; |
| 426 | d->state_change(d, err); | ||
| 427 | rfcomm_dlc_unlock(d); | 426 | rfcomm_dlc_unlock(d); |
| 427 | d->state_change(d, err); | ||
| 428 | 428 | ||
| 429 | skb_queue_purge(&d->tx_queue); | 429 | skb_queue_purge(&d->tx_queue); |
| 430 | rfcomm_dlc_unlink(d); | 430 | rfcomm_dlc_unlink(d); |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index c103fa02893b..5083adcbfae5 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
| @@ -60,7 +60,7 @@ | |||
| 60 | static const struct proto_ops rfcomm_sock_ops; | 60 | static const struct proto_ops rfcomm_sock_ops; |
| 61 | 61 | ||
| 62 | static struct bt_sock_list rfcomm_sk_list = { | 62 | static struct bt_sock_list rfcomm_sk_list = { |
| 63 | .lock = RW_LOCK_UNLOCKED | 63 | .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock) |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | static void rfcomm_sock_close(struct sock *sk); | 66 | static void rfcomm_sock_close(struct sock *sk); |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index e4c779bb8d76..c3f749abb2d0 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
| @@ -570,12 +570,7 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err) | |||
| 570 | return; | 570 | return; |
| 571 | 571 | ||
| 572 | rfcomm_dev_del(dev); | 572 | rfcomm_dev_del(dev); |
| 573 | /* We have to drop DLC lock here, otherwise | ||
| 574 | rfcomm_dev_put() will dead lock if it's | ||
| 575 | the last reference. */ | ||
| 576 | rfcomm_dlc_unlock(dlc); | ||
| 577 | rfcomm_dev_put(dev); | 573 | rfcomm_dev_put(dev); |
| 578 | rfcomm_dlc_lock(dlc); | ||
| 579 | } | 574 | } |
| 580 | } else | 575 | } else |
| 581 | tty_hangup(dev->tty); | 576 | tty_hangup(dev->tty); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 2a5953b4405d..b0d487e2db20 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
| @@ -58,7 +58,7 @@ | |||
| 58 | static const struct proto_ops sco_sock_ops; | 58 | static const struct proto_ops sco_sock_ops; |
| 59 | 59 | ||
| 60 | static struct bt_sock_list sco_sk_list = { | 60 | static struct bt_sock_list sco_sk_list = { |
| 61 | .lock = RW_LOCK_UNLOCKED | 61 | .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock) |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent); | 64 | static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent); |
