diff options
| -rw-r--r-- | include/linux/sunrpc/xprt.h | 5 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 49 |
2 files changed, 29 insertions, 25 deletions
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 0a0ad1ce70e4..3ff8230c7dd9 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -203,11 +203,6 @@ struct rpc_xprt { | |||
| 203 | char * address_strings[RPC_DISPLAY_MAX]; | 203 | char * address_strings[RPC_DISPLAY_MAX]; |
| 204 | }; | 204 | }; |
| 205 | 205 | ||
| 206 | #define XPRT_LAST_FRAG (1 << 0) | ||
| 207 | #define XPRT_COPY_RECM (1 << 1) | ||
| 208 | #define XPRT_COPY_XID (1 << 2) | ||
| 209 | #define XPRT_COPY_DATA (1 << 3) | ||
| 210 | |||
| 211 | #ifdef __KERNEL__ | 206 | #ifdef __KERNEL__ |
| 212 | 207 | ||
| 213 | /* | 208 | /* |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 417bd91ea53e..c737acf61c75 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -147,6 +147,14 @@ struct sock_xprt { | |||
| 147 | tcp_flags; | 147 | tcp_flags; |
| 148 | }; | 148 | }; |
| 149 | 149 | ||
| 150 | /* | ||
| 151 | * TCP receive state flags | ||
| 152 | */ | ||
| 153 | #define TCP_RCV_LAST_FRAG (1UL << 0) | ||
| 154 | #define TCP_RCV_COPY_FRAGHDR (1UL << 1) | ||
| 155 | #define TCP_RCV_COPY_XID (1UL << 2) | ||
| 156 | #define TCP_RCV_COPY_DATA (1UL << 3) | ||
| 157 | |||
| 150 | static void xs_format_peer_addresses(struct rpc_xprt *xprt) | 158 | static void xs_format_peer_addresses(struct rpc_xprt *xprt) |
| 151 | { | 159 | { |
| 152 | struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr; | 160 | struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr; |
| @@ -653,12 +661,12 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, skb_reader_t *desc | |||
| 653 | 661 | ||
| 654 | transport->tcp_reclen = ntohl(transport->tcp_fraghdr); | 662 | transport->tcp_reclen = ntohl(transport->tcp_fraghdr); |
| 655 | if (transport->tcp_reclen & RPC_LAST_STREAM_FRAGMENT) | 663 | if (transport->tcp_reclen & RPC_LAST_STREAM_FRAGMENT) |
| 656 | transport->tcp_flags |= XPRT_LAST_FRAG; | 664 | transport->tcp_flags |= TCP_RCV_LAST_FRAG; |
| 657 | else | 665 | else |
| 658 | transport->tcp_flags &= ~XPRT_LAST_FRAG; | 666 | transport->tcp_flags &= ~TCP_RCV_LAST_FRAG; |
| 659 | transport->tcp_reclen &= RPC_FRAGMENT_SIZE_MASK; | 667 | transport->tcp_reclen &= RPC_FRAGMENT_SIZE_MASK; |
| 660 | 668 | ||
| 661 | transport->tcp_flags &= ~XPRT_COPY_RECM; | 669 | transport->tcp_flags &= ~TCP_RCV_COPY_FRAGHDR; |
| 662 | transport->tcp_offset = 0; | 670 | transport->tcp_offset = 0; |
| 663 | 671 | ||
| 664 | /* Sanity check of the record length */ | 672 | /* Sanity check of the record length */ |
| @@ -674,11 +682,11 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, skb_reader_t *desc | |||
| 674 | static void xs_tcp_check_fraghdr(struct sock_xprt *transport) | 682 | static void xs_tcp_check_fraghdr(struct sock_xprt *transport) |
| 675 | { | 683 | { |
| 676 | if (transport->tcp_offset == transport->tcp_reclen) { | 684 | if (transport->tcp_offset == transport->tcp_reclen) { |
| 677 | transport->tcp_flags |= XPRT_COPY_RECM; | 685 | transport->tcp_flags |= TCP_RCV_COPY_FRAGHDR; |
| 678 | transport->tcp_offset = 0; | 686 | transport->tcp_offset = 0; |
| 679 | if (transport->tcp_flags & XPRT_LAST_FRAG) { | 687 | if (transport->tcp_flags & TCP_RCV_LAST_FRAG) { |
| 680 | transport->tcp_flags &= ~XPRT_COPY_DATA; | 688 | transport->tcp_flags &= ~TCP_RCV_COPY_DATA; |
| 681 | transport->tcp_flags |= XPRT_COPY_XID; | 689 | transport->tcp_flags |= TCP_RCV_COPY_XID; |
| 682 | transport->tcp_copied = 0; | 690 | transport->tcp_copied = 0; |
| 683 | } | 691 | } |
| 684 | } | 692 | } |
| @@ -696,8 +704,8 @@ static inline void xs_tcp_read_xid(struct sock_xprt *transport, skb_reader_t *de | |||
| 696 | transport->tcp_offset += used; | 704 | transport->tcp_offset += used; |
| 697 | if (used != len) | 705 | if (used != len) |
| 698 | return; | 706 | return; |
| 699 | transport->tcp_flags &= ~XPRT_COPY_XID; | 707 | transport->tcp_flags &= ~TCP_RCV_COPY_XID; |
| 700 | transport->tcp_flags |= XPRT_COPY_DATA; | 708 | transport->tcp_flags |= TCP_RCV_COPY_DATA; |
| 701 | transport->tcp_copied = 4; | 709 | transport->tcp_copied = 4; |
| 702 | dprintk("RPC: reading reply for XID %08x\n", | 710 | dprintk("RPC: reading reply for XID %08x\n", |
| 703 | ntohl(transport->tcp_xid)); | 711 | ntohl(transport->tcp_xid)); |
| @@ -716,7 +724,7 @@ static inline void xs_tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc | |||
| 716 | spin_lock(&xprt->transport_lock); | 724 | spin_lock(&xprt->transport_lock); |
| 717 | req = xprt_lookup_rqst(xprt, transport->tcp_xid); | 725 | req = xprt_lookup_rqst(xprt, transport->tcp_xid); |
| 718 | if (!req) { | 726 | if (!req) { |
| 719 | transport->tcp_flags &= ~XPRT_COPY_DATA; | 727 | transport->tcp_flags &= ~TCP_RCV_COPY_DATA; |
| 720 | dprintk("RPC: XID %08x request not found!\n", | 728 | dprintk("RPC: XID %08x request not found!\n", |
| 721 | ntohl(transport->tcp_xid)); | 729 | ntohl(transport->tcp_xid)); |
| 722 | spin_unlock(&xprt->transport_lock); | 730 | spin_unlock(&xprt->transport_lock); |
| @@ -747,13 +755,13 @@ static inline void xs_tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc | |||
| 747 | /* Error when copying to the receive buffer, | 755 | /* Error when copying to the receive buffer, |
| 748 | * usually because we weren't able to allocate | 756 | * usually because we weren't able to allocate |
| 749 | * additional buffer pages. All we can do now | 757 | * additional buffer pages. All we can do now |
| 750 | * is turn off XPRT_COPY_DATA, so the request | 758 | * is turn off TCP_RCV_COPY_DATA, so the request |
| 751 | * will not receive any additional updates, | 759 | * will not receive any additional updates, |
| 752 | * and time out. | 760 | * and time out. |
| 753 | * Any remaining data from this record will | 761 | * Any remaining data from this record will |
| 754 | * be discarded. | 762 | * be discarded. |
| 755 | */ | 763 | */ |
| 756 | transport->tcp_flags &= ~XPRT_COPY_DATA; | 764 | transport->tcp_flags &= ~TCP_RCV_COPY_DATA; |
| 757 | dprintk("RPC: XID %08x truncated request\n", | 765 | dprintk("RPC: XID %08x truncated request\n", |
| 758 | ntohl(transport->tcp_xid)); | 766 | ntohl(transport->tcp_xid)); |
| 759 | dprintk("RPC: xprt = %p, tcp_copied = %lu, tcp_offset = %u, tcp_reclen = %u\n", | 767 | dprintk("RPC: xprt = %p, tcp_copied = %lu, tcp_offset = %u, tcp_reclen = %u\n", |
| @@ -769,14 +777,14 @@ static inline void xs_tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc | |||
| 769 | transport->tcp_reclen); | 777 | transport->tcp_reclen); |
| 770 | 778 | ||
| 771 | if (transport->tcp_copied == req->rq_private_buf.buflen) | 779 | if (transport->tcp_copied == req->rq_private_buf.buflen) |
| 772 | transport->tcp_flags &= ~XPRT_COPY_DATA; | 780 | transport->tcp_flags &= ~TCP_RCV_COPY_DATA; |
| 773 | else if (transport->tcp_offset == transport->tcp_reclen) { | 781 | else if (transport->tcp_offset == transport->tcp_reclen) { |
| 774 | if (transport->tcp_flags & XPRT_LAST_FRAG) | 782 | if (transport->tcp_flags & TCP_RCV_LAST_FRAG) |
| 775 | transport->tcp_flags &= ~XPRT_COPY_DATA; | 783 | transport->tcp_flags &= ~TCP_RCV_COPY_DATA; |
| 776 | } | 784 | } |
| 777 | 785 | ||
| 778 | out: | 786 | out: |
| 779 | if (!(transport->tcp_flags & XPRT_COPY_DATA)) | 787 | if (!(transport->tcp_flags & TCP_RCV_COPY_DATA)) |
| 780 | xprt_complete_rqst(req->rq_task, transport->tcp_copied); | 788 | xprt_complete_rqst(req->rq_task, transport->tcp_copied); |
| 781 | spin_unlock(&xprt->transport_lock); | 789 | spin_unlock(&xprt->transport_lock); |
| 782 | xs_tcp_check_fraghdr(transport); | 790 | xs_tcp_check_fraghdr(transport); |
| @@ -810,17 +818,17 @@ static int xs_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, uns | |||
| 810 | do { | 818 | do { |
| 811 | /* Read in a new fragment marker if necessary */ | 819 | /* Read in a new fragment marker if necessary */ |
| 812 | /* Can we ever really expect to get completely empty fragments? */ | 820 | /* Can we ever really expect to get completely empty fragments? */ |
| 813 | if (transport->tcp_flags & XPRT_COPY_RECM) { | 821 | if (transport->tcp_flags & TCP_RCV_COPY_FRAGHDR) { |
| 814 | xs_tcp_read_fraghdr(xprt, &desc); | 822 | xs_tcp_read_fraghdr(xprt, &desc); |
| 815 | continue; | 823 | continue; |
| 816 | } | 824 | } |
| 817 | /* Read in the xid if necessary */ | 825 | /* Read in the xid if necessary */ |
| 818 | if (transport->tcp_flags & XPRT_COPY_XID) { | 826 | if (transport->tcp_flags & TCP_RCV_COPY_XID) { |
| 819 | xs_tcp_read_xid(transport, &desc); | 827 | xs_tcp_read_xid(transport, &desc); |
| 820 | continue; | 828 | continue; |
| 821 | } | 829 | } |
| 822 | /* Read in the request data */ | 830 | /* Read in the request data */ |
| 823 | if (transport->tcp_flags & XPRT_COPY_DATA) { | 831 | if (transport->tcp_flags & TCP_RCV_COPY_DATA) { |
| 824 | xs_tcp_read_request(xprt, &desc); | 832 | xs_tcp_read_request(xprt, &desc); |
| 825 | continue; | 833 | continue; |
| 826 | } | 834 | } |
| @@ -886,7 +894,8 @@ static void xs_tcp_state_change(struct sock *sk) | |||
| 886 | transport->tcp_offset = 0; | 894 | transport->tcp_offset = 0; |
| 887 | transport->tcp_reclen = 0; | 895 | transport->tcp_reclen = 0; |
| 888 | transport->tcp_copied = 0; | 896 | transport->tcp_copied = 0; |
| 889 | transport->tcp_flags = XPRT_COPY_RECM | XPRT_COPY_XID; | 897 | transport->tcp_flags = |
| 898 | TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID; | ||
| 890 | 899 | ||
| 891 | xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; | 900 | xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; |
| 892 | xprt_wake_pending_tasks(xprt, 0); | 901 | xprt_wake_pending_tasks(xprt, 0); |
