md: do not return existing mddevs from mddev_find_or_alloc

Instead of returning an existing mddev, just for it to be discarded
later directly return -EEXIST.  Rename the function to mddev_alloc now
that it doesn't find an existing mddev.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Song Liu <song@kernel.org>
This commit is contained in:
Christoph Hellwig 2021-04-12 10:05:30 +02:00 committed by Song Liu
parent d144fe6ff1
commit 0d809b3837
1 changed files with 23 additions and 23 deletions

View File

@ -782,26 +782,24 @@ static struct mddev *mddev_find(dev_t unit)
return mddev; return mddev;
} }
static struct mddev *mddev_find_or_alloc(dev_t unit) static struct mddev *mddev_alloc(dev_t unit)
{ {
struct mddev *mddev = NULL, *new; struct mddev *new;
int error;
if (unit && MAJOR(unit) != MD_MAJOR) if (unit && MAJOR(unit) != MD_MAJOR)
unit &= ~((1 << MdpMinorShift) - 1); unit &= ~((1 << MdpMinorShift) - 1);
new = kzalloc(sizeof(*new), GFP_KERNEL); new = kzalloc(sizeof(*new), GFP_KERNEL);
if (!new) if (!new)
return NULL; return ERR_PTR(-ENOMEM);
mddev_init(new); mddev_init(new);
spin_lock(&all_mddevs_lock); spin_lock(&all_mddevs_lock);
if (unit) { if (unit) {
mddev = mddev_find_locked(unit); error = -EEXIST;
if (mddev) { if (mddev_find_locked(unit))
mddev_get(mddev);
goto out_free_new; goto out_free_new;
}
new->unit = unit; new->unit = unit;
if (MAJOR(unit) == MD_MAJOR) if (MAJOR(unit) == MD_MAJOR)
new->md_minor = MINOR(unit); new->md_minor = MINOR(unit);
@ -809,6 +807,7 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
new->md_minor = MINOR(unit) >> MdpMinorShift; new->md_minor = MINOR(unit) >> MdpMinorShift;
new->hold_active = UNTIL_IOCTL; new->hold_active = UNTIL_IOCTL;
} else { } else {
error = -ENODEV;
new->unit = mddev_alloc_unit(); new->unit = mddev_alloc_unit();
if (!new->unit) if (!new->unit)
goto out_free_new; goto out_free_new;
@ -822,7 +821,7 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
out_free_new: out_free_new:
spin_unlock(&all_mddevs_lock); spin_unlock(&all_mddevs_lock);
kfree(new); kfree(new);
return mddev; return ERR_PTR(error);
} }
static struct attribute_group md_redundancy_group; static struct attribute_group md_redundancy_group;
@ -5661,29 +5660,29 @@ static int md_alloc(dev_t dev, char *name)
* writing to /sys/module/md_mod/parameters/new_array. * writing to /sys/module/md_mod/parameters/new_array.
*/ */
static DEFINE_MUTEX(disks_mutex); static DEFINE_MUTEX(disks_mutex);
struct mddev *mddev = mddev_find_or_alloc(dev); struct mddev *mddev;
struct gendisk *disk; struct gendisk *disk;
int partitioned; int partitioned;
int shift; int shift;
int unit; int unit;
int error; int error ;
if (!mddev) /*
return -ENODEV; * Wait for any previous instance of this device to be completely
* removed (mddev_delayed_delete).
partitioned = (MAJOR(mddev->unit) != MD_MAJOR);
shift = partitioned ? MdpMinorShift : 0;
unit = MINOR(mddev->unit) >> shift;
/* wait for any previous instance of this device to be
* completely removed (mddev_delayed_delete).
*/ */
flush_workqueue(md_misc_wq); flush_workqueue(md_misc_wq);
mutex_lock(&disks_mutex); mutex_lock(&disks_mutex);
error = -EEXIST; mddev = mddev_alloc(dev);
if (mddev->gendisk) if (IS_ERR(mddev)) {
goto abort; mutex_unlock(&disks_mutex);
return PTR_ERR(mddev);
}
partitioned = (MAJOR(mddev->unit) != MD_MAJOR);
shift = partitioned ? MdpMinorShift : 0;
unit = MINOR(mddev->unit) >> shift;
if (name && !dev) { if (name && !dev) {
/* Need to ensure that 'name' is not a duplicate. /* Need to ensure that 'name' is not a duplicate.
@ -5695,6 +5694,7 @@ static int md_alloc(dev_t dev, char *name)
if (mddev2->gendisk && if (mddev2->gendisk &&
strcmp(mddev2->gendisk->disk_name, name) == 0) { strcmp(mddev2->gendisk->disk_name, name) == 0) {
spin_unlock(&all_mddevs_lock); spin_unlock(&all_mddevs_lock);
error = -EEXIST;
goto abort; goto abort;
} }
spin_unlock(&all_mddevs_lock); spin_unlock(&all_mddevs_lock);