diff options
Diffstat (limited to 'drivers/mmc/card/block.c')
-rw-r--r-- | 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 adf0ed3f2c08..e5bf2bfb5463 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -75,6 +75,7 @@ static int max_devices; | |||
75 | 75 | ||
76 | /* 256 minors, so at most 256 separate devices */ | 76 | /* 256 minors, so at most 256 separate devices */ |
77 | static DECLARE_BITMAP(dev_use, 256); | 77 | static DECLARE_BITMAP(dev_use, 256); |
78 | static DECLARE_BITMAP(name_use, 256); | ||
78 | 79 | ||
79 | /* | 80 | /* |
80 | * There is one mmc_blk_data per slot. | 81 | * There is one mmc_blk_data per slot. |
@@ -88,6 +89,7 @@ struct mmc_blk_data { | |||
88 | unsigned int usage; | 89 | unsigned int usage; |
89 | unsigned int read_only; | 90 | unsigned int read_only; |
90 | unsigned int part_type; | 91 | unsigned int part_type; |
92 | unsigned int name_idx; | ||
91 | 93 | ||
92 | /* | 94 | /* |
93 | * Only set in main mmc_blk_data associated | 95 | * Only set in main mmc_blk_data associated |
@@ -767,6 +769,20 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, | |||
767 | } | 769 | } |
768 | 770 | ||
769 | /* | 771 | /* |
772 | * !subname implies we are creating main mmc_blk_data that will be | ||
773 | * associated with mmc_card with mmc_set_drvdata. Due to device | ||
774 | * partitions, devidx will not coincide with a per-physical card | ||
775 | * index anymore so we keep track of a name index. | ||
776 | */ | ||
777 | if (!subname) { | ||
778 | md->name_idx = find_first_zero_bit(name_use, max_devices); | ||
779 | __set_bit(md->name_idx, name_use); | ||
780 | } | ||
781 | else | ||
782 | md->name_idx = ((struct mmc_blk_data *) | ||
783 | dev_to_disk(parent)->private_data)->name_idx; | ||
784 | |||
785 | /* | ||
770 | * Set the read-only status based on the supported commands | 786 | * Set the read-only status based on the supported commands |
771 | * and the write protect switch. | 787 | * and the write protect switch. |
772 | */ | 788 | */ |
@@ -811,13 +827,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, | |||
811 | * messages to tell when the card is present. | 827 | * messages to tell when the card is present. |
812 | */ | 828 | */ |
813 | 829 | ||
814 | if (subname) | 830 | snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), |
815 | snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), | 831 | "mmcblk%d%s", md->name_idx, subname ? subname : ""); |
816 | "mmcblk%d%s", | ||
817 | mmc_get_devidx(dev_to_disk(parent)), subname); | ||
818 | else | ||
819 | snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), | ||
820 | "mmcblk%d", devidx); | ||
821 | 832 | ||
822 | blk_queue_logical_block_size(md->queue.queue, 512); | 833 | blk_queue_logical_block_size(md->queue.queue, 512); |
823 | set_capacity(md->disk, size); | 834 | set_capacity(md->disk, size); |
@@ -944,6 +955,7 @@ static void mmc_blk_remove_parts(struct mmc_card *card, | |||
944 | struct list_head *pos, *q; | 955 | struct list_head *pos, *q; |
945 | struct mmc_blk_data *part_md; | 956 | struct mmc_blk_data *part_md; |
946 | 957 | ||
958 | __clear_bit(md->name_idx, name_use); | ||
947 | list_for_each_safe(pos, q, &md->part) { | 959 | list_for_each_safe(pos, q, &md->part) { |
948 | part_md = list_entry(pos, struct mmc_blk_data, part); | 960 | part_md = list_entry(pos, struct mmc_blk_data, part); |
949 | list_del(pos); | 961 | list_del(pos); |