Merge tag 'livepatching-for-6.1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / kernel / livepatch / core.c
index ec06ce59d7283b4696d607f9025b39e618c30ee3..9ada0bc5247be5de41c3c21476b1dd2cd9f20a9a 100644 (file)
@@ -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;
        }