Commit ef132dc4 authored by David S. Miller's avatar David S. Miller

Merge branch 'nfc-llcp-cleanups'

Krzysztof Kozlowski says:

====================
nfc: llcp: few cleanups/improvements

These are improvements, not fixing any experienced issue, just looking correct
to me from the code point of view.

Changes since v1
================
1. Split from the fix.

Testing
=======
Under QEMU only. The NFC/LLCP code was not really tested on a device.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ca0a53dc 44cd5765
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
enum llcp_state { enum llcp_state {
LLCP_CONNECTED = 1, /* wait_for_packet() wants that */ LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
LLCP_CONNECTING, LLCP_CONNECTING,
LLCP_DISCONNECTING,
LLCP_CLOSED, LLCP_CLOSED,
LLCP_BOUND, LLCP_BOUND,
LLCP_LISTEN, LLCP_LISTEN,
......
...@@ -383,7 +383,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local, ...@@ -383,7 +383,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
pr_debug("WKS %d\n", ssap); pr_debug("WKS %d\n", ssap);
/* This is a WKS, let's check if it's free */ /* This is a WKS, let's check if it's free */
if (local->local_wks & BIT(ssap)) { if (test_bit(ssap, &local->local_wks)) {
mutex_unlock(&local->sdp_lock); mutex_unlock(&local->sdp_lock);
return LLCP_SAP_MAX; return LLCP_SAP_MAX;
...@@ -737,13 +737,6 @@ static void nfc_llcp_tx_work(struct work_struct *work) ...@@ -737,13 +737,6 @@ static void nfc_llcp_tx_work(struct work_struct *work)
print_hex_dump_debug("LLCP Tx: ", DUMP_PREFIX_OFFSET, print_hex_dump_debug("LLCP Tx: ", DUMP_PREFIX_OFFSET,
16, 1, skb->data, skb->len, true); 16, 1, skb->data, skb->len, true);
if (ptype == LLCP_PDU_DISC && sk != NULL &&
sk->sk_state == LLCP_DISCONNECTING) {
nfc_llcp_sock_unlink(&local->sockets, sk);
sock_orphan(sk);
sock_put(sk);
}
if (ptype == LLCP_PDU_I) if (ptype == LLCP_PDU_I)
copy_skb = skb_copy(skb, GFP_ATOMIC); copy_skb = skb_copy(skb, GFP_ATOMIC);
......
...@@ -108,21 +108,13 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) ...@@ -108,21 +108,13 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
llcp_sock->service_name_len, llcp_sock->service_name_len,
GFP_KERNEL); GFP_KERNEL);
if (!llcp_sock->service_name) { if (!llcp_sock->service_name) {
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
llcp_sock->dev = NULL;
ret = -ENOMEM; ret = -ENOMEM;
goto put_dev; goto sock_llcp_put_local;
} }
llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock); llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
if (llcp_sock->ssap == LLCP_SAP_MAX) { if (llcp_sock->ssap == LLCP_SAP_MAX) {
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
kfree(llcp_sock->service_name);
llcp_sock->service_name = NULL;
llcp_sock->dev = NULL;
ret = -EADDRINUSE; ret = -EADDRINUSE;
goto put_dev; goto free_service_name;
} }
llcp_sock->reserved_ssap = llcp_sock->ssap; llcp_sock->reserved_ssap = llcp_sock->ssap;
...@@ -132,6 +124,19 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) ...@@ -132,6 +124,19 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
pr_debug("Socket bound to SAP %d\n", llcp_sock->ssap); pr_debug("Socket bound to SAP %d\n", llcp_sock->ssap);
sk->sk_state = LLCP_BOUND; sk->sk_state = LLCP_BOUND;
nfc_put_device(dev);
release_sock(sk);
return 0;
free_service_name:
kfree(llcp_sock->service_name);
llcp_sock->service_name = NULL;
sock_llcp_put_local:
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
llcp_sock->dev = NULL;
put_dev: put_dev:
nfc_put_device(dev); nfc_put_device(dev);
...@@ -626,23 +631,16 @@ static int llcp_sock_release(struct socket *sock) ...@@ -626,23 +631,16 @@ static int llcp_sock_release(struct socket *sock)
} }
} }
if (llcp_sock->reserved_ssap < LLCP_SAP_MAX)
nfc_llcp_put_ssap(llcp_sock->local, llcp_sock->ssap);
release_sock(sk);
/* Keep this sock alive and therefore do not remove it from the sockets
* list until the DISC PDU has been actually sent. Otherwise we would
* reply with DM PDUs before sending the DISC one.
*/
if (sk->sk_state == LLCP_DISCONNECTING)
return err;
if (sock->type == SOCK_RAW) if (sock->type == SOCK_RAW)
nfc_llcp_sock_unlink(&local->raw_sockets, sk); nfc_llcp_sock_unlink(&local->raw_sockets, sk);
else else
nfc_llcp_sock_unlink(&local->sockets, sk); nfc_llcp_sock_unlink(&local->sockets, sk);
if (llcp_sock->reserved_ssap < LLCP_SAP_MAX)
nfc_llcp_put_ssap(llcp_sock->local, llcp_sock->ssap);
release_sock(sk);
out: out:
sock_orphan(sk); sock_orphan(sk);
sock_put(sk); sock_put(sk);
...@@ -712,10 +710,8 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr, ...@@ -712,10 +710,8 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
llcp_sock->local = nfc_llcp_local_get(local); llcp_sock->local = nfc_llcp_local_get(local);
llcp_sock->ssap = nfc_llcp_get_local_ssap(local); llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
if (llcp_sock->ssap == LLCP_SAP_MAX) { if (llcp_sock->ssap == LLCP_SAP_MAX) {
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
ret = -ENOMEM; ret = -ENOMEM;
goto put_dev; goto sock_llcp_put_local;
} }
llcp_sock->reserved_ssap = llcp_sock->ssap; llcp_sock->reserved_ssap = llcp_sock->ssap;
...@@ -760,8 +756,11 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr, ...@@ -760,8 +756,11 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
sock_llcp_release: sock_llcp_release:
nfc_llcp_put_ssap(local, llcp_sock->ssap); nfc_llcp_put_ssap(local, llcp_sock->ssap);
sock_llcp_put_local:
nfc_llcp_local_put(llcp_sock->local); nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL; llcp_sock->local = NULL;
llcp_sock->dev = NULL;
put_dev: put_dev:
nfc_put_device(dev); nfc_put_device(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment