diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index adf0ed3f2c0875bc46654ba2bf307fb6edbc2c40..e5bf2bfb5463a917f64cebede2860cb279eb2806 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 @@ -766,6 +768,20 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, goto out; } + /* + * !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. @@ -811,13 +827,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); @@ -944,6 +955,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);