瀏覽代碼

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>
Pierre Ossman 18 年之前
父節點
當前提交
3b91e5507c
共有 2 個文件被更改,包括 17 次插入1 次删除
  1. 14 1
      drivers/mmc/mmc.c
  2. 3 0
      include/linux/mmc/host.h

+ 14 - 1
drivers/mmc/mmc.c

@@ -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);
 }
 
@@ -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);
 
@@ -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);
 }
 

+ 3 - 0
include/linux/mmc/host.h

@@ -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;
 };