diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-12 18:34:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-12 18:34:33 -0400 |
commit | f5ad50100680bfe7d2702d2487d303ee122bf5f7 (patch) | |
tree | 2d43dc7098d556a21b0445c02082b7c32093f080 | |
parent | b3dfd76c945b879513b991bac23ffcb97fe88ec2 (diff) | |
parent | 282029c005e65ffdce3aa9f8220f88a8bbbc4dae (diff) |
Merge tag 'driver-core-3.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
Pull driver core and kobject fixes from Greg KH:
"Here are some minor fixes for the driver core and kobjects that people
have reported recently.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>"
* tag 'driver-core-3.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
kobject: provide more diagnostic info for kobject_add_internal() failures
sysfs: handle 'parent deleted before child added'
sysfs: Prevent crash on unset sysfs group attributes
sysfs: Update the name hash for an entry after changing the namespace
drivers/base: fix compiler warning in SoC export driver - idr should be ida
drivers/base: Remove unneeded spin_lock_init call for soc_lock
-rw-r--r-- | drivers/base/soc.c | 4 | ||||
-rw-r--r-- | fs/sysfs/dir.c | 5 | ||||
-rw-r--r-- | fs/sysfs/group.c | 6 | ||||
-rw-r--r-- | lib/kobject.c | 14 |
4 files changed, 17 insertions, 12 deletions
diff --git a/drivers/base/soc.c b/drivers/base/soc.c index 05f150382da8..ba29b2e73d48 100644 --- a/drivers/base/soc.c +++ b/drivers/base/soc.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/sys_soc.h> | 15 | #include <linux/sys_soc.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | 17 | ||
18 | static DEFINE_IDR(soc_ida); | 18 | static DEFINE_IDA(soc_ida); |
19 | static DEFINE_SPINLOCK(soc_lock); | 19 | static DEFINE_SPINLOCK(soc_lock); |
20 | 20 | ||
21 | static ssize_t soc_info_get(struct device *dev, | 21 | static ssize_t soc_info_get(struct device *dev, |
@@ -168,8 +168,6 @@ void soc_device_unregister(struct soc_device *soc_dev) | |||
168 | 168 | ||
169 | static int __init soc_bus_register(void) | 169 | static int __init soc_bus_register(void) |
170 | { | 170 | { |
171 | spin_lock_init(&soc_lock); | ||
172 | |||
173 | return bus_register(&soc_bus_type); | 171 | return bus_register(&soc_bus_type); |
174 | } | 172 | } |
175 | core_initcall(soc_bus_register); | 173 | core_initcall(soc_bus_register); |
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 2a7a3f5d1ca6..35a36d39fa2c 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -729,6 +729,9 @@ int sysfs_create_dir(struct kobject * kobj) | |||
729 | else | 729 | else |
730 | parent_sd = &sysfs_root; | 730 | parent_sd = &sysfs_root; |
731 | 731 | ||
732 | if (!parent_sd) | ||
733 | return -ENOENT; | ||
734 | |||
732 | if (sysfs_ns_type(parent_sd)) | 735 | if (sysfs_ns_type(parent_sd)) |
733 | ns = kobj->ktype->namespace(kobj); | 736 | ns = kobj->ktype->namespace(kobj); |
734 | type = sysfs_read_ns_type(kobj); | 737 | type = sysfs_read_ns_type(kobj); |
@@ -878,7 +881,6 @@ int sysfs_rename(struct sysfs_dirent *sd, | |||
878 | 881 | ||
879 | dup_name = sd->s_name; | 882 | dup_name = sd->s_name; |
880 | sd->s_name = new_name; | 883 | sd->s_name = new_name; |
881 | sd->s_hash = sysfs_name_hash(sd->s_ns, sd->s_name); | ||
882 | } | 884 | } |
883 | 885 | ||
884 | /* Move to the appropriate place in the appropriate directories rbtree. */ | 886 | /* Move to the appropriate place in the appropriate directories rbtree. */ |
@@ -886,6 +888,7 @@ int sysfs_rename(struct sysfs_dirent *sd, | |||
886 | sysfs_get(new_parent_sd); | 888 | sysfs_get(new_parent_sd); |
887 | sysfs_put(sd->s_parent); | 889 | sysfs_put(sd->s_parent); |
888 | sd->s_ns = new_ns; | 890 | sd->s_ns = new_ns; |
891 | sd->s_hash = sysfs_name_hash(sd->s_ns, sd->s_name); | ||
889 | sd->s_parent = new_parent_sd; | 892 | sd->s_parent = new_parent_sd; |
890 | sysfs_link_sibling(sd); | 893 | sysfs_link_sibling(sd); |
891 | 894 | ||
diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c index dd1701caecc9..2df555c66d57 100644 --- a/fs/sysfs/group.c +++ b/fs/sysfs/group.c | |||
@@ -67,7 +67,11 @@ static int internal_create_group(struct kobject *kobj, int update, | |||
67 | /* Updates may happen before the object has been instantiated */ | 67 | /* Updates may happen before the object has been instantiated */ |
68 | if (unlikely(update && !kobj->sd)) | 68 | if (unlikely(update && !kobj->sd)) |
69 | return -EINVAL; | 69 | return -EINVAL; |
70 | 70 | if (!grp->attrs) { | |
71 | WARN(1, "sysfs: attrs not set by subsystem for group: %s/%s\n", | ||
72 | kobj->name, grp->name ? "" : grp->name); | ||
73 | return -EINVAL; | ||
74 | } | ||
71 | if (grp->name) { | 75 | if (grp->name) { |
72 | error = sysfs_create_subdir(kobj, grp->name, &sd); | 76 | error = sysfs_create_subdir(kobj, grp->name, &sd); |
73 | if (error) | 77 | if (error) |
diff --git a/lib/kobject.c b/lib/kobject.c index 21dee7c19afd..aeefa8bc8b1c 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -192,14 +192,14 @@ static int kobject_add_internal(struct kobject *kobj) | |||
192 | 192 | ||
193 | /* be noisy on error issues */ | 193 | /* be noisy on error issues */ |
194 | if (error == -EEXIST) | 194 | if (error == -EEXIST) |
195 | printk(KERN_ERR "%s failed for %s with " | 195 | WARN(1, "%s failed for %s with " |
196 | "-EEXIST, don't try to register things with " | 196 | "-EEXIST, don't try to register things with " |
197 | "the same name in the same directory.\n", | 197 | "the same name in the same directory.\n", |
198 | __func__, kobject_name(kobj)); | 198 | __func__, kobject_name(kobj)); |
199 | else | 199 | else |
200 | printk(KERN_ERR "%s failed for %s (%d)\n", | 200 | WARN(1, "%s failed for %s (error: %d parent: %s)\n", |
201 | __func__, kobject_name(kobj), error); | 201 | __func__, kobject_name(kobj), error, |
202 | dump_stack(); | 202 | parent ? kobject_name(parent) : "'none'"); |
203 | } else | 203 | } else |
204 | kobj->state_in_sysfs = 1; | 204 | kobj->state_in_sysfs = 1; |
205 | 205 | ||