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.19, 2003-11-09 07:54:39-02:00, acme@conectiva.com.br
  o LLC: use sk_wait_event primitive


 af_llc.c |   66 +++++++++++++++++++++++++--------------------------------------
 1 files changed, 27 insertions(+), 39 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:23 2003
+++ b/net/llc/af_llc.c	Sat Nov 15 17:03:23 2003
@@ -36,10 +36,10 @@
 static struct sockaddr_llc llc_ui_addrnull;
 static struct proto_ops llc_ui_ops;
 
-static int llc_ui_wait_for_conn(struct sock *sk, int timeout);
-static int llc_ui_wait_for_disc(struct sock *sk, int timeout);
-static int llc_ui_wait_for_data(struct sock *sk, int timeout);
-static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout);
+static int llc_ui_wait_for_conn(struct sock *sk, long timeout);
+static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
+static int llc_ui_wait_for_data(struct sock *sk, long timeout);
+static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout);
 
 #if 0
 #define dprintk(args...) printk(KERN_DEBUG args)
@@ -116,7 +116,7 @@
 	int rc = 0;
 
 	if (llc_data_accept_state(llc->state) || llc->p_flag) {
-		int timeout = sock_sndtimeo(sk, noblock);
+		long timeout = sock_sndtimeo(sk, noblock);
 
 		rc = llc_ui_wait_for_busy_core(sk, timeout);
 	}
@@ -419,7 +419,7 @@
 	}
 
 	if (sk->sk_state == TCP_SYN_SENT) {
-		const int timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
+		const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
 
 		if (!timeo || !llc_ui_wait_for_conn(sk, timeo))
 			goto out;
@@ -479,16 +479,15 @@
 	return rc;
 }
 
-static int llc_ui_wait_for_disc(struct sock *sk, int timeout)
+static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
 {
 	DEFINE_WAIT(wait);
 	int rc = 0;
 
-	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);
+	while (1) {
+		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+		if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE))
+			break;
 		rc = -ERESTARTSYS;
 		if (signal_pending(current))
 			break;
@@ -496,45 +495,37 @@
 		if (!timeout)
 			break;
 		rc = 0;
-		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
 	}
 	finish_wait(sk->sk_sleep, &wait);
 	return rc;
 }
 
-static int llc_ui_wait_for_conn(struct sock *sk, int timeout)
+static int llc_ui_wait_for_conn(struct sock *sk, long timeout)
 {
 	DEFINE_WAIT(wait);
 
-	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);
+	while (1) {
+		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+		if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT))
+			break;
 		if (signal_pending(current) || !timeout)
 			break;
-		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
 	}
 	finish_wait(sk->sk_sleep, &wait);
 	return timeout;
 }
 
-static int llc_ui_wait_for_data(struct sock *sk, int timeout)
+static int llc_ui_wait_for_data(struct sock *sk, long timeout)
 {
 	DEFINE_WAIT(wait);
 	int rc = 0;
 
-	for (;;) {
+	while (1) {
 		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
-		if (sk->sk_shutdown & RCV_SHUTDOWN)
+		if (sk_wait_event(sk, &timeout,
+				  (sk->sk_shutdown & RCV_SHUTDOWN) ||
+				  (!skb_queue_empty(&sk->sk_receive_queue))))
 			break;
-		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;
@@ -547,23 +538,20 @@
 	return rc;
 }
 
-static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout)
+static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
 {
 	DEFINE_WAIT(wait);
 	struct llc_opt *llc = llc_sk(sk);
 	int rc;
 
-	for (;;) {
+	while (1) {
 		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)
+		if (sk_wait_event(sk, &timeout,
+				  (sk->sk_shutdown & RCV_SHUTDOWN) ||
+				  (!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;

===================================================================


This BitKeeper patch contains the following changesets:
1.1414.4.19
## Wrapped with gzip_uu ##


M'XL( 'MXMC\  \56;6_:2!#^;/^*B2HAZ 6SZ]TUF!-5&T#7* @0D#O=)\LL
MFV !-O4NB:+SC^^LG:;-BQK=D5/-RUBS,X^?9V9VX1U<:I5WG5CNE/L./F?:
M=!V9I4J:Y";V9+;SECDNS+(,%UKK;*=:-K:UW/BM5)FF[P4>=3%B&ANYAAN5
MZZY#/?;@,7=[U75FPS\N1Y]FKMOK07\=I]=JK@ST>J[)\IMXN](?8[/>9JEG
M\CC5.V7*9Q</H85/B(\O0=N,B*"@ >'M0M(5I3&G:D5\W@FX:ZE]?$K_,0JC
ME(0DI(*U"\*I[[L#H![EE'O<HR$0UJ*T1?"FW16\R\(F\;N$P(O0\!N%)G'/
MX&UE]%T)&8Q&_2X<M *]B6[CQ$3J1J4&]GFR2Y"#<B^ 4\;=Z?>*NLU_>;DN
MB8G[X65U!3:XM=U*^XET)C>>K 0(1@ECPN<%8^U %*P3MGU?4MX1RU I]0I<
M?!6AJ<#NVR$XH0C&.V$Y(D\C[:2\+<57X)Y3%-RGK! AIZ2<F( _'15"?SXJ
M?AN:+/QUPU*5=P+-_+9\8_>GSRK]'R9HP$+@[CGW\5N;V"02$GRT[<@AJ<A<
M97F$!4GKVN0':<!V"M[KS2F@_FLPR4YE!]/X_6?YJT3+H_)C$Q^3OSSH.Q21
MJU=!!A3/$>J>5\9Q?ER&7ID7Z715>NHV/\V66W3:5.[[-K4RCCV*M?D!_\7T
MJVU\K:$&DV@\&9^-)OV+$JE3(97FN+I:L#8(! LI-MFY72=;!77:@'^0XSY7
M^SA7D<E*4*34_(!3J+=*[4^A9GVGL/@TOXC.QXOA;'8Y79R?C8;(T7&2*Z@_
MFMA24.W^P:?P#0OI*SP$8-&?1OW19#YL-##;6>8JWEBMH:WT0!!A)5?FN%&T
M8"$$"$;Y+Y1\4DF>_SV.YL/QXK%J/!A*U3XK59?FN U@P3H5F#6/5 \$(^42
M&O:Z#DO4 7@HS?I@5MEMBF,ZZ_\9S3]?+@:3O\8-*(IOD2=ZLXR^'-1!16JW
M-W?UVGUNKJ3"(ZQ::^!EN?C8G($0%:72O,'>M8A!A1@\UR\Z*'P@@G)?6</_
MES)8\K9742REVIMJ$NKH101[VX!:[3X83DKW/K)'0%48_%UBW_^/R;62&WW8
1]4A[I910@?L5P4LU*O()    
 
