diff options
-rw-r--r-- | kernel/livepatch/core.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index c5e631cd151b..c03c04637ec6 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c | |||
@@ -883,7 +883,7 @@ int klp_register_patch(struct klp_patch *patch) | |||
883 | } | 883 | } |
884 | EXPORT_SYMBOL_GPL(klp_register_patch); | 884 | EXPORT_SYMBOL_GPL(klp_register_patch); |
885 | 885 | ||
886 | static void klp_module_notify_coming(struct klp_patch *patch, | 886 | static int klp_module_notify_coming(struct klp_patch *patch, |
887 | struct klp_object *obj) | 887 | struct klp_object *obj) |
888 | { | 888 | { |
889 | struct module *pmod = patch->mod; | 889 | struct module *pmod = patch->mod; |
@@ -891,22 +891,23 @@ static void klp_module_notify_coming(struct klp_patch *patch, | |||
891 | int ret; | 891 | int ret; |
892 | 892 | ||
893 | ret = klp_init_object_loaded(patch, obj); | 893 | ret = klp_init_object_loaded(patch, obj); |
894 | if (ret) | 894 | if (ret) { |
895 | goto err; | 895 | pr_warn("failed to initialize patch '%s' for module '%s' (%d)\n", |
896 | pmod->name, mod->name, ret); | ||
897 | return ret; | ||
898 | } | ||
896 | 899 | ||
897 | if (patch->state == KLP_DISABLED) | 900 | if (patch->state == KLP_DISABLED) |
898 | return; | 901 | return 0; |
899 | 902 | ||
900 | pr_notice("applying patch '%s' to loading module '%s'\n", | 903 | pr_notice("applying patch '%s' to loading module '%s'\n", |
901 | pmod->name, mod->name); | 904 | pmod->name, mod->name); |
902 | 905 | ||
903 | ret = klp_enable_object(obj); | 906 | ret = klp_enable_object(obj); |
904 | if (!ret) | 907 | if (ret) |
905 | return; | 908 | pr_warn("failed to apply patch '%s' to module '%s' (%d)\n", |
906 | 909 | pmod->name, mod->name, ret); | |
907 | err: | 910 | return ret; |
908 | pr_warn("failed to apply patch '%s' to module '%s' (%d)\n", | ||
909 | pmod->name, mod->name, ret); | ||
910 | } | 911 | } |
911 | 912 | ||
912 | static void klp_module_notify_going(struct klp_patch *patch, | 913 | static void klp_module_notify_going(struct klp_patch *patch, |
@@ -930,6 +931,7 @@ disabled: | |||
930 | static int klp_module_notify(struct notifier_block *nb, unsigned long action, | 931 | static int klp_module_notify(struct notifier_block *nb, unsigned long action, |
931 | void *data) | 932 | void *data) |
932 | { | 933 | { |
934 | int ret; | ||
933 | struct module *mod = data; | 935 | struct module *mod = data; |
934 | struct klp_patch *patch; | 936 | struct klp_patch *patch; |
935 | struct klp_object *obj; | 937 | struct klp_object *obj; |
@@ -955,7 +957,12 @@ static int klp_module_notify(struct notifier_block *nb, unsigned long action, | |||
955 | 957 | ||
956 | if (action == MODULE_STATE_COMING) { | 958 | if (action == MODULE_STATE_COMING) { |
957 | obj->mod = mod; | 959 | obj->mod = mod; |
958 | klp_module_notify_coming(patch, obj); | 960 | ret = klp_module_notify_coming(patch, obj); |
961 | if (ret) { | ||
962 | obj->mod = NULL; | ||
963 | pr_warn("patch '%s' is in an inconsistent state!\n", | ||
964 | patch->mod->name); | ||
965 | } | ||
959 | } else /* MODULE_STATE_GOING */ | 966 | } else /* MODULE_STATE_GOING */ |
960 | klp_module_notify_going(patch, obj); | 967 | klp_module_notify_going(patch, obj); |
961 | 968 | ||