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^<WSW;[#FX*F7=K(EI+\@Y^
MRPK5K459*B,5WXE6E*U;LQP?7&<9/F@OL[5LZ]CV;&6W4ZF:=LMM48(18Z&B
M)=S)O.C6:,O9S:@O&]FM70]^O;FZN";D[ QZ2Y'>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@+<HH:S$<P'+:E+:M#G[H,KMKVTW+[EH6'(2&
MGR@T+7();[N,'HD@@ZNK7A>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<<GZ'199M&I%E73<H9;C<)MM'<=S^=;Q.YYM1Y3Y?-:14GX'3BQ"'"JP
M1R/8U-GR#J.6,>=^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]<UX&EQ>#33L_3).Y)YV1\^U
M,U[)92)%(<WAHE>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[<N[\H-\Y[QC1S'!87=<QZKK<
M(+ONJ]7U*)Y) ?>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$<O[@$M>S\>@*7+P<V)NSUI(^
E<C8S:3;3.C?^>0&[?\"P5]&J*-=G\YD0U%\(\C>H*!TV]0T     
 
