Thread (24 messages) 24 messages, 5 authors, 2012-03-23

Re: [libsas PATCH v12 04/11] sysfs: handle 'parent deleted before child added'

From: Williams, Dan J <hidden>
Date: 2012-03-22 16:27:01
Also in: linux-scsi

On Thu, Mar 22, 2012 at 7:39 AM, Greg Kroah-Hartman
[off-list ref] wrote:
On Wed, Mar 21, 2012 at 11:32:14PM -0700, Dan Williams wrote:
[..]
quoted
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index 7fdf6a7..86521ee 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -714,6 +714,9 @@ int sysfs_create_dir(struct kobject * kobj)
      else
              parent_sd = &sysfs_root;

+     if (!parent_sd)
+             return -ENOENT;
+
      if (sysfs_ns_type(parent_sd))
              ns = kobj->ktype->namespace(kobj);
      type = sysfs_read_ns_type(kobj);
So what happens if this is true?  Does this patch fix the oops?
This patch downgrades the oops by turning it into a device_add()
failure, but the patches that *fix* this warning are here [1] and here
[2].
What kernels should this be applied to where this problem has been seen?
I assume this has been a latent problem ever since scsi async scanning
was added (2.6.20-rc2), but it's a rare corner case to unplug devices
during the initial scan.
quoted
diff --git a/lib/kobject.c b/lib/kobject.c
index c33d7a1..e5f86c0 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -192,13 +192,14 @@ static int kobject_add_internal(struct kobject *kobj)
              /* be noisy on error issues */
              if (error == -EEXIST)
-                     printk(KERN_ERR "%s failed for %s with "
+                     pr_err("%s failed for %s with "
                             "-EEXIST, don't try to register things with "
                             "the same name in the same directory.\n",
                             __func__, kobject_name(kobj));
              else
-                     printk(KERN_ERR "%s failed for %s (%d)\n",
-                            __func__, kobject_name(kobj), error);
+                     pr_err("%s failed for %s (error: %d parent: %s)\n",
+                            __func__, kobject_name(kobj), error,
+                            parent ? kobject_name(parent) : "'none'");
              dump_stack();
      } else
              kobj->state_in_sysfs = 1;
These changes have nothing to do with the above fix, so why include them
here?
It wasn't until I realized which 'parent' and which 'child' were
interacting that I was able to identify the real fixes.  Since it was
helpful for the scsi/sas case, I decided to leave the more informative
warning for the next person that gets to debug a similar failure.
And note, I hate pr_err(), what's wrong with printk() in this instance?
This is a bit circuitous, but extending the warning to include the
'parent' and 'child' pushed up against 80 columns and since this
routine has a pr_debug() a few lines up I thought a pr_ conversion was
acceptable.  The pr_err() conversion of the EEXIST case just came
along for the ride to keep the print style consistent (at least in
this routine).

--
Dan

[1]: http://marc.info/?l=linux-scsi&m=133239707903443&w=2
[2]: http://marc.info/?l=linux-scsi&m=133239709603452&w=2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help