return NULL;
}
-static struct sock *__vsock_find_unbound_socket(struct sockaddr_vm *addr)
-{
- struct vsock_sock *vsk;
-
- list_for_each_entry(vsk, vsock_unbound_sockets, bound_table)
- if (addr->svm_port == vsk->local_addr.svm_port)
- return sk_vsock(vsk);
-
- return NULL;
-}
-
static struct sock *__vsock_find_connected_socket(struct sockaddr_vm *src,
struct sockaddr_vm *dst)
{
}
EXPORT_SYMBOL_GPL(vsock_find_bound_socket);
-struct sock *vsock_find_unbound_socket(struct sockaddr_vm *addr)
-{
- struct sock *sk;
-
- spin_lock_bh(&vsock_table_lock);
- sk = __vsock_find_unbound_socket(addr);
- if (sk)
- sock_hold(sk);
-
- spin_unlock_bh(&vsock_table_lock);
-
- return sk;
-}
-EXPORT_SYMBOL_GPL(vsock_find_unbound_socket);
-
struct sock *vsock_find_connected_socket(struct sockaddr_vm *src,
struct sockaddr_vm *dst)
{
return 0;
}
-int vsock_bind_dgram_generic(struct vsock_sock *vsk, struct sockaddr_vm *addr)
-{
- static u32 port = LAST_RESERVED_PORT + 1;
- struct sockaddr_vm new_addr;
-
- vsock_addr_init(&new_addr, addr->svm_cid, addr->svm_port);
-
- if (addr->svm_port == VMADDR_PORT_ANY) {
- bool found = false;
- unsigned int i;
-
- for (i = 0; i < MAX_PORT_RETRIES; i++) {
- if (port <= LAST_RESERVED_PORT)
- port = LAST_RESERVED_PORT + 1;
-
- new_addr.svm_port = port++;
-
- if (!__vsock_find_unbound_socket(&new_addr)) {
- found = true;
- break;
- }
- }
-
- if (!found)
- return -EADDRNOTAVAIL;
- } else {
- /* If port is in reserved range, ensure caller
- * has necessary privileges.
- */
- if (addr->svm_port <= LAST_RESERVED_PORT &&
- !capable(CAP_NET_BIND_SERVICE)) {
- return -EACCES;
- }
-
- if (__vsock_find_unbound_socket(&new_addr))
- return -EADDRINUSE;
- }
-
- vsock_addr_init(&vsk->local_addr, new_addr.svm_cid, new_addr.svm_port);
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(vsock_bind_dgram_generic);
-
static int __vsock_bind_dgram(struct vsock_sock *vsk,
struct sockaddr_vm *addr)
{
if (err < 0)
goto out;
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
-
while (total_written < len) {
ssize_t written;
goto out_wait;
release_sock(sk);
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
timeout = schedule_timeout(timeout);
+ finish_wait(sk_sleep(sk), &wait);
lock_sock(sk);
if (signal_pending(current)) {
err = sock_intr_errno(timeout);
goto out_wait;
}
- prepare_to_wait(sk_sleep(sk), &wait,
- TASK_INTERRUPTIBLE);
}
/* These checks occur both as part of and after the loop
out_wait:
if (total_written > 0)
err = total_written;
- finish_wait(sk_sleep(sk), &wait);
out:
release_sock(sk);
return err;
if (err < 0)
goto out;
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
while (1) {
s64 ready = vsock_stream_has_data(vsk);
*/
err = -ENOMEM;
- goto out_wait;
+ goto out;
} else if (ready > 0) {
ssize_t read;
vsk, target, read,
!(flags & MSG_PEEK), &recv_data);
if (err < 0)
- goto out_wait;
+ goto out;
if (read >= target || flags & MSG_PEEK)
break;
break;
release_sock(sk);
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
timeout = schedule_timeout(timeout);
+ finish_wait(sk_sleep(sk), &wait);
lock_sock(sk);
if (signal_pending(current)) {
err = -EAGAIN;
break;
}
-
- prepare_to_wait(sk_sleep(sk), &wait,
- TASK_INTERRUPTIBLE);
}
}
err = copied;
}
-out_wait:
- finish_wait(sk_sleep(sk), &wait);
out:
release_sock(sk);
return err;