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.1414.4.14, 2003-11-09 03:42:22-02:00, acme@conectiva.com.br o LLC: convert llc_ui_wait_for_ functions to use prepare_to_wait/finish_wait And make it look more like the similar routines in the TCP/IP source code. af_llc.c | 148 ++++++++++++++++++++++++++++----------------------------------- 1 files changed, 68 insertions(+), 80 deletions(-) diff -Nru a/net/llc/af_llc.c b/net/llc/af_llc.c --- a/net/llc/af_llc.c Sat Nov 15 17:03:57 2003 +++ b/net/llc/af_llc.c Sat Nov 15 17:03:57 2003 @@ -417,12 +417,30 @@ sk->sk_state = TCP_CLOSE; goto out; } - rc = llc_ui_wait_for_conn(sk, sk->sk_rcvtimeo); - if (rc) - dprintk("%s: llc_ui_wait_for_conn failed=%d\n", __FUNCTION__, rc); + + if (sk->sk_state == TCP_SYN_SENT) { + const int timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); + + if (!timeo || !llc_ui_wait_for_conn(sk, timeo)) + goto out; + + rc = sock_intr_errno(timeo); + if (signal_pending(current)) + goto out; + } + + if (sk->sk_state == TCP_CLOSE) + goto sock_error; + + sock->state = SS_CONNECTED; + rc = 0; out: release_sock(sk); return rc; +sock_error: + rc = sock_error(sk) ? : -ECONNABORTED; + sock->state = SS_UNCONNECTED; + goto out; } /** @@ -463,117 +481,89 @@ static int llc_ui_wait_for_disc(struct sock *sk, int timeout) { - DECLARE_WAITQUEUE(wait, current); - int rc; + DEFINE_WAIT(wait); + int rc = 0; - add_wait_queue_exclusive(sk->sk_sleep, &wait); - for (;;) { - __set_current_state(TASK_INTERRUPTIBLE); - rc = 0; - if (sk->sk_state != TCP_CLOSE) { - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); - } else - break; + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); + while (sk->sk_state != TCP_CLOSE) { + release_sock(sk); + timeout = schedule_timeout(timeout); + lock_sock(sk); rc = -ERESTARTSYS; if (signal_pending(current)) break; rc = -EAGAIN; if (!timeout) break; + rc = 0; + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); } - __set_current_state(TASK_RUNNING); - remove_wait_queue(sk->sk_sleep, &wait); + finish_wait(sk->sk_sleep, &wait); return rc; } static int llc_ui_wait_for_conn(struct sock *sk, int timeout) { - DECLARE_WAITQUEUE(wait, current); - int rc; + DEFINE_WAIT(wait); - add_wait_queue_exclusive(sk->sk_sleep, &wait); - for (;;) { - __set_current_state(TASK_INTERRUPTIBLE); - rc = -EAGAIN; - if (sk->sk_state == TCP_CLOSE) - break; - rc = 0; - if (sk->sk_state != TCP_ESTABLISHED) { - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); - } else - break; - rc = -ERESTARTSYS; - if (signal_pending(current)) - break; - rc = -EAGAIN; - if (!timeout) + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); + + while (sk->sk_state == TCP_SYN_SENT) { + release_sock(sk); + timeout = schedule_timeout(timeout); + lock_sock(sk); + if (signal_pending(current) || !timeout) break; + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); } - __set_current_state(TASK_RUNNING); - remove_wait_queue(sk->sk_sleep, &wait); - return rc; + finish_wait(sk->sk_sleep, &wait); + return timeout; } static int llc_ui_wait_for_data(struct sock *sk, int timeout) { - DECLARE_WAITQUEUE(wait, current); + DEFINE_WAIT(wait); int rc = 0; - add_wait_queue_exclusive(sk->sk_sleep, &wait); for (;;) { - __set_current_state(TASK_INTERRUPTIBLE); + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); if (sk->sk_shutdown & RCV_SHUTDOWN) break; - /* - * Well, if we have backlog, try to process it now. - */ - if (sk->sk_backlog.tail) { - release_sock(sk); - lock_sock(sk); - } - rc = 0; - if (skb_queue_empty(&sk->sk_receive_queue)) { - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); - } else + sk_flush_backlog(sk); + if (!skb_queue_empty(&sk->sk_receive_queue)) break; + release_sock(sk); + timeout = schedule_timeout(timeout); + lock_sock(sk); rc = -ERESTARTSYS; if (signal_pending(current)) break; rc = -EAGAIN; if (!timeout) break; + rc = 0; } - __set_current_state(TASK_RUNNING); - remove_wait_queue(sk->sk_sleep, &wait); + finish_wait(sk->sk_sleep, &wait); return rc; } static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout) { - DECLARE_WAITQUEUE(wait, current); + DEFINE_WAIT(wait); struct llc_opt *llc = llc_sk(sk); int rc; - add_wait_queue_exclusive(sk->sk_sleep, &wait); for (;;) { - dprintk("%s: looping...\n", __FUNCTION__); - __set_current_state(TASK_INTERRUPTIBLE); + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); rc = -ENOTCONN; if (sk->sk_shutdown & RCV_SHUTDOWN) break; rc = 0; - if (llc_data_accept_state(llc->state) || llc->p_flag) { - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); - } else + if (!llc_data_accept_state(llc->state) && !llc->p_flag) break; + release_sock(sk); + timeout = schedule_timeout(timeout); + lock_sock(sk); rc = -ERESTARTSYS; if (signal_pending(current)) break; @@ -581,8 +571,7 @@ if (!timeout) break; } - __set_current_state(TASK_RUNNING); - remove_wait_queue(sk->sk_sleep, &wait); + finish_wait(sk->sk_sleep, &wait); return rc; } @@ -612,9 +601,11 @@ sk->sk_state != TCP_LISTEN)) goto out; /* wait for a connection to arrive. */ - rc = llc_ui_wait_for_data(sk, sk->sk_rcvtimeo); - if (rc) - goto out; + if (skb_queue_empty(&sk->sk_receive_queue)) { + rc = llc_ui_wait_for_data(sk, sk->sk_rcvtimeo); + if (rc) + goto out; + } dprintk("%s: got a new connection on %02X\n", __FUNCTION__, llc_sk(sk)->laddr.lsap); skb = skb_dequeue(&sk->sk_receive_queue); @@ -663,19 +654,16 @@ struct sock *sk = sock->sk; struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name; struct sk_buff *skb; - int rc = -ENOMEM, copied = 0, timeout; + int rc = -ENOMEM, copied = 0; int noblock = flags & MSG_DONTWAIT; dprintk("%s: receiving in %02X from %02X\n", __FUNCTION__, llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap); lock_sock(sk); - timeout = sock_rcvtimeo(sk, noblock); - rc = llc_ui_wait_for_data(sk, timeout); - if (rc) { - dprintk("%s: llc_ui_wait_for_data failed recv " - "in %02X from %02X\n", __FUNCTION__, - llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap); - goto out; + if (skb_queue_empty(&sk->sk_receive_queue)) { + rc = llc_ui_wait_for_data(sk, sock_rcvtimeo(sk, noblock)); + if (rc) + goto out; } skb = skb_dequeue(&sk->sk_receive_queue); if (!skb) /* shutdown */ =================================================================== This BitKeeper patch contains the following changesets: 1.1414.4.14 ## Wrapped with gzip_uu ## M'XL( )UXMC\ ^5786_B.!#]C'_%5"M5H"L0)W82J-K;%KB[:+N "M7II)4B M$TR)" F;.*U6Q_WW&SLM[5)N=^_:;]>"#,[,F^RHE4<'9&5);?B61>O!=J MF61I2^4B+=92F=K;7>C6MBP;?SGU'(N[6^I:S-M&=$ZI8%3.+9OY+B.:VOM] M^E^C.)1:'8LSRV);BUG,)GV@+P(FJJ($FBL(S#>Q&K<)'E(2S*%)ED:8&UH2PD M;'*Y$;D,56:BVHLXC8NE^8QP^+I(Y[ 6*PDQPF79"M99+B&)<48M)13Q.DY$ M#GE6JCB5!<2IF9_VQNU@#$56YI%$/G/9(A\ E7/(^*F7I/DO?PBQA$7.#^NZ M16NU<=^I/;HVU+\#MQ+BLQ!LVYMA[&.\:KK[)N4.M\VJ>M#T_]? MVK1J[ B:^;UYH>_&+WK\'[S;9[8%#@F8;0/UR"=2BQ=0+U;-\V(5%DHHB<;1 MG,+)'\-P,AA.&_ GJ>FCM5!(68&*US*#,]#6"8MT;KXCP@DL$G%;P#&,PN%H M>'DUZGUHG.H*IL11E;?=PM&^UHB=&@ 3TFA@1NTV0]E1J0H@CQX+(H,\E'F> M9O4J^O0!OXAO4Y&$&YG.X_2V'I5Y+E.U#U;[ZUM+[EV-)@.=81),/2R5Y8:$ M_HHI53Q,)F%O-!P.>M-!'V$-0>M4Z\J!D:?4+GE&WLQ@Y0;\#%UH#C3"Q>7H MNL)X4>!F^+S$TR+ZS'7!QEJNAT.M/_@E& ["WR^":5UKJB71C7KDA.$=0#,% MS/.!D]J>D7=*)%)N3N!8SYW ]&+R(0R&T\'U]#33L_3).Y)YV1\^U M,U[)92)%(K6V2:52JM1+24\S+!^M54_6$T88DQU2XO8#[32]SI6WL% M^S[N?2.;[P$EM6?[]Q"(2>@X)J'#=,(!G3'"!>J3@%,'O-=(^^FPN ?WXMOI M^\VM8_;J8[)>HE'A-0W@U-5G#Z>^;NKW&X K566>P@,)C6 [2"*HAH,=X39V M1 ]^%>B_FK1#@6K6S#%6Q+1%4B+QF8A627;[7,FC8C4+/Y>RE*%<;]27^O%# MH5Q&,KZ3U;.&5I,QE.)-]PKGEEGK;M]S;FO[X03(BZOMA+I0(113)C:JV0AUG'T['!AP?FUND>;X)]:6C M]?3<-]:SS\W9$W"?_Z!\+N7:WB[U]#%;73(_9(=J5^NV[5^-6@9S-3XF1G=? M7WMY]/*&Z[NF+T$U/-T%S<%P]''P\03_R-C$S\>@*7+P0&[?\"P5]&J*-=G\YD0U%\(\C>H*!TV]0T