Skip to content

Commit

Permalink
mmc: Flush pending detects on host removal
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Pierre Ossman committed May 1, 2007
1 parent 1c6a071 commit 3b91e55
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
15 changes: 14 additions & 1 deletion drivers/mmc/mmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1550,6 +1550,12 @@ static void mmc_setup(struct mmc_host *host)
*/
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);
}

Expand Down Expand Up @@ -1690,6 +1696,14 @@ void mmc_remove_host(struct mmc_host *host)
{
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);

Expand All @@ -1710,7 +1724,6 @@ EXPORT_SYMBOL(mmc_remove_host);
*/
void mmc_free_host(struct mmc_host *host)
{
mmc_flush_scheduled_work();
mmc_free_host_sysfs(host);
}

Expand Down
3 changes: 3 additions & 0 deletions include/linux/mmc/host.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ struct mmc_host {
struct mmc_card *card_selected; /* the selected MMC card */

struct delayed_work detect;
#ifdef CONFIG_MMC_DEBUG
unsigned int removed:1; /* host is being removed */
#endif

unsigned long private[0] ____cacheline_aligned;
};
Expand Down

0 comments on commit 3b91e55

Please sign in to comment.