Skip to contentSkip to conversation

mmc_block: add dev_t initialization check

PATCH New [email protected] 1 participant 1 message Jan 8, 2010 MMC, SD and SDIO

lore
Share & tools
lore
#0 lore raw

PATCH 19/42 mmc_block: add dev_t initialization check

From: Anna Lemehova <[email protected]>

When a card is removed before mmc_blk_probe() has called add_disk(), then the minor field is uninitialized and has value 0. This caused mmc_blk_put() to always release devidx 0 even if 0 was still in use. Then the next mmc_blk_probe() used the first free idx of 0, which oopses in sysfs, since it is used by another card.

---

 drivers/mmc/card/block.c |    5 +++++
 1 file changed, 5 insertions(+)
drivers/mmc/card/block.c renamed from drivers/mmc/card/block.c~mmc_block-add-dev_t-initialization-check +5 -0
diff -puN drivers/mmc/card/block.c~mmc_block-add-dev_t-initialization-check drivers/mmc/card/block.c
@@ -85,7 +85,12 @@ static void mmc_blk_put(struct mmc_blk_d
 	mutex_lock(&open_lock);
 	md->usage--;
 	if (md->usage == 0) {
+		int devmaj = MAJOR(disk_devt(md->disk));
 		int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT;
+
+		if (!devmaj)
+			devidx = md->disk->first_minor >> MMC_SHIFT;
+
 		__clear_bit(devidx, dev_use);
 
 		put_disk(md->disk);

_