summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorRémi Denis-Courmont <remi.denis-courmont@nokia.com>2010-08-30 16:57:03 +0400
committerDavid S. Miller <davem@davemloft.net>2010-09-01 00:04:32 +0400
commit1a98214feef2221cd7c24b17cd688a5a9d85b2ea (patch)
treec642a58c833554d57f4f38ae0d346ddb5c2f051d /net
parent1f0f63885658889b3bcb8a08fbcb9532f8e536c9 (diff)
downloadlinux-1a98214feef2221cd7c24b17cd688a5a9d85b2ea.tar.xz
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')
-rw-r--r--net/phonet/pep.c6
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,