diff options
Diffstat (limited to 'net/vmw_vsock/af_vsock.c')
| -rw-r--r-- | net/vmw_vsock/af_vsock.c | 49 | 
1 files changed, 22 insertions, 27 deletions
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");  | 
