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