Bluetooth: rename hci_conn_put to hci_conn_drop
authorDavid Herrmann <dh.herrmann@gmail.com>
Sat, 6 Apr 2013 18:28:37 +0000 (20:28 +0200)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Thu, 11 Apr 2013 19:34:15 +0000 (16:34 -0300)
We use _get() and _put() for device ref-counting in the kernel. However,
hci_conn_put() is _not_ used for ref-counting, hence, rename it to
hci_conn_drop() so we can later fix ref-counting and introduce
hci_conn_put().

hci_conn_hold() and hci_conn_put() are currently used to manage how long a
connection should be held alive. When the last user drops the connection,
we spawn a delayed work that performs the disconnect. Obviously, this has
nothing to do with ref-counting for the _object_ but rather for the
keep-alive of the connection.

But we really _need_ proper ref-counting for the _object_ to allow
connection-users like rfcomm-tty, HIDP or others.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c
net/bluetooth/l2cap_core.c
net/bluetooth/mgmt.c
net/bluetooth/sco.c
net/bluetooth/smp.c

index d4e13bf5ae59656ca6f86d2e00979f11ebb05239..78ea9c7c202c8f9738cc50d2d726c067b6f933fe 100644 (file)
@@ -612,7 +612,7 @@ static inline void hci_conn_hold(struct hci_conn *conn)
        cancel_delayed_work(&conn->disc_work);
 }
 
-static inline void hci_conn_put(struct hci_conn *conn)
+static inline void hci_conn_drop(struct hci_conn *conn)
 {
        BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
 
index b9f90169940be5b32200c25598aaafabd83a184f..30d7dfc23002c3a6c8a574cfb2a9ea5badc2b443 100644 (file)
@@ -433,7 +433,7 @@ int hci_conn_del(struct hci_conn *conn)
                struct hci_conn *acl = conn->link;
                if (acl) {
                        acl->link = NULL;
-                       hci_conn_put(acl);
+                       hci_conn_drop(acl);
                }
        }
 
@@ -565,7 +565,7 @@ static struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type,
        if (!sco) {
                sco = hci_conn_add(hdev, type, dst);
                if (!sco) {
-                       hci_conn_put(acl);
+                       hci_conn_drop(acl);
                        return ERR_PTR(-ENOMEM);
                }
        }
@@ -980,7 +980,7 @@ void hci_chan_del(struct hci_chan *chan)
 
        synchronize_rcu();
 
-       hci_conn_put(conn);
+       hci_conn_drop(conn);
 
        skb_queue_purge(&chan->data_q);
        kfree(chan);
