Bluetooth: Improve *_get() functions to return the object type
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 15 Aug 2014 18:06:57 +0000 (21:06 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 8 Sep 2014 17:07:52 +0000 (19:07 +0200)
It's natural to have *_get() functions that increment the reference
count of an object to return the object type itself. This way it's
simple to make a copy of the object pointer and increase the reference
count in a single step. This patch updates two such get() functions,
namely hci_conn_get() and l2cap_conn_get(), and updates the users to
take advantage of the new API.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
include/net/bluetooth/l2cap.h
net/bluetooth/hidp/core.c
net/bluetooth/l2cap_core.c

index b0ded1333865309ecd9e771bf33ee872c3abd56e..aa75eee8ad7fbe26f1b79a1a80de73e9b0e69553 100644 (file)
@@ -756,9 +756,10 @@ void hci_le_conn_failed(struct hci_conn *conn, u8 status);
  * _get()/_drop() in it, but require the caller to have a valid ref (FIXME).
  */
 
-static inline void hci_conn_get(struct hci_conn *conn)
+static inline struct hci_conn *hci_conn_get(struct hci_conn *conn)
 {
        get_device(&conn->dev);
+       return conn;
 }
 
 static inline void hci_conn_put(struct hci_conn *conn)
index 1558eccb19db769e204d3e6e716ca4e1ba201f7d..8f1652ed332652cc220e94a5543f09e9e4676d1b 100644 (file)
@@ -948,7 +948,7 @@ void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
 void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
 
 void l2cap_conn_shutdown(struct l2cap_conn *conn, int err);
-void l2cap_conn_get(struct l2cap_conn *conn);
+struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn);
 void l2cap_conn_put(struct l2cap_conn *conn);
 
 int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user);
index 6c7ecf116e74ba5e4b3a88ab7c71a5f632563577..1b7d605706aa5720b45e056d3a75f235c9c4ab60 100644 (file)
@@ -915,7 +915,7 @@ static int hidp_session_new(struct hidp_session **out, const bdaddr_t *bdaddr,
 
        /* connection management */
        bacpy(&session->bdaddr, bdaddr);
-       session->conn = conn;
+       session->conn = l2cap_conn_get(conn);
        session->user.probe = hidp_session_probe;
        session->user.remove = hidp_session_remove;
        session->ctrl_sock = ctrl_sock;
@@ -941,13 +941,13 @@ static int hidp_session_new(struct hidp_session **out, const bdaddr_t *bdaddr,
        if (ret)
                goto err_free;
 
-       l2cap_conn_get(session->conn);
        get_file(session->intr_sock->file);
        get_file(session->ctrl_sock->file);
        *out = session;
        return 0;
 
 err_free:
+       l2cap_conn_put(session->conn);
        kfree(session);
        return ret;
 }
@@ -1327,10 +1327,8 @@ int hidp_connection_add(struct hidp_connadd_req *req,
 
        conn = NULL;
        l2cap_chan_lock(chan);
-       if (chan->conn) {
-               l2cap_conn_get(chan->conn);
-               conn = chan->conn;
-       }
+       if (chan->conn)
+               conn = l2cap_conn_get(chan->conn);
        l2cap_chan_unlock(chan);
 
        if (!conn)
index a6559225bb500025509f5fd1d557b72ac0cefdf0..cb36169ef300fed5fff434976581f107156ee807 100644 (file)
@@ -1695,9 +1695,10 @@ static void l2cap_conn_free(struct kref *ref)
        kfree(conn);
 }
 
-void l2cap_conn_get(struct l2cap_conn *conn)
+struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn)
 {
        kref_get(&conn->ref);
+       return conn;
 }
 EXPORT_SYMBOL(l2cap_conn_get);
 
@@ -6908,8 +6909,7 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
 
        kref_init(&conn->ref);
        hcon->l2cap_data = conn;
-       conn->hcon = hcon;
-       hci_conn_get(conn->hcon);
+       conn->hcon = hci_conn_get(hcon);
        conn->hchan = hchan;
 
        BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);