Messages in this thread |  | | From | "Eric Barton" <> | Subject | tcp_recvmsg() in 2.4.4 | Date | Thu, 7 Jun 2001 18:59:06 +0100 |
| |
If there are no packets on sk->recieve_queue, and nothing has been copied to userland yet, it seems to me there is a redundant test of sk->done.
About line 1461 in net/ipv4/tcp.c:
/* Well, if we have backlog, try to process it now yet. */
if (copied >= target && sk->backlog.tail == NULL) break;
if (copied) { if (sk->err || sk->state == TCP_CLOSE || (sk->shutdown & RCV_SHUTDOWN) || !timeo || (flags & MSG_PEEK)) break; } else { if (sk->done) break;
if (sk->err) { copied = sock_error(sk); break; }
if (sk->shutdown & RCV_SHUTDOWN) break;
if (sk->state == TCP_CLOSE) { if (!sk->done) { /* This occurs when user tries to read * from never connected socket. */ copied = -ENOTCONN; break; } break; }
if (!timeo) { copied = -EAGAIN; break; } }
When it get to if(sk->state == TCP_CLOSE), surely sk->done has already been tested (and the socket is locked), so -ENOTCONN could be returned immediately.
Actually I'd really appreciate it if someone could explain the order of tests for sk->done, sk->err, sk->shutdown and sk->state...
--
Cheers, Eric
---------------------------------------------------- |Eric Barton Barton Software | |9 York Gardens Tel: +44 (117) 923 9831 | |Clifton Mobile: +44 (7909) 680 356 | |Bristol BS8 4LL Fax: call first | |United Kingdom E-Mail: eric@bartonsoftware.com| ----------------------------------------------------
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |