Commit 85c8c3c1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Song Liu

md: factor out a mddev_alloc_unit helper from mddev_find

Split out a self contained helper to find a free minor for the md
"unit" number.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarSong Liu <song@kernel.org>
parent f8ee34a9
......@@ -745,6 +745,27 @@ static struct mddev *mddev_find_locked(dev_t unit)
return NULL;
}
/* find an unused unit number */
static dev_t mddev_alloc_unit(void)
{
static int next_minor = 512;
int start = next_minor;
bool is_free = 0;
dev_t dev = 0;
while (!is_free) {
dev = MKDEV(MD_MAJOR, next_minor);
next_minor++;
if (next_minor > MINORMASK)
next_minor = 0;
if (next_minor == start)
return 0; /* Oh dear, all in use. */
is_free = !mddev_find_locked(dev);
}
return dev;
}
static struct mddev *mddev_find(dev_t unit)
{
struct mddev *mddev;
......@@ -787,27 +808,13 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
return new;
}
} else if (new) {
/* find an unused unit number */
static int next_minor = 512;
int start = next_minor;
int is_free = 0;
int dev = 0;
while (!is_free) {
dev = MKDEV(MD_MAJOR, next_minor);
next_minor++;
if (next_minor > MINORMASK)
next_minor = 0;
if (next_minor == start) {
/* Oh dear, all in use. */
spin_unlock(&all_mddevs_lock);
kfree(new);
return NULL;
}
is_free = !mddev_find_locked(dev);
new->unit = mddev_alloc_unit();
if (!new->unit) {
spin_unlock(&all_mddevs_lock);
kfree(new);
return NULL;
}
new->unit = dev;
new->md_minor = MINOR(dev);
new->md_minor = MINOR(new->unit);
new->hold_active = UNTIL_STOP;
list_add(&new->all_mddevs, &all_mddevs);
spin_unlock(&all_mddevs_lock);
......
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