introduced by 49dce689ad4ef0fd1f970ef762168e4bd46f69a3 and bad-fixed by
350d0076c5763ca2b88ca05e3889bfa7c1905f21, spi_unregister_master would
previously device_unregister all of the spi master's siblings (instead
of its children). hilarity ensues.

fix it to unregister children.

Signed-off-by: David Lamparter <[email protected]>
Cc: Tony Jones <[email protected]>
Cc: Atsushi Nemoto <[email protected]>
Cc: David Brownell <[email protected]>
Cc: Grant Likely <[email protected]>
---

Great, I'm sending around a wrong version which doesn't even
compile...

> +     dummy = device_for_each_child(master->dev, NULL, _unregister);
needs to be
> +     dummy = device_for_each_child(&master->dev, NULL, __unregister);
really.


Sorry,
-David

On Mon, Aug 30, 2010 at 11:39:49PM +0200, David Lamparter wrote:
> Hi Grant,
> 
> please see attached patch :)
> 
> (reply from David Brownell went off-list because I accidentally Cc'ed an
> old e-mail address of him. moving this to on-list thread.)
> 
> -David L.
> 
> On Mon, Aug 30, 2010 at 11:58:37AM +0200, David Lamparter wrote:
> > "siblings" were usb endpoint devices in my case, causing a very nice
> > *boom* when the usb code tried to unregister them after they were gone
> > already because of spi_unregister_master. went looking for a bug in my
> > code for 20 hours...
> > 
> > patch is against 2.6.35.4 but there shouldn't be much change in this
> > file.
> > 
> On Mon, Aug 30, 2010 at 10:08:12AM -0700, David Brownell wrote:
> > Bug since 2007?  OUch!
> > 
> > 
> > At a real quick review, it looked right; but
> > I couldn't test.
> > 
> > Please send this patch also to Grant Likely.


 drivers/spi/spi.c |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index b3a1f92..1a61fa8 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -546,11 +546,9 @@ done:
 EXPORT_SYMBOL_GPL(spi_register_master);
 
 
-static int __unregister(struct device *dev, void *master_dev)
+static int __unregister(struct device *dev, void *null)
 {
-       /* note: before about 2.6.14-rc1 this would corrupt memory: */
-       if (dev != master_dev)
-               spi_unregister_device(to_spi_device(dev));
+       spi_unregister_device(to_spi_device(dev));
        return 0;
 }
 
@@ -568,8 +566,7 @@ void spi_unregister_master(struct spi_master *master)
 {
        int dummy;
 
-       dummy = device_for_each_child(master->dev.parent, &master->dev,
-                                       __unregister);
+       dummy = device_for_each_child(&master->dev, NULL, __unregister);
        device_unregister(&master->dev);
 }
 EXPORT_SYMBOL_GPL(spi_unregister_master);
-- 
1.7.1


------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
spi-devel-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to