Commit b10fa99e authored by Ulf Hansson's avatar Ulf Hansson

mmc: block: Convert to IDA for partition device indexes

Instead of using an mmc specific implementation to deal with indexes
through a BITMAP, let's convert to use the IDA library.
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 06b5cca5
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/idr.h>
#include <linux/mmc/ioctl.h> #include <linux/mmc/ioctl.h>
#include <linux/mmc/card.h> #include <linux/mmc/card.h>
...@@ -78,14 +79,14 @@ static int perdev_minors = CONFIG_MMC_BLOCK_MINORS; ...@@ -78,14 +79,14 @@ static int perdev_minors = CONFIG_MMC_BLOCK_MINORS;
/* /*
* We've only got one major, so number of mmcblk devices is * We've only got one major, so number of mmcblk devices is
* limited to (1 << 20) / number of minors per device. It is also * limited to (1 << 20) / number of minors per device. It is also
* currently limited by the size of the static bitmaps below. * limited by the MAX_DEVICES below.
*/ */
static int max_devices; static int max_devices;
#define MAX_DEVICES 256 #define MAX_DEVICES 256
/* TODO: Replace these with struct ida */ static DEFINE_IDA(mmc_blk_ida);
static DECLARE_BITMAP(dev_use, MAX_DEVICES); static DEFINE_SPINLOCK(mmc_blk_lock);
/* /*
* There is one mmc_blk_data per slot. * There is one mmc_blk_data per slot.
...@@ -178,7 +179,9 @@ static void mmc_blk_put(struct mmc_blk_data *md) ...@@ -178,7 +179,9 @@ static void mmc_blk_put(struct mmc_blk_data *md)
int devidx = mmc_get_devidx(md->disk); int devidx = mmc_get_devidx(md->disk);
blk_cleanup_queue(md->queue.queue); blk_cleanup_queue(md->queue.queue);
__clear_bit(devidx, dev_use); spin_lock(&mmc_blk_lock);
ida_remove(&mmc_blk_ida, devidx);
spin_unlock(&mmc_blk_lock);
put_disk(md->disk); put_disk(md->disk);
kfree(md); kfree(md);
...@@ -2189,10 +2192,23 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, ...@@ -2189,10 +2192,23 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
struct mmc_blk_data *md; struct mmc_blk_data *md;
int devidx, ret; int devidx, ret;
devidx = find_first_zero_bit(dev_use, max_devices); again:
if (devidx >= max_devices) if (!ida_pre_get(&mmc_blk_ida, GFP_KERNEL))
return ERR_PTR(-ENOSPC); return ERR_PTR(-ENOMEM);
__set_bit(devidx, dev_use);
spin_lock(&mmc_blk_lock);
ret = ida_get_new(&mmc_blk_ida, &devidx);
spin_unlock(&mmc_blk_lock);
if (ret == -EAGAIN)
goto again;
else if (ret)
return ERR_PTR(ret);
if (devidx >= max_devices) {
ret = -ENOSPC;
goto out;
}
md = kzalloc(sizeof(struct mmc_blk_data), GFP_KERNEL); md = kzalloc(sizeof(struct mmc_blk_data), GFP_KERNEL);
if (!md) { if (!md) {
...@@ -2289,7 +2305,9 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, ...@@ -2289,7 +2305,9 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
err_kfree: err_kfree:
kfree(md); kfree(md);
out: out:
__clear_bit(devidx, dev_use); spin_lock(&mmc_blk_lock);
ida_remove(&mmc_blk_ida, devidx);
spin_unlock(&mmc_blk_lock);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment