Skip to content

Commit 34cb92c

Browse files
Christoph Hellwigaxboe
authored andcommitted
md: return the allocated devices from md_alloc
Two callers of md_alloc want to use the newly allocated devices, so return it instead of letting them find it cumbersomely after the allocation. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-and-tested-by: Logan Gunthorpe <[email protected]> Signed-off-by: Song Liu <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent a110876 commit 34cb92c

File tree

3 files changed

+30
-49
lines changed

3 files changed

+30
-49
lines changed

drivers/md/md-autodetect.c

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ static void __init md_setup_drive(struct md_setup_args *args)
125125
char *devname = args->device_names;
126126
dev_t devices[MD_SB_DISKS + 1], mdev;
127127
struct mdu_array_info_s ainfo = { };
128-
struct block_device *bdev;
129128
struct mddev *mddev;
130129
int err = 0, i;
131130
char name[16];
@@ -169,25 +168,16 @@ static void __init md_setup_drive(struct md_setup_args *args)
169168

170169
pr_info("md: Loading %s: %s\n", name, args->device_names);
171170

172-
md_alloc(mdev, name);
173-
bdev = blkdev_get_by_dev(mdev, FMODE_READ, NULL);
174-
if (IS_ERR(bdev)) {
175-
pr_err("md: open failed - cannot start array %s\n", name);
171+
mddev = md_alloc(mdev, name);
172+
if (IS_ERR(mddev)) {
173+
pr_err("md: md_alloc failed - cannot start array %s\n", name);
176174
return;
177175
}
178176

179-
err = -EIO;
180-
if (WARN(bdev->bd_disk->fops != &md_fops,
181-
"Opening block device %x resulted in non-md device\n",
182-
mdev))
183-
goto out_blkdev_put;
184-
185-
mddev = bdev->bd_disk->private_data;
186-
187177
err = mddev_lock(mddev);
188178
if (err) {
189179
pr_err("md: failed to lock array %s\n", name);
190-
goto out_blkdev_put;
180+
goto out_mddev_put;
191181
}
192182

193183
if (!list_empty(&mddev->disks) || mddev->raid_disks) {
@@ -231,8 +221,8 @@ static void __init md_setup_drive(struct md_setup_args *args)
231221
pr_warn("md: starting %s failed\n", name);
232222
out_unlock:
233223
mddev_unlock(mddev);
234-
out_blkdev_put:
235-
blkdev_put(bdev, FMODE_READ);
224+
out_mddev_put:
225+
mddev_put(mddev);
236226
}
237227

238228
static int __init raid_setup(char *str)

drivers/md/md.c

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ static inline struct mddev *mddev_get(struct mddev *mddev)
635635

636636
static void mddev_delayed_delete(struct work_struct *ws);
637637

638-
static void mddev_put(struct mddev *mddev)
638+
void mddev_put(struct mddev *mddev)
639639
{
640640
if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
641641
return;
@@ -714,24 +714,6 @@ static dev_t mddev_alloc_unit(void)
714714
return dev;
715715
}
716716

717-
#ifndef MODULE
718-
static struct mddev *mddev_find(dev_t unit)
719-
{
720-
struct mddev *mddev;
721-
722-
if (MAJOR(unit) != MD_MAJOR)
723-
unit &= ~((1 << MdpMinorShift) - 1);
724-
725-
spin_lock(&all_mddevs_lock);
726-
mddev = mddev_find_locked(unit);
727-
if (mddev && !mddev_get(mddev))
728-
mddev = NULL;
729-
spin_unlock(&all_mddevs_lock);
730-
731-
return mddev;
732-
}
733-
#endif
734-
735717
static struct mddev *mddev_alloc(dev_t unit)
736718
{
737719
struct mddev *new;
@@ -5614,7 +5596,7 @@ int mddev_init_writes_pending(struct mddev *mddev)
56145596
}
56155597
EXPORT_SYMBOL_GPL(mddev_init_writes_pending);
56165598

5617-
int md_alloc(dev_t dev, char *name)
5599+
struct mddev *md_alloc(dev_t dev, char *name)
56185600
{
56195601
/*
56205602
* If dev is zero, name is the name of a device to allocate with
@@ -5706,33 +5688,42 @@ int md_alloc(dev_t dev, char *name)
57065688
* different from a normal close on last release now.
57075689
*/
57085690
mddev->hold_active = 0;
5709-
goto done;
5691+
mutex_unlock(&disks_mutex);
5692+
mddev_put(mddev);
5693+
return ERR_PTR(error);
57105694
}
57115695

57125696
kobject_uevent(&mddev->kobj, KOBJ_ADD);
57135697
mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state");
57145698
mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level");
5715-
5716-
done:
57175699
mutex_unlock(&disks_mutex);
5718-
mddev_put(mddev);
5719-
return error;
5700+
return mddev;
57205701

57215702
out_put_disk:
57225703
put_disk(disk);
57235704
out_free_mddev:
57245705
mddev_free(mddev);
57255706
out_unlock:
57265707
mutex_unlock(&disks_mutex);
5727-
return error;
5708+
return ERR_PTR(error);
5709+
}
5710+
5711+
static int md_alloc_and_put(dev_t dev, char *name)
5712+
{
5713+
struct mddev *mddev = md_alloc(dev, name);
5714+
5715+
if (IS_ERR(mddev))
5716+
return PTR_ERR(mddev);
5717+
mddev_put(mddev);
5718+
return 0;
57285719
}
57295720

57305721
static void md_probe(dev_t dev)
57315722
{
57325723
if (MAJOR(dev) == MD_MAJOR && MINOR(dev) >= 512)
57335724
return;
57345725
if (create_on_open)
5735-
md_alloc(dev, NULL);
5726+
md_alloc_and_put(dev, NULL);
57365727
}
57375728

57385729
static int add_named_array(const char *val, const struct kernel_param *kp)
@@ -5754,12 +5745,12 @@ static int add_named_array(const char *val, const struct kernel_param *kp)
57545745
return -E2BIG;
57555746
strscpy(buf, val, len+1);
57565747
if (strncmp(buf, "md_", 3) == 0)
5757-
return md_alloc(0, buf);
5748+
return md_alloc_and_put(0, buf);
57585749
if (strncmp(buf, "md", 2) == 0 &&
57595750
isdigit(buf[2]) &&
57605751
kstrtoul(buf+2, 10, &devnum) == 0 &&
57615752
devnum <= MINORMASK)
5762-
return md_alloc(MKDEV(MD_MAJOR, devnum), NULL);
5753+
return md_alloc_and_put(MKDEV(MD_MAJOR, devnum), NULL);
57635754

57645755
return -EINVAL;
57655756
}
@@ -6500,9 +6491,8 @@ static void autorun_devices(int part)
65006491
break;
65016492
}
65026493

6503-
md_alloc(dev, NULL);
6504-
mddev = mddev_find(dev);
6505-
if (!mddev)
6494+
mddev = md_alloc(dev, NULL);
6495+
if (IS_ERR(mddev))
65066496
break;
65076497

65086498
if (mddev_lock(mddev))

drivers/md/md.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,8 @@ extern int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
767767
extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
768768

769769
extern void mddev_init(struct mddev *mddev);
770-
int md_alloc(dev_t dev, char *name);
770+
struct mddev *md_alloc(dev_t dev, char *name);
771+
void mddev_put(struct mddev *mddev);
771772
extern int md_run(struct mddev *mddev);
772773
extern int md_start(struct mddev *mddev);
773774
extern void md_stop(struct mddev *mddev);

0 commit comments

Comments
 (0)