summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2021-04-12 10:05:28 +0200
committerSong Liu <song@kernel.org>2021-04-15 11:06:32 -0700
commit85c8c3c1f8d9e31f626c93435dd91c2f85603e07 (patch)
tree2f14090222401d2f37ffa085555d940ab75f9ef4
parentf8ee34a929a4adf6d29a7ef2145393e6865037ad (diff)
downloadlinux-85c8c3c1f8d9e31f626c93435dd91c2f85603e07.tar.bz2
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>
-rw-r--r--drivers/md/md.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 3ce5f4e0f431..8ef06330fc66 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -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);