Commit f5ad5010 authored by Linus Torvalds's avatar Linus Torvalds

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
parents b3dfd76c 282029c0
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <linux/sys_soc.h> #include <linux/sys_soc.h>
#include <linux/err.h> #include <linux/err.h>
static DEFINE_IDR(soc_ida); static DEFINE_IDA(soc_ida);
static DEFINE_SPINLOCK(soc_lock); static DEFINE_SPINLOCK(soc_lock);
static ssize_t soc_info_get(struct device *dev, static ssize_t soc_info_get(struct device *dev,
...@@ -168,8 +168,6 @@ void soc_device_unregister(struct soc_device *soc_dev) ...@@ -168,8 +168,6 @@ void soc_device_unregister(struct soc_device *soc_dev)
static int __init soc_bus_register(void) static int __init soc_bus_register(void)
{ {
spin_lock_init(&soc_lock);
return bus_register(&soc_bus_type); return bus_register(&soc_bus_type);
} }
core_initcall(soc_bus_register); core_initcall(soc_bus_register);
......
...@@ -729,6 +729,9 @@ int sysfs_create_dir(struct kobject * kobj) ...@@ -729,6 +729,9 @@ int sysfs_create_dir(struct kobject * kobj)
else else
parent_sd = &sysfs_root; parent_sd = &sysfs_root;
if (!parent_sd)
return -ENOENT;
if (sysfs_ns_type(parent_sd)) if (sysfs_ns_type(parent_sd))
ns = kobj->ktype->namespace(kobj); ns = kobj->ktype->namespace(kobj);
type = sysfs_read_ns_type(kobj); type = sysfs_read_ns_type(kobj);
...@@ -878,7 +881,6 @@ int sysfs_rename(struct sysfs_dirent *sd, ...@@ -878,7 +881,6 @@ int sysfs_rename(struct sysfs_dirent *sd,
dup_name = sd->s_name; dup_name = sd->s_name;
sd->s_name = new_name; sd->s_name = new_name;
sd->s_hash = sysfs_name_hash(sd->s_ns, sd->s_name);
} }
/* Move to the appropriate place in the appropriate directories rbtree. */ /* Move to the appropriate place in the appropriate directories rbtree. */
...@@ -886,6 +888,7 @@ int sysfs_rename(struct sysfs_dirent *sd, ...@@ -886,6 +888,7 @@ int sysfs_rename(struct sysfs_dirent *sd,
sysfs_get(new_parent_sd); sysfs_get(new_parent_sd);
sysfs_put(sd->s_parent); sysfs_put(sd->s_parent);
sd->s_ns = new_ns; sd->s_ns = new_ns;
sd->s_hash = sysfs_name_hash(sd->s_ns, sd->s_name);
sd->s_parent = new_parent_sd; sd->s_parent = new_parent_sd;
sysfs_link_sibling(sd); sysfs_link_sibling(sd);
......
...@@ -67,7 +67,11 @@ static int internal_create_group(struct kobject *kobj, int update, ...@@ -67,7 +67,11 @@ static int internal_create_group(struct kobject *kobj, int update,
/* Updates may happen before the object has been instantiated */ /* Updates may happen before the object has been instantiated */
if (unlikely(update && !kobj->sd)) if (unlikely(update && !kobj->sd))
return -EINVAL; return -EINVAL;
if (!grp->attrs) {
WARN(1, "sysfs: attrs not set by subsystem for group: %s/%s\n",
kobj->name, grp->name ? "" : grp->name);
return -EINVAL;
}
if (grp->name) { if (grp->name) {
error = sysfs_create_subdir(kobj, grp->name, &sd); error = sysfs_create_subdir(kobj, grp->name, &sd);
if (error) if (error)
......
...@@ -192,14 +192,14 @@ static int kobject_add_internal(struct kobject *kobj) ...@@ -192,14 +192,14 @@ static int kobject_add_internal(struct kobject *kobj)
/* be noisy on error issues */ /* be noisy on error issues */
if (error == -EEXIST) if (error == -EEXIST)
printk(KERN_ERR "%s failed for %s with " WARN(1, "%s failed for %s with "
"-EEXIST, don't try to register things with " "-EEXIST, don't try to register things with "
"the same name in the same directory.\n", "the same name in the same directory.\n",
__func__, kobject_name(kobj)); __func__, kobject_name(kobj));
else else
printk(KERN_ERR "%s failed for %s (%d)\n", WARN(1, "%s failed for %s (error: %d parent: %s)\n",
__func__, kobject_name(kobj), error); __func__, kobject_name(kobj), error,
dump_stack(); parent ? kobject_name(parent) : "'none'");
} else } else
kobj->state_in_sysfs = 1; kobj->state_in_sysfs = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment