aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2009-03-11 14:06:41 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2009-03-11 14:06:41 -0400
commitfba91afbec2c004e2c8733ae9e0ca6998e962c64 (patch)
tree025d7c07b8d41d4e5752fb9da7396a0b596856da /net/sunrpc/xprtsock.c
parentd7371c41b0cda782256b1df759df4e8d4724584c (diff)
SUNRPC: Fix an Oops due to socket not set up yet...
We can Oops in both xs_udp_send_request() and xs_tcp_send_request() if the call to xs_sendpages() returns an error due to the socket not yet being set up. Deal with that situation by returning a new error: ENOTSOCK, so that we know to avoid dereferencing transport->sock. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r--net/sunrpc/xprtsock.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 5cbb404c4cdf..a71fefd61910 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -467,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
467 int err, sent = 0; 467 int err, sent = 0;
468 468
469 if (unlikely(!sock)) 469 if (unlikely(!sock))
470 return -ENOTCONN; 470 return -ENOTSOCK;
471 471
472 clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags); 472 clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
473 if (base != 0) { 473 if (base != 0) {
@@ -594,6 +594,10 @@ static int xs_udp_send_request(struct rpc_task *task)
594 } 594 }
595 595
596 switch (status) { 596 switch (status) {
597 case -ENOTSOCK:
598 status = -ENOTCONN;
599 /* Should we call xs_close() here? */
600 break;
597 case -EAGAIN: 601 case -EAGAIN:
598 xs_nospace(task); 602 xs_nospace(task);
599 break; 603 break;
@@ -693,6 +697,10 @@ static int xs_tcp_send_request(struct rpc_task *task)
693 } 697 }
694 698
695 switch (status) { 699 switch (status) {
700 case -ENOTSOCK:
701 status = -ENOTCONN;
702 /* Should we call xs_close() here? */
703 break;
696 case -EAGAIN: 704 case -EAGAIN:
697 xs_nospace(task); 705 xs_nospace(task);
698 break; 706 break;