|
@@ -1925,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();
|
|
|
|
|
@@ -1951,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)
|
|
|
{
|
|
@@ -2000,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");
|