Skip to contentSkip to conversation

patch mmc_block-add-dev_t-initialization-check.patch added to 2.6.32-stable tree

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

lore
Share & tools
lore
#0 lore raw

This is a note to let you know that we have just queued up the patch titled

Subject: mmc_block: add dev_t initialization check

to the 2.6.32-stable tree. Its filename is

mmc_block-add-dev_t-initialization-check.patch

A git repo of this tree can be found at
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

Quoted 1 line

From 7d92df692994472cab6045bbd9d0e2c4afa4365f Mon Sep 17 00:00:00 2001

From: Anna Lemehova <[email protected]>
Date: Fri, 8 Jan 2010 14:42:58 -0800
Subject: mmc_block: add dev_t initialization check

From: Anna Lemehova <[email protected]>

commit 7d92df692994472cab6045bbd9d0e2c4afa4365f upstream.

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 +5 -0
@@ -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);

Patches currently in stable-queue which might be from [email protected] are

queue-2.6.32/mmc_block-add-dev_t-initialization-check.patch