Skip to content

Commit

Permalink
Merge branch 'nfc-llcp-cleanups'
Browse files Browse the repository at this point in the history
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: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Mar 3, 2022
2 parents ca0a53d + 44cd576 commit ef132dc
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 34 deletions.
1 change: 0 additions & 1 deletion net/nfc/llcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
enum llcp_state {
LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
LLCP_CONNECTING,
LLCP_DISCONNECTING,
LLCP_CLOSED,
LLCP_BOUND,
LLCP_LISTEN,
Expand Down
9 changes: 1 addition & 8 deletions net/nfc/llcp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
pr_debug("WKS %d\n", ssap);

/* 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);

return LLCP_SAP_MAX;
Expand Down Expand Up @@ -737,13 +737,6 @@ static void nfc_llcp_tx_work(struct work_struct *work)
print_hex_dump_debug("LLCP Tx: ", DUMP_PREFIX_OFFSET,
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)
copy_skb = skb_copy(skb, GFP_ATOMIC);

Expand Down
49 changes: 24 additions & 25 deletions net/nfc/llcp_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,21 +108,13 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
llcp_sock->service_name_len,
GFP_KERNEL);
if (!llcp_sock->service_name) {
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
llcp_sock->dev = NULL;
ret = -ENOMEM;
goto put_dev;
goto sock_llcp_put_local;
}
llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
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;
goto put_dev;
goto free_service_name;
}

llcp_sock->reserved_ssap = llcp_sock->ssap;
Expand All @@ -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);

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:
nfc_put_device(dev);
Expand Down Expand Up @@ -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)
nfc_llcp_sock_unlink(&local->raw_sockets, sk);
else
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:
sock_orphan(sk);
sock_put(sk);
Expand Down Expand Up @@ -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->ssap = nfc_llcp_get_local_ssap(local);
if (llcp_sock->ssap == LLCP_SAP_MAX) {
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
ret = -ENOMEM;
goto put_dev;
goto sock_llcp_put_local;
}

llcp_sock->reserved_ssap = llcp_sock->ssap;
Expand Down Expand Up @@ -760,8 +756,11 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,

sock_llcp_release:
nfc_llcp_put_ssap(local, llcp_sock->ssap);

sock_llcp_put_local:
nfc_llcp_local_put(llcp_sock->local);
llcp_sock->local = NULL;
llcp_sock->dev = NULL;

put_dev:
nfc_put_device(dev);
Expand Down

0 comments on commit ef132dc

Please sign in to comment.