index 0a2b128d2cc9a9629d81623e5f51c25bcf2b24c2..2cf28b198b31f5a83c41c3f46b4c7dd35da91801 100644 (file)
@@ -1190,7 +1190,7 @@ static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
        if (conn) {
                if (conn->state == BT_CONFIG) {
                        hci_proto_connect_cfm(conn, status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        }
 
@@ -1217,7 +1217,7 @@ static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
        if (conn) {
                if (conn->state == BT_CONFIG) {
                        hci_proto_connect_cfm(conn, status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        }
 
@@ -1379,7 +1379,7 @@ static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
        if (conn) {
                if (conn->state == BT_CONFIG) {
                        hci_proto_connect_cfm(conn, status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        }
 
@@ -1406,7 +1406,7 @@ static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
        if (conn) {
                if (conn->state == BT_CONFIG) {
                        hci_proto_connect_cfm(conn, status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        }
 
@@ -1860,7 +1860,7 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
                } else {
                        conn->state = BT_CONNECT2;
                        hci_proto_connect_cfm(conn, 0);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        } else {
                /* Connection rejected */
@@ -1967,14 +1967,14 @@ static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
                } else {
                        conn->state = BT_CONNECTED;
                        hci_proto_connect_cfm(conn, ev->status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                }
        } else {
                hci_auth_cfm(conn, ev->status);
 
                hci_conn_hold(conn);
                conn->disc_timeout = HCI_DISCONN_TIMEOUT;
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
        if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
@@ -2058,7 +2058,7 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
 
                if (ev->status && conn->state == BT_CONNECTED) {
                        hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                        goto unlock;
                }
 
@@ -2067,7 +2067,7 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
                                conn->state = BT_CONNECTED;
 
                        hci_proto_connect_cfm(conn, ev->status);
-                       hci_conn_put(conn);
+                       hci_conn_drop(conn);
                } else
                        hci_encrypt_cfm(conn, ev->status, ev->encrypt);
        }
@@ -2142,7 +2142,7 @@ static void hci_remote_features_evt(struct hci_dev *hdev,
        if (!hci_outgoing_auth_needed(hdev, conn)) {
                conn->state = BT_CONNECTED;
                hci_proto_connect_cfm(conn, ev->status);
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
 unlock:
@@ -2682,7 +2682,7 @@ static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
        if (conn->state == BT_CONNECTED) {
                hci_conn_hold(conn);
                conn->disc_timeout = HCI_PAIRING_TIMEOUT;
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
        if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
@@ -2785,7 +2785,7 @@ static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
                if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
                        conn->key_type = ev->key_type;
 
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
        if (test_bit(HCI_LINK_KEYS, &hdev->dev_flags))
@@ -2954,7 +2954,7 @@ static void hci_remote_ext_features_evt(struct hci_dev *hdev,
        if (!hci_outgoing_auth_needed(hdev, conn)) {
                conn->state = BT_CONNECTED;
                hci_proto_connect_cfm(conn, ev->status);
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
 unlock:
@@ -3087,7 +3087,7 @@ static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
 
        if (ev->status && conn->state == BT_CONNECTED) {
                hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
                goto unlock;
        }
 
@@ -3096,13 +3096,13 @@ static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
                        conn->state = BT_CONNECTED;
 
                hci_proto_connect_cfm(conn, ev->status);
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        } else {
                hci_auth_cfm(conn, ev->status);
 
                hci_conn_hold(conn);
                conn->disc_timeout = HCI_DISCONN_TIMEOUT;
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
        }
 
 unlock:
@@ -3363,7 +3363,7 @@ static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
                mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
                                 ev->status);
 
-       hci_conn_put(conn);
+       hci_conn_drop(conn);
 
 unlock:
        hci_dev_unlock(hdev);
@@ -3451,7 +3451,7 @@ static void hci_phy_link_complete_evt(struct hci_dev *hdev,
 
        hci_conn_hold(hcon);
        hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
-       hci_conn_put(hcon);
+       hci_conn_drop(hcon);
 
        hci_conn_hold_device(hcon);
        hci_conn_add_sysfs(hcon);
index 7c7e9321f1ea4263e0c51e792a14e0454d4a0e12..7cdb93c21b329354917a34ccfaa2728ca4635443 100644 (file)
@@ -571,7 +571,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
                chan->conn = NULL;
 
                if (chan->chan_type != L2CAP_CHAN_CONN_FIX_A2MP)
-                       hci_conn_put(conn->hcon);
+                       hci_conn_drop(conn->hcon);
 
                if (mgr && mgr->bredr_chan == chan)
                        mgr->bredr_chan = NULL;
@@ -1697,7 +1697,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
 
        conn = l2cap_conn_add(hcon, 0);
        if (!conn) {
-               hci_conn_put(hcon);
+               hci_conn_drop(hcon);
                err = -ENOMEM;
                goto done;
        }
@@ -1707,7 +1707,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
 
                if (!list_empty(&conn->chan_l)) {
                        err = -EBUSY;
-                       hci_conn_put(hcon);
+                       hci_conn_drop(hcon);
                }
 
                if (err)
index 03e7e732215f7e11d9cfca1c6b7c93c70dc96090..34ba1647e6e8ac13fd413b1fb246d665ea74ac54 100644 (file)
@@ -2131,7 +2131,7 @@ static void pairing_complete(struct pending_cmd *cmd, u8 status)
        conn->security_cfm_cb = NULL;
        conn->disconn_cfm_cb = NULL;
 
-       hci_conn_put(conn);
+       hci_conn_drop(conn);
 
        mgmt_pending_remove(cmd);
 }
@@ -2222,7 +2222,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
        }
 
        if (conn->connect_cfm_cb) {
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
                err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
                                   MGMT_STATUS_BUSY, &rp, sizeof(rp));
                goto unlock;
@@ -2231,7 +2231,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
        cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
        if (!cmd) {
                err = -ENOMEM;
-               hci_conn_put(conn);
+               hci_conn_drop(conn);
                goto unlock;
        }
 
index d919d1161ab40ef0071891e5a42ef5a7bf3aaa14..9909eec6afe3b289e63b2288079d2b123c08760d 100644 (file)
@@ -185,7 +185,7 @@ static int sco_connect(struct sock *sk)
 
        conn = sco_conn_add(hcon);
        if (!conn) {
-               hci_conn_put(hcon);
+               hci_conn_drop(hcon);
                err = -ENOMEM;
                goto done;
        }
@@ -353,7 +353,7 @@ static void __sco_sock_close(struct sock *sk)
                if (sco_pi(sk)->conn->hcon) {
                        sk->sk_state = BT_DISCONN;
                        sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
-                       hci_conn_put(sco_pi(sk)->conn->hcon);
+                       hci_conn_drop(sco_pi(sk)->conn->hcon);
                        sco_pi(sk)->conn->hcon = NULL;
                } else
                        sco_chan_del(sk, ECONNRESET);
@@ -882,7 +882,7 @@ static void sco_chan_del(struct sock *sk, int err)
                sco_conn_unlock(conn);
 
                if (conn->hcon)
-                       hci_conn_put(conn->hcon);
+                       hci_conn_drop(conn->hcon);
        }
 
        sk->sk_state = BT_CLOSED;
index 5abefb12891d5144f97d1feacb0803937b0c9765..b2296d3857a0f492fca46cd7de02119a194e863f 100644 (file)
@@ -522,7 +522,7 @@ void smp_chan_destroy(struct l2cap_conn *conn)
        kfree(smp);
        conn->smp_chan = NULL;
        conn->hcon->smp_conn = NULL;
-       hci_conn_put(conn->hcon);
+       hci_conn_drop(conn->hcon);
 }
 
 int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)