You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1422.1.10, 2003-11-13 04:28:29-02:00, acme@conectiva.com.br o NET: introduce sk_wait_error To have a common function and avoid tons of open coded implementations. include/net/sock.h | 2 + net/core/sock.c | 58 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff -Nru a/include/net/sock.h b/include/net/sock.h --- a/include/net/sock.h Sat Nov 15 17:01:30 2003 +++ b/include/net/sock.h Sat Nov 15 17:01:30 2003 @@ -407,6 +407,8 @@ extern int __sk_wait_data(struct sock *sk, long *timeo); extern int sk_wait_data(struct sock *sk, long timeo); +extern int __sk_wait_error(long timeo); +extern int sk_wait_error(struct sock *sk, long timeo); /* IP protocol blocks we attach to sockets. * socket layer -> transport layer interface diff -Nru a/net/core/sock.c b/net/core/sock.c --- a/net/core/sock.c Sat Nov 15 17:01:30 2003 +++ b/net/core/sock.c Sat Nov 15 17:01:30 2003 @@ -747,9 +747,7 @@ clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); for (;;) { - if (!timeo) - break; - if (signal_pending(current)) + if (__sk_wait_error(timeo)) break; set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); @@ -757,8 +755,6 @@ break; if (sk->sk_shutdown & SEND_SHUTDOWN) break; - if (sk->sk_err) - break; timeo = schedule_timeout(timeo); } finish_wait(sk->sk_sleep, &wait); @@ -834,19 +830,14 @@ } set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); - err = -EAGAIN; - if (!timeo) + err = __sk_wait_error(timeo); + if (err) goto failure; - if (signal_pending(current)) - goto interrupted; timeo = sock_wait_for_wmem(sk, timeo); } skb_set_owner_w(skb, sk); return skb; - -interrupted: - err = sock_intr_errno(timeo); failure: *errcode = err; return NULL; @@ -926,28 +917,45 @@ EXPORT_SYMBOL(__sk_wait_data); +int __sk_wait_error(long timeo) +{ + int rc = 0; + + if (!timeo) + rc = -EAGAIN; + else if (signal_pending(current)) + rc = sock_intr_errno(timeo); + return rc; +} + +EXPORT_SYMBOL(__sk_wait_error); + +int sk_wait_error(struct sock *sk, long timeo) +{ + int rc = 0; + /* + * POSIX 1003.1g mandates this order. + */ + if (sk->sk_err) + rc = sock_error(sk); + else + rc = __sk_wait_error(timeo); + return rc; +} + +EXPORT_SYMBOL(sk_wait_error); + int sk_wait_data(struct sock *sk, long timeo) { int rc; while (1) { - /* - * POSIX 1003.1g mandates this order. - */ - if (sk->sk_err) { - rc = sock_error(sk); + rc = sk_wait_error(sk, timeo); + if (rc) break; - } rc = 0; if (sk->sk_shutdown & RCV_SHUTDOWN) break; - rc = -EAGAIN; - if (!timeo) - break; - rc = sock_intr_errno(timeo); - if (signal_pending(current)) - break; - rc = 0; if (__sk_wait_data(sk, &timeo)) break; } =================================================================== This BitKeeper patch contains the following changesets: 1.1422.1.10 ## Wrapped with gzip_uu ## M'XL( IXMC\ ^5676_;-A1]%G_%'?H29[-$4E^4 Q=-FZ SUC9&D@(=,,!@ M*,86;(D!1;L;YOWW7LEN$CMVC01[VFS!-,C#^W'N.89?P>=:VYXG5:G)*_C5 MU*[G*5-IY8J%])4I_1N+!Y?&X$$P,:4.&FQP,^5!I5V7^XG/""*&TJD)++2M M>Q[SP_L=]]>=[GF7Y^\_?SB])*3?AW<368WUE7;0[Q-G[$+.\OJ-=).9J7QG M9567VK6YE_?0):>4XSMF:4CC9,D2&J5+Q7+&9,1T3GDDDH@TI;W9+G\S2L@8 M"_$S8V+)HH0FY R8SR+.?5PHT#!@+& AT*C'18]G7,=46#@T_EU#XK*69//E89Z.OHJ"S?2UAJ+ 'RN#4SD0H,$S%*:"F[G%9:' M7V25@UR8(L?*JAK,+9@[72$LUSD4Y=U,E[IRLL'6/OD-D E&R?!A-J3[S!:Y6FN^G?$VXU MXH2+9L2IH(?+:NXK8_4JB-JH*6YTPC(<$[\13 I]DZDT1('L+FE'J,?U<)IR MUMK@:>V'_?!2^O88XT?TA8RR=$F%2.+6(?$3:S#Q_[!&JZ +Z-JO[8-2'^X8 MW@L,,XAH!ISH/YVV5=,.C$8;K1PA7V-P1:E-Y^0Q;A-5.SM7N(EUP'$]_04V MKC5:VQ+E8:&]Q!![1+;7$&N%95$:M@H+^7,5%H;0Y?%_0&.K7X4MC6T1]P*! MG:7HVI ,TI@#(YY7W,+1ML16,ND@-J$HQC,1IK@,1"AP\3P$0?^)+K]K:Q42 M]_"^B%;WH[1)F7&\+\@!49._B== +$H2Z GY@[0!?UJ?>EY[T#T_?7\Z^(3I M]*S6T"#J8ES)V0A)S8MJ?*3FUB*AG?LK#66C9GA-SLH\%&RUFZ.)K#HA_V"Z M\R_#B\OKT=7O']]>?-CFIM,4]#R[;3?D!