mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 06:33:34 +00:00
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: Christoph Hellwig <hch@lst.de> Signed-off-by: Song Liu <song@kernel.org>
This commit is contained in:
parent
f8ee34a929
commit
85c8c3c1f8
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user