summaryrefslogtreecommitdiff
path: root/net/llc
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@mandriva.com>2005-09-22 04:37:07 -0300
committerArnaldo Carvalho de Melo <acme@mandriva.com>2005-09-22 04:37:07 -0300
commitafdbe35787ea3390af0f1dd38b3dd9d8a8d313e7 (patch)
treef0d05f1e081523e4ea38f4659f9b57af1a17fc11 /net/llc
parent249ff1c6d35fd32ca945967c3f0b948210a96baa (diff)
downloadkernel-common-afdbe35787ea3390af0f1dd38b3dd9d8a8d313e7.tar.gz
kernel-common-afdbe35787ea3390af0f1dd38b3dd9d8a8d313e7.tar.bz2
kernel-common-afdbe35787ea3390af0f1dd38b3dd9d8a8d313e7.zip
[LLC]: Use sk_wait_data
Signed-off-by: Jochen Friedrich <jochen@scram.de> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Diffstat (limited to 'net/llc')
-rw-r--r--net/llc/af_llc.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index 7e9cf3214b88..f536369cdb52 100644
--- a/net/llc/af_llc.c
+++ b/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;
}