static int __vsock_core_init(void) { int err; vsock_init_tables(); err = misc_register(&vsock_device); if (err) { pr_err("Failed to register misc device\n"); return -ENOENT; } err = proto_register(&vsock_proto, 1); /* we want our slab */ if (err) { pr_err("Cannot register vsock protocol\n"); goto err_misc_deregister; } err = sock_register(&vsock_family_ops); if (err) { pr_err("could not register af_vsock (%d) address family: %d\n", AF_VSOCK, err); goto err_unregister_proto; } 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, struct module *owner) { 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(); vsock_device.minor = MISC_DYNAMIC_MINOR; err = misc_register(&vsock_device); if (err) { pr_err("Failed to register misc device\n"); goto err_reset_transport; } err = proto_register(&vsock_proto, 1); /* we want our slab */ if (err) { pr_err("Cannot register vsock protocol\n"); goto err_deregister_misc; } err = sock_register(&vsock_family_ops); if (err) { pr_err("could not register af_vsock (%d) address family: %d\n", AF_VSOCK, err); goto err_unregister_proto; } mutex_unlock(&vsock_register_mutex); return 0; err_unregister_proto: proto_unregister(&vsock_proto); err_deregister_misc: misc_deregister(&vsock_device); err_reset_transport: transport = NULL; err_busy: mutex_unlock(&vsock_register_mutex); return err; }