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>
This commit is contained in:
parent
f6151dfea2
commit
3d10a1ba0d
@ -248,12 +248,15 @@ int sdio_add_func(struct sdio_func *func)
|
|||||||
/*
|
/*
|
||||||
* Unregister a SDIO function with the driver model, and
|
* Unregister a SDIO function with the driver model, and
|
||||||
* (eventually) free it.
|
* (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)
|
void sdio_remove_func(struct sdio_func *func)
|
||||||
{
|
{
|
||||||
if (sdio_func_present(func))
|
if (!sdio_func_present(func))
|
||||||
device_del(&func->dev);
|
return;
|
||||||
|
|
||||||
|
device_del(&func->dev);
|
||||||
put_device(&func->dev);
|
put_device(&func->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user