Skip to content

Commit

Permalink
mmc: Ensure hardware partitions don't mess with mmcblk device naming.
Browse files Browse the repository at this point in the history
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 <andreiw@motorola.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
  • Loading branch information
Andrei Warkentin authored and Chris Ball committed May 25, 2011
1 parent 393c1a3 commit f06c915
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions drivers/mmc/card/block.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f06c915

Please sign in to comment.