diff options
author | Rémi Denis-Courmont <remi.denis-courmont@nokia.com> | 2010-08-30 12:57:03 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-31 13:04:32 -0700 |
commit | 1a98214feef2221cd7c24b17cd688a5a9d85b2ea (patch) | |
tree | c642a58c833554d57f4f38ae0d346ddb5c2f051d /net/phonet/pep.c | |
parent | 1f0f63885658889b3bcb8a08fbcb9532f8e536c9 (diff) | |
download | linux-1a98214feef2221cd7c24b17cd688a5a9d85b2ea.tar.gz linux-1a98214feef2221cd7c24b17cd688a5a9d85b2ea.tar.bz2 linux-1a98214feef2221cd7c24b17cd688a5a9d85b2ea.zip |
Phonet: restore flow control credits when sending fails
Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/phonet/pep.c')
-rw-r--r-- | net/phonet/pep.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index b2a3ae6cad78..5034f0f62bdb 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c @@ -834,6 +834,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) { struct pep_sock *pn = pep_sk(sk); struct pnpipehdr *ph; + int err; if (pn_flow_safe(pn->tx_fc) && !atomic_add_unless(&pn->tx_credits, -1, 0)) { @@ -852,7 +853,10 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) ph->message_id = PNS_PIPE_DATA; ph->pipe_handle = pn->pipe_handle; - return pn_skb_send(sk, skb, &pipe_srv); + err = pn_skb_send(sk, skb, &pipe_srv); + if (err && pn_flow_safe(pn->tx_fc)) + atomic_inc(&pn->tx_credits); + return err; } static int pep_sendmsg(struct kiocb *iocb, struct sock *sk, |