diff options
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r-- | net/sunrpc/xprtsock.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index e193c2b5476b..0030376327b7 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -527,6 +527,10 @@ static int xs_local_send_request(struct rpc_task *task) | |||
527 | true, &sent); | 527 | true, &sent); |
528 | dprintk("RPC: %s(%u) = %d\n", | 528 | dprintk("RPC: %s(%u) = %d\n", |
529 | __func__, xdr->len - req->rq_bytes_sent, status); | 529 | __func__, xdr->len - req->rq_bytes_sent, status); |
530 | |||
531 | if (status == -EAGAIN && sock_writeable(transport->inet)) | ||
532 | status = -ENOBUFS; | ||
533 | |||
530 | if (likely(sent > 0) || status == 0) { | 534 | if (likely(sent > 0) || status == 0) { |
531 | req->rq_bytes_sent += sent; | 535 | req->rq_bytes_sent += sent; |
532 | req->rq_xmit_bytes_sent += sent; | 536 | req->rq_xmit_bytes_sent += sent; |
@@ -539,6 +543,7 @@ static int xs_local_send_request(struct rpc_task *task) | |||
539 | 543 | ||
540 | switch (status) { | 544 | switch (status) { |
541 | case -ENOBUFS: | 545 | case -ENOBUFS: |
546 | break; | ||
542 | case -EAGAIN: | 547 | case -EAGAIN: |
543 | status = xs_nospace(task); | 548 | status = xs_nospace(task); |
544 | break; | 549 | break; |
@@ -589,6 +594,9 @@ static int xs_udp_send_request(struct rpc_task *task) | |||
589 | if (status == -EPERM) | 594 | if (status == -EPERM) |
590 | goto process_status; | 595 | goto process_status; |
591 | 596 | ||
597 | if (status == -EAGAIN && sock_writeable(transport->inet)) | ||
598 | status = -ENOBUFS; | ||
599 | |||
592 | if (sent > 0 || status == 0) { | 600 | if (sent > 0 || status == 0) { |
593 | req->rq_xmit_bytes_sent += sent; | 601 | req->rq_xmit_bytes_sent += sent; |
594 | if (sent >= req->rq_slen) | 602 | if (sent >= req->rq_slen) |
@@ -669,9 +677,6 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
669 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", | 677 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", |
670 | xdr->len - req->rq_bytes_sent, status); | 678 | xdr->len - req->rq_bytes_sent, status); |
671 | 679 | ||
672 | if (unlikely(sent == 0 && status < 0)) | ||
673 | break; | ||
674 | |||
675 | /* If we've sent the entire packet, immediately | 680 | /* If we've sent the entire packet, immediately |
676 | * reset the count of bytes sent. */ | 681 | * reset the count of bytes sent. */ |
677 | req->rq_bytes_sent += sent; | 682 | req->rq_bytes_sent += sent; |
@@ -681,18 +686,21 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
681 | return 0; | 686 | return 0; |
682 | } | 687 | } |
683 | 688 | ||
684 | if (sent != 0) | 689 | if (status < 0) |
685 | continue; | 690 | break; |
686 | status = -EAGAIN; | 691 | if (sent == 0) { |
687 | break; | 692 | status = -EAGAIN; |
693 | break; | ||
694 | } | ||
688 | } | 695 | } |
696 | if (status == -EAGAIN && sk_stream_is_writeable(transport->inet)) | ||
697 | status = -ENOBUFS; | ||
689 | 698 | ||
690 | switch (status) { | 699 | switch (status) { |
691 | case -ENOTSOCK: | 700 | case -ENOTSOCK: |
692 | status = -ENOTCONN; | 701 | status = -ENOTCONN; |
693 | /* Should we call xs_close() here? */ | 702 | /* Should we call xs_close() here? */ |
694 | break; | 703 | break; |
695 | case -ENOBUFS: | ||
696 | case -EAGAIN: | 704 | case -EAGAIN: |
697 | status = xs_nospace(task); | 705 | status = xs_nospace(task); |
698 | break; | 706 | break; |
@@ -703,6 +711,7 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
703 | case -ECONNREFUSED: | 711 | case -ECONNREFUSED: |
704 | case -ENOTCONN: | 712 | case -ENOTCONN: |
705 | case -EADDRINUSE: | 713 | case -EADDRINUSE: |
714 | case -ENOBUFS: | ||
706 | case -EPIPE: | 715 | case -EPIPE: |
707 | clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); | 716 | clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); |
708 | } | 717 | } |