patch-2.4.19 linux-2.4.19/net/irda/af_irda.c
Next file: linux-2.4.19/net/irda/irlap.c
Previous file: linux-2.4.19/net/ipv6/udp.c
Back to the patch index
Back to the overall index
- Lines: 63
- Date:
Fri Aug 2 17:39:46 2002
- Orig file:
linux-2.4.18/net/irda/af_irda.c
- Orig date:
Fri Dec 21 09:42:05 2001
diff -urN linux-2.4.18/net/irda/af_irda.c linux-2.4.19/net/irda/af_irda.c
@@ -1025,29 +1025,27 @@
/* Now the loop */
if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
return -EINPROGRESS;
-
- cli(); /* To avoid races on the sleep */
-
- /* A Connect Ack with Choke or timeout or failed routing will go to
- * closed. */
+
+ /* Here, there is a race condition : the state may change between
+ * our test and the sleep, via irda_connect_confirm().
+ * The way to workaround that is to sleep with a timeout, so that
+ * we don't sleep forever and check the state when waking up.
+ * 50ms is plenty good enough, because the LAP is already connected.
+ * Jean II */
while (sk->state == TCP_SYN_SENT) {
- interruptible_sleep_on(sk->sleep);
+ interruptible_sleep_on_timeout(sk->sleep, HZ/20);
if (signal_pending(current)) {
- sti();
return -ERESTARTSYS;
}
}
if (sk->state != TCP_ESTABLISHED) {
- sti();
sock->state = SS_UNCONNECTED;
return sock_error(sk); /* Always set at this point */
}
sock->state = SS_CONNECTED;
- sti();
-
/* At this point, IrLMP has assigned our source address */
self->saddr = irttp_get_saddr(self->tsap);
@@ -1710,7 +1708,7 @@
if (sk->state == TCP_ESTABLISHED) {
if ((self->tx_flow == FLOW_START) &&
- (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= SOCK_MIN_WRITE_SPACE))
+ sock_writeable(sk))
{
mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
}
@@ -1718,13 +1716,13 @@
break;
case SOCK_SEQPACKET:
if ((self->tx_flow == FLOW_START) &&
- (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= SOCK_MIN_WRITE_SPACE))
+ sock_writeable(sk))
{
mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
}
break;
case SOCK_DGRAM:
- if (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= SOCK_MIN_WRITE_SPACE)
+ if (sock_writeable(sk))
mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
break;
default:
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)