diff options
Diffstat (limited to 'kernel/livepatch/core.c')
| -rw-r--r-- | kernel/livepatch/core.c | 20 | 
1 files changed, 19 insertions, 1 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index ec06ce59d728..9ada0bc5247b 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -325,6 +325,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,   * /sys/kernel/livepatch/<patch>/transition   * /sys/kernel/livepatch/<patch>/force   * /sys/kernel/livepatch/<patch>/<object> + * /sys/kernel/livepatch/<patch>/<object>/patched   * /sys/kernel/livepatch/<patch>/<object>/<function,sympos>   */  static int __klp_disable_patch(struct klp_patch *patch); @@ -431,6 +432,22 @@ static struct attribute *klp_patch_attrs[] = {  };  ATTRIBUTE_GROUPS(klp_patch); +static ssize_t patched_show(struct kobject *kobj, +			    struct kobj_attribute *attr, char *buf) +{ +	struct klp_object *obj; + +	obj = container_of(kobj, struct klp_object, kobj); +	return sysfs_emit(buf, "%d\n", obj->patched); +} + +static struct kobj_attribute patched_kobj_attr = __ATTR_RO(patched); +static struct attribute *klp_object_attrs[] = { +	&patched_kobj_attr.attr, +	NULL, +}; +ATTRIBUTE_GROUPS(klp_object); +  static void klp_free_object_dynamic(struct klp_object *obj)  {  	kfree(obj->name); @@ -576,6 +593,7 @@ static void klp_kobj_release_object(struct kobject *kobj)  static struct kobj_type klp_ktype_object = {  	.release = klp_kobj_release_object,  	.sysfs_ops = &kobj_sysfs_ops, +	.default_groups = klp_object_groups,  };  static void klp_kobj_release_func(struct kobject *kobj) @@ -1171,7 +1189,7 @@ int klp_module_coming(struct module *mod)  		return -EINVAL;  	if (!strcmp(mod->name, "vmlinux")) { -		pr_err("vmlinux.ko: invalid module name"); +		pr_err("vmlinux.ko: invalid module name\n");  		return -EINVAL;  	}  |