On Thu, 29 Nov 2018, Petr Mladek wrote:

> -static int klp_init_patch(struct klp_patch *patch)
> +/* Init operations that must succeed before klp_free_patch() can be called. 
> */
> +static int klp_init_patch_before_free(struct klp_patch *patch)

There is no klp_free_patch() now, so the comment is not correct. Also I 
don't know if the function name is ideal, but I don't have a better one.

>  {
>       struct klp_object *obj;
> -     int ret;
> +     struct klp_func *func;
>  
>       if (!patch->objs)
>               return -EINVAL;
>  
> -     mutex_lock(&klp_mutex);
> -
> +     INIT_LIST_HEAD(&patch->list);
> +     patch->kobj_alive = false;
>       patch->enabled = false;
>       init_completion(&patch->finish);
>  
> -     ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> -                                klp_root_kobj, "%s", patch->mod->name);
> +     klp_for_each_object(patch, obj) {
> +             if (!obj->funcs)
> +                     return -EINVAL;
> +
> +             obj->kobj_alive = false;
> +
> +             klp_for_each_func(obj, func)
> +                     func->kobj_alive = false;
> +     }
> +
> +     return 0;
> +}
> +
> +static int klp_init_patch(struct klp_patch *patch)
> +{
> +     struct klp_object *obj;
> +     int ret;
> +
> +     mutex_lock(&klp_mutex);
> +
> +     ret = klp_init_patch_before_free(patch);
>       if (ret) {
>               mutex_unlock(&klp_mutex);
>               return ret;
>       }
>  
> +     ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> +                                klp_root_kobj, "%s", patch->mod->name);
> +     if (ret)
> +             goto free;

Is this intentional? It should be sufficient (and it was before the patch) to
unlock the mutex and return ret. We do not need to free anything here. Only
klp_patch instance was initialized and that is all.

Otherwise it looks good. kobj_alive feels safer than state_initialized.

Thanks,
Miroslav

Reply via email to