mmc: Flush pending detects on host removal
Make sure we kill of any pending detection runs when the host
is removed instead of when it is freed. Also add some debugging
to make sure the driver doesn't queue up more detection after it
has removed the host.
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 9ffeeb2..0242c6a 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1550,6 +1550,12 @@
*/
void mmc_detect_change(struct mmc_host *host, unsigned long delay)
{
+#ifdef CONFIG_MMC_DEBUG
+ mmc_claim_host(host);
+ BUG_ON(host->removed);
+ mmc_release_host(host);
+#endif
+
mmc_schedule_delayed_work(&host->detect, delay);
}
@@ -1690,6 +1696,14 @@
{
struct list_head *l, *n;
+#ifdef CONFIG_MMC_DEBUG
+ mmc_claim_host(host);
+ host->removed = 1;
+ mmc_release_host(host);
+#endif
+
+ mmc_flush_scheduled_work();
+
list_for_each_safe(l, n, &host->cards) {
struct mmc_card *card = mmc_list_to_card(l);
@@ -1710,7 +1724,6 @@
*/
void mmc_free_host(struct mmc_host *host)
{
- mmc_flush_scheduled_work();
mmc_free_host_sysfs(host);
}