diff options
author | Jeremy Kerr <jk@codeconstruct.com.au> | 2021-10-29 11:01:43 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-10-29 13:23:50 +0100 |
commit | 212c10c3c658b191c18ecdf80efb742f9bce5205 (patch) | |
tree | 33783b621162f612c48e14a97efbdc5cd92d4615 /net/mctp/route.c | |
parent | e311eb9192497a20199c68181d58cb61871f1f86 (diff) |
mctp: Return new key from mctp_alloc_local_tag
In a future change, we will want the key available for future use after
allocating a new tag. This change returns the key from
mctp_alloc_local_tag, rather than just key->tag.
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mctp/route.c')
-rw-r--r-- | net/mctp/route.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/net/mctp/route.c b/net/mctp/route.c index c23ab3547ee5..82cc10a2fb0c 100644 --- a/net/mctp/route.c +++ b/net/mctp/route.c @@ -532,14 +532,14 @@ static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key, /* Allocate a locally-owned tag value for (saddr, daddr), and reserve * it for the socket msk */ -static int mctp_alloc_local_tag(struct mctp_sock *msk, - mctp_eid_t saddr, mctp_eid_t daddr, u8 *tagp) +static struct mctp_sk_key *mctp_alloc_local_tag(struct mctp_sock *msk, + mctp_eid_t saddr, + mctp_eid_t daddr, u8 *tagp) { struct net *net = sock_net(&msk->sk); struct netns_mctp *mns = &net->mctp; struct mctp_sk_key *key, *tmp; unsigned long flags; - int rc = -EAGAIN; u8 tagbits; /* for NULL destination EIDs, we may get a response from any peer */ @@ -549,7 +549,7 @@ static int mctp_alloc_local_tag(struct mctp_sock *msk, /* be optimistic, alloc now */ key = mctp_key_alloc(msk, saddr, daddr, 0, GFP_KERNEL); if (!key) - return -ENOMEM; + return ERR_PTR(-ENOMEM); /* 8 possible tag values */ tagbits = 0xff; @@ -591,18 +591,16 @@ static int mctp_alloc_local_tag(struct mctp_sock *msk, trace_mctp_key_acquire(key); *tagp = key->tag; - /* done with the key in this scope */ - mctp_key_unref(key); - key = NULL; - rc = 0; } spin_unlock_irqrestore(&mns->keys_lock, flags); - if (!tagbits) + if (!tagbits) { kfree(key); + return ERR_PTR(-EBUSY); + } - return rc; + return key; } /* routing lookups */ @@ -740,6 +738,7 @@ int mctp_local_output(struct sock *sk, struct mctp_route *rt, struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk); struct mctp_skb_cb *cb = mctp_cb(skb); struct mctp_route tmp_rt; + struct mctp_sk_key *key; struct net_device *dev; struct mctp_hdr *hdr; unsigned long flags; @@ -799,11 +798,16 @@ int mctp_local_output(struct sock *sk, struct mctp_route *rt, goto out_release; if (req_tag & MCTP_HDR_FLAG_TO) { - rc = mctp_alloc_local_tag(msk, saddr, daddr, &tag); - if (rc) + key = mctp_alloc_local_tag(msk, saddr, daddr, &tag); + if (IS_ERR(key)) { + rc = PTR_ERR(key); goto out_release; + } + /* done with the key in this scope */ + mctp_key_unref(key); tag |= MCTP_HDR_FLAG_TO; } else { + key = NULL; tag = req_tag; } |