diff options
author | Daniel Drake <dsd@laptop.org> | 2009-12-18 02:27:17 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-18 02:45:31 +0300 |
commit | 3d10a1ba0d37c8f5fd5afcdda00613fbb8a90bf5 (patch) | |
tree | 2ece821a975a989e3932a9a71ed4353b1edb32f7 /drivers | |
parent | f6151dfea21496d43dbaba32cfcd9c9f404769bc (diff) | |
download | linux-3d10a1ba0d37c8f5fd5afcdda00613fbb8a90bf5.tar.xz |
sdio: fix reference counting in sdio_remove_func()
sdio_remove_func() needs to be more careful about reference counting. It
can be called in error paths where sdio_add_func() has never been called
e.g. mmc_attach_sdio error path --> mmc_sdio_remove --> sdio_remove_func
Signed-off-by: Daniel Drake <dsd@laptop.org>
Reviewed-by: Matt Fleming <matt@console-pimps.org>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mmc/core/sdio_bus.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index d37464e296a5..9e060c87e64d 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c @@ -248,12 +248,15 @@ int sdio_add_func(struct sdio_func *func) /* * Unregister a SDIO function with the driver model, and * (eventually) free it. + * This function can be called through error paths where sdio_add_func() was + * never executed (because a failure occurred at an earlier point). */ void sdio_remove_func(struct sdio_func *func) { - if (sdio_func_present(func)) - device_del(&func->dev); + if (!sdio_func_present(func)) + return; + device_del(&func->dev); put_device(&func->dev); } |