diff options
Diffstat (limited to 'net/vmw_vsock')
| -rw-r--r-- | net/vmw_vsock/Kconfig | 2 | ||||
| -rw-r--r-- | net/vmw_vsock/af_vsock.c | 49 | ||||
| -rw-r--r-- | net/vmw_vsock/vmci_transport.c | 6 | ||||
| -rw-r--r-- | net/vmw_vsock/vmci_transport_notify.c | 2 | ||||
| -rw-r--r-- | net/vmw_vsock/vmci_transport_notify_qstate.c | 4 | 
5 files changed, 27 insertions, 36 deletions
diff --git a/net/vmw_vsock/Kconfig b/net/vmw_vsock/Kconfig index b5fa7e40cdc..14810abedc2 100644 --- a/net/vmw_vsock/Kconfig +++ b/net/vmw_vsock/Kconfig @@ -6,7 +6,7 @@ config VSOCKETS  	tristate "Virtual Socket protocol"  	help  	  Virtual Socket Protocol is a socket protocol similar to TCP/IP -	  allowing comunication between Virtual Machines and hypervisor +	  allowing communication between Virtual Machines and hypervisor  	  or host.  	  You should also select one or more hypervisor-specific transports diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 545c08b8a1d..85d232bed87 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1662,8 +1662,6 @@ vsock_stream_recvmsg(struct kiocb *kiocb,  	vsk = vsock_sk(sk);  	err = 0; -	msg->msg_namelen = 0; -  	lock_sock(sk);  	if (sk->sk_state != SS_CONNECTED) { @@ -1927,9 +1925,23 @@ static struct miscdevice vsock_device = {  	.fops		= &vsock_device_ops,  }; -static int __vsock_core_init(void) +int __vsock_core_init(const struct vsock_transport *t, struct module *owner)  { -	int err; +	int err = mutex_lock_interruptible(&vsock_register_mutex); + +	if (err) +		return err; + +	if (transport) { +		err = -EBUSY; +		goto err_busy; +	} + +	/* Transport must be the owner of the protocol so that it can't +	 * unload while there are open sockets. +	 */ +	vsock_proto.owner = owner; +	transport = t;  	vsock_init_tables(); @@ -1953,36 +1965,19 @@ static int __vsock_core_init(void)  		goto err_unregister_proto;  	} +	mutex_unlock(&vsock_register_mutex);  	return 0;  err_unregister_proto:  	proto_unregister(&vsock_proto);  err_misc_deregister:  	misc_deregister(&vsock_device); -	return err; -} - -int vsock_core_init(const struct vsock_transport *t) -{ -	int retval = mutex_lock_interruptible(&vsock_register_mutex); -	if (retval) -		return retval; - -	if (transport) { -		retval = -EBUSY; -		goto out; -	} - -	transport = t; -	retval = __vsock_core_init(); -	if (retval) -		transport = NULL; - -out: +	transport = NULL; +err_busy:  	mutex_unlock(&vsock_register_mutex); -	return retval; +	return err;  } -EXPORT_SYMBOL_GPL(vsock_core_init); +EXPORT_SYMBOL_GPL(__vsock_core_init);  void vsock_core_exit(void)  { @@ -2002,5 +1997,5 @@ EXPORT_SYMBOL_GPL(vsock_core_exit);  MODULE_AUTHOR("VMware, Inc.");  MODULE_DESCRIPTION("VMware Virtual Socket Family"); -MODULE_VERSION("1.0.0.0-k"); +MODULE_VERSION("1.0.1.0-k");  MODULE_LICENSE("GPL v2"); diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 9d6986634e0..9bb63ffec4f 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -1746,8 +1746,6 @@ static int vmci_transport_dgram_dequeue(struct kiocb *kiocb,  	if (flags & MSG_OOB || flags & MSG_ERRQUEUE)  		return -EOPNOTSUPP; -	msg->msg_namelen = 0; -  	/* Retrieve the head sk_buff from the socket's receive queue. */  	err = 0;  	skb = skb_recv_datagram(&vsk->sk, flags, noblock, &err); @@ -1781,10 +1779,8 @@ static int vmci_transport_dgram_dequeue(struct kiocb *kiocb,  		goto out;  	if (msg->msg_name) { -		struct sockaddr_vm *vm_addr; -  		/* Provide the address of the sender. */ -		vm_addr = (struct sockaddr_vm *)msg->msg_name; +		DECLARE_SOCKADDR(struct sockaddr_vm *, vm_addr, msg->msg_name);  		vsock_addr_init(vm_addr, dg->src.context, dg->src.resource);  		msg->msg_namelen = sizeof(*vm_addr);  	} diff --git a/net/vmw_vsock/vmci_transport_notify.c b/net/vmw_vsock/vmci_transport_notify.c index 9a730744e7b..9b7f207f2be 100644 --- a/net/vmw_vsock/vmci_transport_notify.c +++ b/net/vmw_vsock/vmci_transport_notify.c @@ -315,7 +315,7 @@ vmci_transport_handle_wrote(struct sock *sk,  	struct vsock_sock *vsk = vsock_sk(sk);  	PKT_FIELD(vsk, sent_waiting_read) = false;  #endif -	sk->sk_data_ready(sk, 0); +	sk->sk_data_ready(sk);  }  static void vmci_transport_notify_pkt_socket_init(struct sock *sk) diff --git a/net/vmw_vsock/vmci_transport_notify_qstate.c b/net/vmw_vsock/vmci_transport_notify_qstate.c index 622bd7aa101..dc9c7929a2f 100644 --- a/net/vmw_vsock/vmci_transport_notify_qstate.c +++ b/net/vmw_vsock/vmci_transport_notify_qstate.c @@ -92,7 +92,7 @@ vmci_transport_handle_wrote(struct sock *sk,  			    bool bottom_half,  			    struct sockaddr_vm *dst, struct sockaddr_vm *src)  { -	sk->sk_data_ready(sk, 0); +	sk->sk_data_ready(sk);  }  static void vsock_block_update_write_window(struct sock *sk) @@ -290,7 +290,7 @@ vmci_transport_notify_pkt_recv_post_dequeue(  		/* See the comment in  		 * vmci_transport_notify_pkt_send_post_enqueue().  		 */ -		sk->sk_data_ready(sk, 0); +		sk->sk_data_ready(sk);  	}  	return err;  | 
