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
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))
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;
}
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;
}
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;
}