diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2007-11-05 14:16:33 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-11-05 14:16:33 -0800 |
| commit | 415ce0ef6489ac7513398e9d7c95b9861f3e0bc2 (patch) | |
| tree | 377bfafb816f661a61279a0cd9f10d42c0be8e5f /driver | |
| parent | 5c45c03d1238978f82561e680e78ca8888cce1e6 (diff) | |
| download | patches-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.patch | 152 | ||||
| -rw-r--r-- | driver/firmware-export-firmware_kset.patch | 2 | ||||
| -rw-r--r-- | driver/kobject-add-kobject_create_and_register-function.patch | 99 | ||||
| -rw-r--r-- | driver/kobject-kobj_attribute-handling.patch | 4 | ||||
| -rw-r--r-- | driver/kobject-warn.patch | 2 | ||||
| -rw-r--r-- | driver/kset-add-kset_create_and_register-function.patch | 29 | ||||
| -rw-r--r-- | driver/kset-convert-kernel_subsys-to-use-kset_create.patch | 2 | ||||
| -rw-r--r-- | driver/kset-convert-sys-hypervisor-to-use-kset_create.patch | 2 | ||||
| -rw-r--r-- | driver/kset-convert-sys-power-to-use-kset_create.patch | 2 | ||||
| -rw-r--r-- | driver/kset-convert-to-kobj_sysfs_ops.patch | 6 | ||||
| -rw-r--r-- | driver/kset-kill-subsys-attr.patch | 6 | ||||
| -rw-r--r-- | driver/kset-remove-decl_subsys-macro.patch | 2 | ||||
| -rw-r--r-- | driver/kset-remove-decl_subsys_name.patch | 2 |
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, \ } |
