diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r-- | net/sunrpc/svcsock.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index a6de09de5d21..18bc130255a7 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <net/tcp_states.h> | 43 | #include <net/tcp_states.h> |
44 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
45 | #include <asm/ioctls.h> | 45 | #include <asm/ioctls.h> |
46 | #include <trace/events/skb.h> | ||
46 | 47 | ||
47 | #include <linux/sunrpc/types.h> | 48 | #include <linux/sunrpc/types.h> |
48 | #include <linux/sunrpc/clnt.h> | 49 | #include <linux/sunrpc/clnt.h> |
@@ -619,6 +620,8 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
619 | if (!svc_udp_get_dest_address(rqstp, cmh)) { | 620 | if (!svc_udp_get_dest_address(rqstp, cmh)) { |
620 | net_warn_ratelimited("svc: received unknown control message %d/%d; dropping RPC reply datagram\n", | 621 | net_warn_ratelimited("svc: received unknown control message %d/%d; dropping RPC reply datagram\n", |
621 | cmh->cmsg_level, cmh->cmsg_type); | 622 | cmh->cmsg_level, cmh->cmsg_type); |
623 | out_free: | ||
624 | trace_kfree_skb(skb, svc_udp_recvfrom); | ||
622 | skb_free_datagram_locked(svsk->sk_sk, skb); | 625 | skb_free_datagram_locked(svsk->sk_sk, skb); |
623 | return 0; | 626 | return 0; |
624 | } | 627 | } |
@@ -630,8 +633,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
630 | if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { | 633 | if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { |
631 | local_bh_enable(); | 634 | local_bh_enable(); |
632 | /* checksum error */ | 635 | /* checksum error */ |
633 | skb_free_datagram_locked(svsk->sk_sk, skb); | 636 | goto out_free; |
634 | return 0; | ||
635 | } | 637 | } |
636 | local_bh_enable(); | 638 | local_bh_enable(); |
637 | skb_free_datagram_locked(svsk->sk_sk, skb); | 639 | skb_free_datagram_locked(svsk->sk_sk, skb); |
@@ -640,10 +642,8 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
640 | rqstp->rq_arg.head[0].iov_base = skb->data + | 642 | rqstp->rq_arg.head[0].iov_base = skb->data + |
641 | sizeof(struct udphdr); | 643 | sizeof(struct udphdr); |
642 | rqstp->rq_arg.head[0].iov_len = len; | 644 | rqstp->rq_arg.head[0].iov_len = len; |
643 | if (skb_checksum_complete(skb)) { | 645 | if (skb_checksum_complete(skb)) |
644 | skb_free_datagram_locked(svsk->sk_sk, skb); | 646 | goto out_free; |
645 | return 0; | ||
646 | } | ||
647 | rqstp->rq_xprt_ctxt = skb; | 647 | rqstp->rq_xprt_ctxt = skb; |
648 | } | 648 | } |
649 | 649 | ||