The correct cleanup function after a call to kobject_init_and_add() has succeeded is kobject_del() _not_ kobject_put(). kobject_del() calls kobject_put(). Use correct cleanup function when removing a kobject. Signed-off-by: Tobin C. Harding <tobin@xxxxxxxxxx> --- kernel/livepatch/core.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 98a7bec41faa..4cce6bb6e073 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -589,9 +589,8 @@ static void __klp_free_funcs(struct klp_object *obj, bool nops_only) list_del(&func->node); - /* Might be called from klp_init_patch() error path. */ if (func->kobj_added) { - kobject_put(&func->kobj); + kobject_del(&func->kobj); } else if (func->nop) { klp_free_func_nop(func); } @@ -625,9 +624,8 @@ static void __klp_free_objects(struct klp_patch *patch, bool nops_only) list_del(&obj->node); - /* Might be called from klp_init_patch() error path. */ if (obj->kobj_added) { - kobject_put(&obj->kobj); + kobject_del(&obj->kobj); } else if (obj->dynamic) { klp_free_object_dynamic(obj); } @@ -676,7 +674,7 @@ static void klp_free_patch_finish(struct klp_patch *patch) * cannot get enabled again. */ if (patch->kobj_added) { - kobject_put(&patch->kobj); + kobject_del(&patch->kobj); wait_for_completion(&patch->finish); } -- 2.21.0