aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2007-11-05 14:16:33 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2007-11-05 14:16:33 -0800
commit415ce0ef6489ac7513398e9d7c95b9861f3e0bc2 (patch)
tree377bfafb816f661a61279a0cd9f10d42c0be8e5f /driver
parent5c45c03d1238978f82561e680e78ca8888cce1e6 (diff)
downloadpatches-415ce0ef6489ac7513398e9d7c95b9861f3e0bc2.tar.gz
fix some bugs with kobjects having kset for a parent and add some new patches
Diffstat (limited to 'driver')
-rw-r--r--driver/firmware-change-firmware_kset-to-firmware_kobj.patch152
-rw-r--r--driver/firmware-export-firmware_kset.patch2
-rw-r--r--driver/kobject-add-kobject_create_and_register-function.patch99
-rw-r--r--driver/kobject-kobj_attribute-handling.patch4
-rw-r--r--driver/kobject-warn.patch2
-rw-r--r--driver/kset-add-kset_create_and_register-function.patch29
-rw-r--r--driver/kset-convert-kernel_subsys-to-use-kset_create.patch2
-rw-r--r--driver/kset-convert-sys-hypervisor-to-use-kset_create.patch2
-rw-r--r--driver/kset-convert-sys-power-to-use-kset_create.patch2
-rw-r--r--driver/kset-convert-to-kobj_sysfs_ops.patch6
-rw-r--r--driver/kset-kill-subsys-attr.patch6
-rw-r--r--driver/kset-remove-decl_subsys-macro.patch2
-rw-r--r--driver/kset-remove-decl_subsys_name.patch2
13 files changed, 290 insertions, 20 deletions
diff --git a/driver/firmware-change-firmware_kset-to-firmware_kobj.patch b/driver/firmware-change-firmware_kset-to-firmware_kobj.patch
new file mode 100644
index 00000000000000..731715fbd551e5
--- /dev/null
+++ b/driver/firmware-change-firmware_kset-to-firmware_kobj.patch
@@ -0,0 +1,152 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Mon, 5 Nov 2007 13:16:15 -0800
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: firmware: change firmware_kset to firmware_kobj
+
+There is no firmware "subsystem" it's just a directory in /sys that
+other portions of the kernel want to hook into. So make it a kobject
+not a kset to help alivate anyone who tries to do some odd kset-like
+things with this.
+
+Cc: Kay Sievers <kay.sievers@vrfy.org>
+Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/s390/kernel/ipl.c | 10 +++++-----
+ drivers/acpi/bus.c | 4 ++--
+ drivers/base/firmware.c | 16 ++++++++++------
+ drivers/firmware/edd.c | 2 +-
+ drivers/firmware/efivars.c | 2 +-
+ drivers/parisc/pdc_stable.c | 4 ++--
+ include/linux/kobject.h | 4 ++--
+ 7 files changed, 23 insertions(+), 19 deletions(-)
+
+--- a/arch/s390/kernel/ipl.c
++++ b/arch/s390/kernel/ipl.c
+@@ -856,7 +856,7 @@ static int __init ipl_init(void)
+ {
+ int rc;
+
+- ipl_kset = kset_create_and_register("ipl", NULL, NULL, firmware_kset);
++ ipl_kset = kset_create_and_register("ipl", NULL, firmware_kobj, NULL);
+ if (IS_ERR(ipl_kset))
+ return PTR_ERR(ipl_kset);
+ switch (ipl_info.type) {
+@@ -975,7 +975,7 @@ static int __init reipl_init(void)
+ {
+ int rc;
+
+- reipl_kset = kset_create_and_register("reipl", NULL, NULL, firmware_kset);
++ reipl_kset = kset_create_and_register("reipl", NULL, firmware_kobj, NULL);
+ if (IS_ERR(reipl_kset))
+ return PTR_ERR(reipl_kset);
+ rc = sysfs_create_file(&reipl_kset->kobj, &reipl_type_attr.attr);
+@@ -1064,7 +1064,7 @@ static int __init dump_init(void)
+ {
+ int rc;
+
+- dump_kset = kset_create_and_register("dump", NULL, NULL, firmware_kset);
++ dump_kset = kset_create_and_register("dump", NULL, firmware_kobj, NULL);
+ if (IS_ERR(dump_kset))
+ return PTR_ERR(dump_kset);
+ rc = sysfs_create_file(&dump_kset->kobj, &dump_type_attr);
+@@ -1087,8 +1087,8 @@ static int __init shutdown_actions_init(
+ int rc;
+
+ shutdown_actions_kset = kset_create_and_register("shutdown_actions",
+- NULL, NULL,
+- firmware_kset);
++ NULL, firmware_kobj,
++ NULL);
+ if (IS_ERR(shutdown_actions_kset))
+ return PTR_ERR(shutdown_actions_kset);
+ rc = sysfs_create_file(&shutdown_actions_kset->kobj, &on_panic_attr);
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -756,8 +756,8 @@ static int __init acpi_init(void)
+ return -ENODEV;
+ }
+
+- acpi_kset = kset_create_and_register("acpi", NULL, NULL,
+- firmware_kset);
++ acpi_kset = kset_create_and_register("acpi", NULL, firmware_kobj,
++ NULL);
+ if (IS_ERR(acpi_kset)) {
+ result = PTR_ERR(acpi_kset);
+ printk(KERN_WARNING "%s: kset create error: %d\n",
+--- a/drivers/base/firmware.c
++++ b/drivers/base/firmware.c
+@@ -16,13 +16,17 @@
+
+ #include "base.h"
+
+-struct kset *firmware_kset;
+-EXPORT_SYMBOL_GPL(firmware_kset);
++struct kobject *firmware_kobj;
++EXPORT_SYMBOL_GPL(firmware_kobj);
+
+ int __init firmware_init(void)
+ {
+- firmware_kset = kset_create_and_register("firmware", NULL, NULL, NULL);
+- if (IS_ERR(firmware_kset))
+- return PTR_ERR(firmware_kset);
+- return 0;
++ int retval = 0;
++
++ firmware_kobj = kobject_create_and_register("firmware", NULL);
++ if (IS_ERR(firmware_kobj)) {
++ retval = PTR_ERR(firmware_kobj);
++ firmware_kobj = NULL;
++ }
++ return retval;
+ }
+--- a/drivers/firmware/edd.c
++++ b/drivers/firmware/edd.c
+@@ -756,7 +756,7 @@ edd_init(void)
+ return 1;
+ }
+
+- edd_kset = kset_create_and_register("edd", NULL, NULL, firmware_kset);
++ edd_kset = kset_create_and_register("edd", NULL, firmware_kobj, NULL);
+ if (IS_ERR(edd_kset))
+ return PTR_ERR(edd_kset);
+
+--- a/drivers/firmware/efivars.c
++++ b/drivers/firmware/efivars.c
+@@ -539,7 +539,7 @@ efivars_init(void)
+ /*
+ * For now we'll register the efi subsys within this driver
+ */
+- efi_kset = kset_create_and_register("efi", NULL, NULL, firmware_kset);
++ efi_kset = kset_create_and_register("efi", NULL, firmware_kobj, NULL);
+ if (IS_ERR(efi_kset)) {
+ error = PTR_ERR(efi_kset);
+ printk(KERN_ERR "efivars: Firmware registration failed with error %d.\n", error);
+--- a/drivers/parisc/pdc_stable.c
++++ b/drivers/parisc/pdc_stable.c
+@@ -1059,8 +1059,8 @@ pdc_stable_init(void)
+ pdcs_osid = (u16)(result >> 16);
+
+ /* For now we'll register the stable kset within this driver */
+- stable_kset = kset_create_and_register("stable", NULL, NULL,
+- firmware_kset);
++ stable_kset = kset_create_and_register("stable", NULL, firmware_kobj,
++ NULL);
+ if (IS_ERR(stable_kset)) {
+ rc = PTR_ERR(stable_kset);
+ goto fail_firmreg;
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -207,8 +207,8 @@ extern struct kset *kernel_kset;
+ extern struct kset *hypervisor_kset;
+ /* The global /sys/power/ kset for people to chain off of */
+ extern struct kset *power_kset;
+-/* The global /sys/firmware/ kset for people to chain off of */
+-extern struct kset *firmware_kset;
++/* The global /sys/firmware/ kobject for people to chain off of */
++extern struct kobject *firmware_kobj;
+
+ extern int __must_check subsystem_register(struct kset *);
+ extern void subsystem_unregister(struct kset *);
diff --git a/driver/firmware-export-firmware_kset.patch b/driver/firmware-export-firmware_kset.patch
index f5ca47344ed40a..34f658389ed6c1 100644
--- a/driver/firmware-export-firmware_kset.patch
+++ b/driver/firmware-export-firmware_kset.patch
@@ -33,7 +33,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
{
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -204,6 +204,8 @@ extern struct kset *kernel_kset;
+@@ -207,6 +207,8 @@ extern struct kset *kernel_kset;
extern struct kset *hypervisor_kset;
/* The global /sys/power/ kset for people to chain off of */
extern struct kset *power_kset;
diff --git a/driver/kobject-add-kobject_create_and_register-function.patch b/driver/kobject-add-kobject_create_and_register-function.patch
new file mode 100644
index 00000000000000..bcebf61fc61de0
--- /dev/null
+++ b/driver/kobject-add-kobject_create_and_register-function.patch
@@ -0,0 +1,99 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Mon, 5 Nov 2007 13:16:15 -0800
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: kobject: add kobject_create_and_register function
+
+This lets users create dynamic kobjects much easier.
+
+Cc: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/linux/kobject.h | 3 ++
+ lib/kobject.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 65 insertions(+)
+
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -84,6 +84,9 @@ extern void kobject_cleanup(struct kobje
+ extern int __must_check kobject_add(struct kobject *);
+ extern void kobject_del(struct kobject *);
+
++extern struct kobject * __must_check kobject_create_and_register
++ (const char *name, struct kobject *parent);
++
+ extern int __must_check kobject_rename(struct kobject *, const char *new_name);
+ extern int __must_check kobject_move(struct kobject *, struct kobject *);
+
+--- a/lib/kobject.c
++++ b/lib/kobject.c
+@@ -553,6 +553,68 @@ struct kobject *kobject_add_dir(struct k
+ return kobject_kset_add_dir(NULL, parent, name);
+ }
+
++static void dynamic_kobj_release(struct kobject *kobj)
++{
++ pr_debug("freeing %s\n", kobject_name(kobj));
++ kfree(kobj);
++}
++
++static struct kobj_type dynamic_kobj_ktype = {
++ .release = dynamic_kobj_release,
++};
++
++/**
++ * kobject_create - create a struct kobject dynamically
++ *
++ * @name: the name for the kset
++ * @parent: the parent kobject of this kobject, if any.
++ *
++ * This function creates a kobject structure dynamically and sets it up
++ * to be a "dynamic" kobject with a default release function set up.
++ */
++static struct kobject *kobject_create(const char *name, struct kobject *parent)
++{
++ struct kobject *kobj;
++
++ kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
++ if (!kobj)
++ return ERR_PTR(-ENOMEM);
++
++ kobject_set_name(kobj, name);
++ kobj->ktype = &dynamic_kobj_ktype;
++ return kobj;
++}
++
++/**
++ * kobject_create_and_register - create a struct kobject dynamically and register it with sysfs
++ *
++ * @name: the name for the kset
++ * @parent: the parent kobject of this kobject, if any.
++ *
++ * This function creates a kset structure dynamically and registers it
++ * with sysfs. When you are finished with this structure, call
++ * kobject_unregister() and the structure will be dynamically freed when
++ * it is no longer being used.
++ */
++struct kobject *kobject_create_and_register(const char *name,
++ struct kobject *parent)
++{
++ struct kobject *kobj;
++ int retval;
++
++ kobj = kobject_create(name, parent);
++ if (IS_ERR(kobj))
++ return kobj;
++
++ retval = kobject_register(kobj);
++ if (retval) {
++ kfree(kobj);
++ return ERR_PTR(retval);
++ }
++ return kobj;
++}
++EXPORT_SYMBOL_GPL(kobject_create_and_register);
++
+ /**
+ * kset_init - initialize a kset for use
+ * @k: kset
diff --git a/driver/kobject-kobj_attribute-handling.patch b/driver/kobject-kobj_attribute-handling.patch
index b5d6563e4e9d8c..b29321c235de5e 100644
--- a/driver/kobject-kobj_attribute-handling.patch
+++ b/driver/kobject-kobj_attribute-handling.patch
@@ -22,7 +22,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -119,6 +119,16 @@ struct kset_uevent_ops {
+@@ -122,6 +122,16 @@ struct kset_uevent_ops {
struct kobj_uevent_env *env);
};
@@ -41,7 +41,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
*
--- a/lib/kobject.c
+++ b/lib/kobject.c
-@@ -486,6 +486,35 @@ void kobject_put(struct kobject * kobj)
+@@ -493,6 +493,35 @@ void kobject_put(struct kobject * kobj)
kref_put(&kobj->kref, kobject_release);
}
diff --git a/driver/kobject-warn.patch b/driver/kobject-warn.patch
index 1ceaabec0e40eb..f71da93c3711dc 100644
--- a/driver/kobject-warn.patch
+++ b/driver/kobject-warn.patch
@@ -33,7 +33,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
kref_init(&kobj->kref);
INIT_LIST_HEAD(&kobj->entry);
kobj->kset = kset_get(kobj->kset);
-@@ -463,6 +464,10 @@ void kobject_cleanup(struct kobject * ko
+@@ -470,6 +471,10 @@ void kobject_cleanup(struct kobject * ko
* not a statically allocated kobject, so we should be safe to
* free the name */
kfree(name);
diff --git a/driver/kset-add-kset_create_and_register-function.patch b/driver/kset-add-kset_create_and_register-function.patch
index 5b2ea63149a206..a6bdad1e07c3cc 100644
--- a/driver/kset-add-kset_create_and_register-function.patch
+++ b/driver/kset-add-kset_create_and_register-function.patch
@@ -8,16 +8,18 @@ Now ksets can be dynamically created on the fly, no static definitions
are required. Thanks to Miklos for hints on how to make this work
better for the callers.
-And thanks to Kay for finding some stupid bugs in my original version.
+And thanks to Kay for finding some stupid bugs in my original version
+and pointing out that we need to handle the fact that kobject's can have
+a kset as a parent and to handle that properly in kobject_add().
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
- include/linux/kobject.h | 5 ++
- lib/kobject.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 95 insertions(+), 1 deletion(-)
+ include/linux/kobject.h | 5 +-
+ lib/kobject.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 103 insertions(+), 2 deletions(-)
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -47,7 +49,24 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
#include <linux/string.h>
#include <linux/module.h>
#include <linux/stat.h>
-@@ -660,6 +661,96 @@ int subsys_create_file(struct kset *s, s
+@@ -186,8 +187,15 @@ int kobject_add(struct kobject * kobj)
+ if (kobj->kset) {
+ spin_lock(&kobj->kset->list_lock);
+
+- if (!parent)
++ if (!parent) {
+ parent = kobject_get(&kobj->kset->kobj);
++ /*
++ * If the kset is our parent, get a second
++ * reference, we drop both the kset and the
++ * parent ref on cleanup
++ */
++ kobject_get(parent);
++ }
+
+ list_add_tail(&kobj->entry,&kobj->kset->list);
+ spin_unlock(&kobj->kset->list_lock);
+@@ -660,6 +668,96 @@ int subsys_create_file(struct kset *s, s
return error;
}
diff --git a/driver/kset-convert-kernel_subsys-to-use-kset_create.patch b/driver/kset-convert-kernel_subsys-to-use-kset_create.patch
index c99cb941e1b030..a2ad16c7024a01 100644
--- a/driver/kset-convert-kernel_subsys-to-use-kset_create.patch
+++ b/driver/kset-convert-kernel_subsys-to-use-kset_create.patch
@@ -68,7 +68,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
printk(KERN_WARNING "%s: can not create kset %d\n",
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -188,8 +188,8 @@ struct kset _name##_subsys = { \
+@@ -191,8 +191,8 @@ struct kset _name##_subsys = { \
.uevent_ops =_uevent_ops, \
}
diff --git a/driver/kset-convert-sys-hypervisor-to-use-kset_create.patch b/driver/kset-convert-sys-hypervisor-to-use-kset_create.patch
index bf598d89df0836..9e97af3f8b0602 100644
--- a/driver/kset-convert-sys-hypervisor-to-use-kset_create.patch
+++ b/driver/kset-convert-sys-hypervisor-to-use-kset_create.patch
@@ -62,7 +62,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
}
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -190,8 +190,8 @@ struct kset _name##_subsys = { \
+@@ -193,8 +193,8 @@ struct kset _name##_subsys = { \
/* The global /sys/kernel/ kset for people to chain off of */
extern struct kset *kernel_kset;
diff --git a/driver/kset-convert-sys-power-to-use-kset_create.patch b/driver/kset-convert-sys-power-to-use-kset_create.patch
index d9ac4516018327..78bc2acd20d3a5 100644
--- a/driver/kset-convert-sys-power-to-use-kset_create.patch
+++ b/driver/kset-convert-sys-power-to-use-kset_create.patch
@@ -88,7 +88,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
#endif
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -192,6 +192,8 @@ struct kset _name##_subsys = { \
+@@ -195,6 +195,8 @@ struct kset _name##_subsys = { \
extern struct kset *kernel_kset;
/* The global /sys/hypervisor/ kset for people to chain off of */
extern struct kset *hypervisor_kset;
diff --git a/driver/kset-convert-to-kobj_sysfs_ops.patch b/driver/kset-convert-to-kobj_sysfs_ops.patch
index 170fd5f634e8f2..810d022b769d7f 100644
--- a/driver/kset-convert-to-kobj_sysfs_ops.patch
+++ b/driver/kset-convert-to-kobj_sysfs_ops.patch
@@ -246,7 +246,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
.mode = 0644, \
--- a/lib/kobject.c
+++ b/lib/kobject.c
-@@ -522,9 +522,8 @@ static void dir_release(struct kobject *
+@@ -529,9 +529,8 @@ static void dir_release(struct kobject *
}
static struct kobj_type dir_ktype = {
@@ -257,7 +257,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
};
/**
-@@ -697,7 +696,8 @@ static void kset_release(struct kobject
+@@ -766,7 +765,8 @@ static void kset_release(struct kobject
kfree(kset);
}
@@ -267,7 +267,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
.release = kset_release,
};
-@@ -739,7 +739,7 @@ static struct kset *kset_create(const ch
+@@ -808,7 +808,7 @@ static struct kset *kset_create(const ch
kset->uevent_ops = uevent_ops;
kset->kobj.parent = parent_kobj;
kset->kobj.kset = parent_kset;
diff --git a/driver/kset-kill-subsys-attr.patch b/driver/kset-kill-subsys-attr.patch
index 5bd0f925f676e5..7ab62f1b2077b5 100644
--- a/driver/kset-kill-subsys-attr.patch
+++ b/driver/kset-kill-subsys-attr.patch
@@ -109,7 +109,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* The inode's perms must say it's ok,
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -210,15 +210,6 @@ extern struct kset *firmware_kset;
+@@ -213,15 +213,6 @@ extern struct kset *firmware_kset;
extern int __must_check subsystem_register(struct kset *);
extern void subsystem_unregister(struct kset *);
@@ -127,7 +127,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
--- a/lib/kobject.c
+++ b/lib/kobject.c
-@@ -669,26 +669,6 @@ void subsystem_unregister(struct kset *s
+@@ -738,26 +738,6 @@ void subsystem_unregister(struct kset *s
kset_unregister(s);
}
@@ -154,7 +154,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
static void kset_release(struct kobject *kobj)
{
struct kset *kset = container_of(kobj, struct kset, kobj);
-@@ -793,4 +773,3 @@ EXPORT_SYMBOL(kset_unregister);
+@@ -862,4 +842,3 @@ EXPORT_SYMBOL(kset_unregister);
EXPORT_SYMBOL(subsystem_register);
EXPORT_SYMBOL(subsystem_unregister);
diff --git a/driver/kset-remove-decl_subsys-macro.patch b/driver/kset-remove-decl_subsys-macro.patch
index 65cc4349b6c34d..609c49fa5c4256 100644
--- a/driver/kset-remove-decl_subsys-macro.patch
+++ b/driver/kset-remove-decl_subsys-macro.patch
@@ -40,7 +40,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
{
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -192,12 +192,6 @@ extern struct kobject * kset_find_obj(st
+@@ -195,12 +195,6 @@ extern struct kobject * kset_find_obj(st
#define set_kset_name(str) .kset = { .kobj = { .k_name = str } }
diff --git a/driver/kset-remove-decl_subsys_name.patch b/driver/kset-remove-decl_subsys_name.patch
index 90beae187c5fd8..5df1cd19f8c91b 100644
--- a/driver/kset-remove-decl_subsys_name.patch
+++ b/driver/kset-remove-decl_subsys_name.patch
@@ -18,7 +18,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -187,11 +187,6 @@ struct kset _name##_subsys = { \
+@@ -190,11 +190,6 @@ struct kset _name##_subsys = { \
.kobj = { .k_name = __stringify(_name) }, \
.uevent_ops =_uevent_ops, \
}