|
@@ -1540,8 +1540,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
long timeout;
|
|
|
int err;
|
|
|
struct vsock_transport_send_notify_data send_data;
|
|
|
-
|
|
|
- DEFINE_WAIT(wait);
|
|
|
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
|
|
|
|
sk = sock->sk;
|
|
|
vsk = vsock_sk(sk);
|
|
@@ -1584,11 +1583,10 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
if (err < 0)
|
|
|
goto out;
|
|
|
|
|
|
-
|
|
|
while (total_written < len) {
|
|
|
ssize_t written;
|
|
|
|
|
|
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
|
|
+ add_wait_queue(sk_sleep(sk), &wait);
|
|
|
while (vsock_stream_has_space(vsk) == 0 &&
|
|
|
sk->sk_err == 0 &&
|
|
|
!(sk->sk_shutdown & SEND_SHUTDOWN) &&
|
|
@@ -1597,33 +1595,30 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
/* Don't wait for non-blocking sockets. */
|
|
|
if (timeout == 0) {
|
|
|
err = -EAGAIN;
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
goto out_err;
|
|
|
}
|
|
|
|
|
|
err = transport->notify_send_pre_block(vsk, &send_data);
|
|
|
if (err < 0) {
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
goto out_err;
|
|
|
}
|
|
|
|
|
|
release_sock(sk);
|
|
|
- timeout = schedule_timeout(timeout);
|
|
|
+ timeout = wait_woken(&wait, TASK_INTERRUPTIBLE, timeout);
|
|
|
lock_sock(sk);
|
|
|
if (signal_pending(current)) {
|
|
|
err = sock_intr_errno(timeout);
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
goto out_err;
|
|
|
} else if (timeout == 0) {
|
|
|
err = -EAGAIN;
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
goto out_err;
|
|
|
}
|
|
|
-
|
|
|
- prepare_to_wait(sk_sleep(sk), &wait,
|
|
|
- TASK_INTERRUPTIBLE);
|
|
|
}
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
|
|
|
|
/* These checks occur both as part of and after the loop
|
|
|
* conditional since we need to check before and after
|