Quellcode durchsuchen

[LLC]: Use sk_wait_data

Signed-off-by: Jochen Friedrich <jochen@scram.de>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Arnaldo Carvalho de Melo vor 19 Jahren
Ursprung
Commit
afdbe35787
1 geänderte Dateien mit 23 neuen und 19 gelöschten Zeilen
  1. 23 19
      net/llc/af_llc.c

+ 23 - 19
net/llc/af_llc.c

@@ -39,7 +39,6 @@ static struct proto_ops llc_ui_ops;
 
 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
@@ -524,16 +523,19 @@ static int llc_ui_wait_for_conn(struct sock *sk, long timeout)
 	return 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)
 {
 	DEFINE_WAIT(wait);
-	int rc = 0;
+	struct llc_sock *llc = llc_sk(sk);
+	int rc;
 
 	while (1) {
 		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+		rc = 0;
 		if (sk_wait_event(sk, &timeout,
 				  (sk->sk_shutdown & RCV_SHUTDOWN) ||
-				  (!skb_queue_empty(&sk->sk_receive_queue))))
+				  (!llc_data_accept_state(llc->state) &&
+				   !llc->p_flag)))
 			break;
 		rc = -ERESTARTSYS;
 		if (signal_pending(current))
@@ -541,34 +543,36 @@ static int llc_ui_wait_for_data(struct sock *sk, long timeout)
 		rc = -EAGAIN;
 		if (!timeout)
 			break;
-		rc = 0;
 	}
 	finish_wait(sk->sk_sleep, &wait);
 	return rc;
 }
 
-static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
+int llc_wait_data(struct sock *sk, long timeo)
 {
-	DEFINE_WAIT(wait);
-	struct llc_sock *llc = llc_sk(sk);
 	int rc;
 
 	while (1) {
-		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+		/*
+		 * POSIX 1003.1g mandates this order.
+		 */
+		if (sk->sk_err) {
+			rc = sock_error(sk);
+			break;
+		}
 		rc = 0;
-		if (sk_wait_event(sk, &timeout,
-				  (sk->sk_shutdown & RCV_SHUTDOWN) ||
-				  (!llc_data_accept_state(llc->state) &&
-				   !llc->p_flag)))
+		if (sk->sk_shutdown & RCV_SHUTDOWN)
 			break;
-		rc = -ERESTARTSYS;
+		rc = -EAGAIN;
+		if (!timeo)
+			break;
+		rc = sock_intr_errno(timeo);
 		if (signal_pending(current))
 			break;
-		rc = -EAGAIN;
-		if (!timeout)
+		rc = 0;
+		if (sk_wait_data(sk, &timeo))
 			break;
 	}
-	finish_wait(sk->sk_sleep, &wait);
 	return rc;
 }
 
@@ -599,7 +603,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
 		goto out;
 	/* wait for a connection to arrive. */
 	if (skb_queue_empty(&sk->sk_receive_queue)) {
-		rc = llc_ui_wait_for_data(sk, sk->sk_rcvtimeo);
+		rc = llc_wait_data(sk, sk->sk_rcvtimeo);
 		if (rc)
 			goto out;
 	}
@@ -658,7 +662,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
 		llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap);
 	lock_sock(sk);
 	if (skb_queue_empty(&sk->sk_receive_queue)) {
-		rc = llc_ui_wait_for_data(sk, sock_rcvtimeo(sk, noblock));
+		rc = llc_wait_data(sk, sock_rcvtimeo(sk, noblock));
 		if (rc)
 			goto out;
 	}