With the hardware partitions support (which represent additional logical devices
present on MMC), devidx does not correspond with index used to form
/dev/mmcblkX names. So use an additional allocated index for device names.

Signed-off-by: Andrei Warkentin <andr...@motorola.com>
---
 drivers/mmc/card/block.c |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 9e30cf6..92e4a00 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -75,6 +75,7 @@ static int max_devices;
 
 /* 256 minors, so at most 256 separate devices */
 static DECLARE_BITMAP(dev_use, 256);
+static DECLARE_BITMAP(name_use, 256);
 
 /*
  * There is one mmc_blk_data per slot.
@@ -88,6 +89,7 @@ struct mmc_blk_data {
        unsigned int    usage;
        unsigned int    read_only;
        unsigned int    part_type;
+       unsigned int    name_idx;
 
        /*
         * Only set in main mmc_blk_data associated
@@ -776,6 +778,20 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct 
mmc_card *card,
        }
 
        /*
+        * !subname implies we are creating main mmc_blk_data that will be
+        * associated with mmc_card with mmc_set_drvdata. Due to device 
partitions,
+        * devidx will not coincide with a per-physical card index anymore
+        * so we keep track of a name index.
+        */
+       if (!subname) {
+               md->name_idx = find_first_zero_bit(name_use, max_devices);
+               __set_bit(md->name_idx, name_use);
+       }
+       else
+               md->name_idx = ((struct mmc_blk_data *)
+                               dev_to_disk(parent)->private_data)->name_idx;
+
+       /*
         * Set the read-only status based on the supported commands
         * and the write protect switch.
         */
@@ -820,13 +836,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct 
mmc_card *card,
         * messages to tell when the card is present.
         */
 
-       if (subname)
-               snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
-                        "mmcblk%d%s",
-                        mmc_get_devidx(dev_to_disk(parent)), subname);
-       else
-               snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
-                        "mmcblk%d", devidx);
+       snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
+                "mmcblk%d%s", md->name_idx, subname ? subname : "");
 
        blk_queue_logical_block_size(md->queue.queue, 512);
        set_capacity(md->disk, size);
@@ -953,6 +964,7 @@ static void mmc_blk_remove_parts(struct mmc_card *card,
        struct list_head *pos, *q;
        struct mmc_blk_data *part_md;
 
+       __clear_bit(md->name_idx, name_use);
        list_for_each_safe(pos, q, &md->part) {
                part_md = list_entry(pos, struct mmc_blk_data, part);
                list_del(pos);
-- 
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to