From: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> This allows to support per-container connector creation and destruction.
Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> Reviewed-by: Andrey Ryabinin <aryabi...@virtuozzo.com> (cherry picked from vz8 commit 32c1390b702c4842360db8ae6690285786a06a95) Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> --- drivers/connector/cn_proc.c | 18 ------------------ drivers/connector/connector.c | 29 ++++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index c2f9d31305c1..a73d074ef488 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c @@ -369,21 +369,3 @@ void cn_proc_fini_ve(struct ve_struct *ve) { cn_del_callback_ve(ve, &cn_proc_event_id); } - -/* - * cn_proc_init - initialization entry point - * - * Adds the connector callback to the connector driver. - */ -static int __init cn_proc_init(void) -{ - int err = cn_add_callback(&cn_proc_event_id, - "cn_proc", - &cn_proc_mcast_ctl); - if (err) { - pr_warn("cn_proc failed to register\n"); - return err; - } - return 0; -} -device_initcall(cn_proc_init); diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index ff1d89b2ba5e..ddb690e901d7 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -297,22 +297,39 @@ static int cn_init_ve(struct ve_struct *ve) err = -EIO; dev->nls = netlink_kernel_create(net, NETLINK_CONNECTOR, &cfg); if (!dev->nls) - goto net_unlock; + goto free_cn; err = -EINVAL; dev->cbdev = cn_queue_alloc_dev("cqueue", dev->nls); if (!dev->cbdev) { - netlink_kernel_release(dev->nls); - goto net_unlock; + goto netlink_release; } ve->cn->cn_already_initialized = 1; - proc_create_single("connector", S_IRUGO, net->proc_net, cn_proc_show); - err = 0; + if (!proc_create_single("connector", S_IRUGO, net->proc_net, + cn_proc_show)) { + err = -ENOMEM; + goto free_cdev; + } + + err = cn_proc_init_ve(ve); + if (err) + goto remove_proc; net_unlock: return err; + +remove_proc: + remove_proc_entry("connector", net->proc_net); +free_cdev: + cn_queue_free_dev(dev->cbdev); +netlink_release: + netlink_kernel_release(dev->nls); +free_cn: + kfree(ve->cn); + ve->cn = NULL; + goto net_unlock; } static void cn_fini_ve(struct ve_struct *ve) @@ -322,6 +339,8 @@ static void cn_fini_ve(struct ve_struct *ve) ve->cn->cn_already_initialized = 0; + cn_proc_fini_ve(ve); + /* * This is a hook called on ve stop, ve->ve_ns will be destroyed * later in the same thread, parallel ve stop is impossible, -- 2.31.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel