git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
net
/
core
/
stream.c
diff --git
a/net/core/stream.c
b/net/core/stream.c
index
1e27a57
..
e948969
100644
(file)
--- a/
net/core/stream.c
+++ b/
net/core/stream.c
@@
-21,7
+21,7
@@
/**
* sk_stream_write_space - stream socket write_space callback.
/**
* sk_stream_write_space - stream socket write_space callback.
- *
sk -
socket
+ *
@sk:
socket
*
* FIXME: write proper description
*/
*
* FIXME: write proper description
*/
@@
-43,8
+43,8
@@
EXPORT_SYMBOL(sk_stream_write_space);
/**
* sk_stream_wait_connect - Wait for a socket to get into the connected state
/**
* sk_stream_wait_connect - Wait for a socket to get into the connected state
- * @sk
-
sock to wait on
- * @timeo_p
-
for how long to wait
+ * @sk
:
sock to wait on
+ * @timeo_p
:
for how long to wait
*
* Must be called with the socket locked.
*/
*
* Must be called with the socket locked.
*/
@@
-52,10
+52,12
@@
int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
{
struct task_struct *tsk = current;
DEFINE_WAIT(wait);
{
struct task_struct *tsk = current;
DEFINE_WAIT(wait);
+ int done;
- while (1) {
- if (sk->sk_err)
- return sock_error(sk);
+ do {
+ int err = sock_error(sk);
+ if (err)
+ return err;
if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV))
return -EPIPE;
if (!*timeo_p)
if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV))
return -EPIPE;
if (!*timeo_p)
@@
-65,13
+67,13
@@
int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
sk->sk_write_pending++;
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
sk->sk_write_pending++;
-
if (
sk_wait_event(sk, timeo_p,
- !((1 << sk->sk_state) &
- ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT))))
-
break
;
+
done =
sk_wait_event(sk, timeo_p,
+ !sk->sk_err &&
+ !((1 << sk->sk_state) &
+
~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)))
;
finish_wait(sk->sk_sleep, &wait);
sk->sk_write_pending--;
finish_wait(sk->sk_sleep, &wait);
sk->sk_write_pending--;
- }
+ }
while (!done);
return 0;
}
return 0;
}
@@
-79,7
+81,7
@@
EXPORT_SYMBOL(sk_stream_wait_connect);
/**
* sk_stream_closing - Return 1 if we still have things to send in our buffers.
/**
* sk_stream_closing - Return 1 if we still have things to send in our buffers.
- * @sk
-
socket to verify
+ * @sk
:
socket to verify
*/
static inline int sk_stream_closing(struct sock *sk)
{
*/
static inline int sk_stream_closing(struct sock *sk)
{
@@
-107,8
+109,8
@@
EXPORT_SYMBOL(sk_stream_wait_close);
/**
* sk_stream_wait_memory - Wait for more memory for a socket
/**
* sk_stream_wait_memory - Wait for more memory for a socket
- * @sk
-
socket to wait for memory
- * @timeo_p
-
for how long
+ * @sk
:
socket to wait for memory
+ * @timeo_p
:
for how long
*/
int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
{
*/
int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
{
@@
-137,7
+139,9
@@
int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
sk->sk_write_pending++;
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
sk->sk_write_pending++;
- sk_wait_event(sk, ¤t_timeo, sk_stream_memory_free(sk) &&
+ sk_wait_event(sk, ¤t_timeo, !sk->sk_err &&
+ !(sk->sk_shutdown & SEND_SHUTDOWN) &&
+ sk_stream_memory_free(sk) &&
vm_wait);
sk->sk_write_pending--;
vm_wait);
sk->sk_write_pending--;
@@
-172,6
+176,7
@@
void sk_stream_rfree(struct sk_buff *skb)
{
struct sock *sk = skb->sk;
{
struct sock *sk = skb->sk;
+ skb_truesize_check(skb);
atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
sk->sk_forward_alloc += skb->truesize;
}
atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
sk->sk_forward_alloc += skb->truesize;
}