Commit d1100488 authored by Christoph Hellwig's avatar Christoph Hellwig

md: simplify md_setup_drive

Move the loop over the possible arrays into the caller to remove a level
of indentation for the whole function.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarNeilBrown <neilb@suse.de>
Acked-by: default avatarSong Liu <song@kernel.org>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1a6a0506
...@@ -27,7 +27,7 @@ static int __initdata raid_noautodetect=1; ...@@ -27,7 +27,7 @@ static int __initdata raid_noautodetect=1;
#endif #endif
static int __initdata raid_autopart; static int __initdata raid_autopart;
static struct { static struct md_setup_args {
int minor; int minor;
int partitioned; int partitioned;
int level; int level;
...@@ -126,22 +126,20 @@ static inline int create_dev(char *name, dev_t dev) ...@@ -126,22 +126,20 @@ static inline int create_dev(char *name, dev_t dev)
return ksys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); return ksys_mknod(name, S_IFBLK|0600, new_encode_dev(dev));
} }
static void __init md_setup_drive(void) static void __init md_setup_drive(struct md_setup_args *args)
{ {
int minor, i, ent, partitioned; int minor, i, partitioned;
dev_t dev; dev_t dev;
dev_t devices[MD_SB_DISKS+1]; dev_t devices[MD_SB_DISKS+1];
for (ent = 0; ent < md_setup_ents ; ent++) {
int fd; int fd;
int err = 0; int err = 0;
char *devname; char *devname;
mdu_disk_info_t dinfo; mdu_disk_info_t dinfo;
char name[16]; char name[16];
minor = md_setup_args[ent].minor; minor = args->minor;
partitioned = md_setup_args[ent].partitioned; partitioned = args->partitioned;
devname = md_setup_args[ent].device_names; devname = args->device_names;
sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor); sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor);
if (partitioned) if (partitioned)
...@@ -162,8 +160,7 @@ static void __init md_setup_drive(void) ...@@ -162,8 +160,7 @@ static void __init md_setup_drive(void)
if (strncmp(devname, "/dev/", 5) == 0) if (strncmp(devname, "/dev/", 5) == 0)
devname += 5; devname += 5;
snprintf(comp_name, 63, "/dev/%s", devname); snprintf(comp_name, 63, "/dev/%s", devname);
if (vfs_stat(comp_name, &stat) == 0 && if (vfs_stat(comp_name, &stat) == 0 && S_ISBLK(stat.mode))
S_ISBLK(stat.mode))
dev = new_decode_dev(stat.rdev); dev = new_decode_dev(stat.rdev);
if (!dev) { if (!dev) {
printk(KERN_WARNING "md: Unknown device name: %s\n", devname); printk(KERN_WARNING "md: Unknown device name: %s\n", devname);
...@@ -171,36 +168,35 @@ static void __init md_setup_drive(void) ...@@ -171,36 +168,35 @@ static void __init md_setup_drive(void)
} }
devices[i] = dev; devices[i] = dev;
devname = p; devname = p;
} }
devices[i] = 0; devices[i] = 0;
if (!i) if (!i)
continue; return;
printk(KERN_INFO "md: Loading md%s%d: %s\n", printk(KERN_INFO "md: Loading md%s%d: %s\n",
partitioned ? "_d" : "", minor, partitioned ? "_d" : "", minor,
md_setup_args[ent].device_names); args->device_names);
fd = ksys_open(name, 0, 0); fd = ksys_open(name, 0, 0);
if (fd < 0) { if (fd < 0) {
printk(KERN_ERR "md: open failed - cannot start " printk(KERN_ERR "md: open failed - cannot start "
"array %s\n", name); "array %s\n", name);
continue; return;
} }
if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) {
printk(KERN_WARNING printk(KERN_WARNING
"md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n",
minor); minor);
ksys_close(fd); ksys_close(fd);
continue; return;
} }
if (md_setup_args[ent].level != LEVEL_NONE) { if (args->level != LEVEL_NONE) {
/* non-persistent */ /* non-persistent */
mdu_array_info_t ainfo; mdu_array_info_t ainfo;
ainfo.level = md_setup_args[ent].level; ainfo.level = args->level;
ainfo.size = 0; ainfo.size = 0;
ainfo.nr_disks =0; ainfo.nr_disks =0;
ainfo.raid_disks =0; ainfo.raid_disks =0;
...@@ -211,7 +207,7 @@ static void __init md_setup_drive(void) ...@@ -211,7 +207,7 @@ static void __init md_setup_drive(void)
ainfo.state = (1 << MD_SB_CLEAN); ainfo.state = (1 << MD_SB_CLEAN);
ainfo.layout = 0; ainfo.layout = 0;
ainfo.chunk_size = md_setup_args[ent].chunk; ainfo.chunk_size = args->chunk;
err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo); err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo);
for (i = 0; !err && i <= MD_SB_DISKS; i++) { for (i = 0; !err && i <= MD_SB_DISKS; i++) {
dev = devices[i]; dev = devices[i];
...@@ -241,7 +237,6 @@ static void __init md_setup_drive(void) ...@@ -241,7 +237,6 @@ static void __init md_setup_drive(void)
if (err) if (err)
printk(KERN_WARNING "md: starting md%d failed\n", minor); printk(KERN_WARNING "md: starting md%d failed\n", minor);
ksys_close(fd); ksys_close(fd);
}
} }
static int __init raid_setup(char *str) static int __init raid_setup(char *str)
...@@ -289,11 +284,15 @@ static void __init autodetect_raid(void) ...@@ -289,11 +284,15 @@ static void __init autodetect_raid(void)
void __init md_run_setup(void) void __init md_run_setup(void)
{ {
int ent;
create_dev("/dev/md0", MKDEV(MD_MAJOR, 0)); create_dev("/dev/md0", MKDEV(MD_MAJOR, 0));
if (raid_noautodetect) if (raid_noautodetect)
printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n"); printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n");
else else
autodetect_raid(); autodetect_raid();
md_setup_drive();
for (ent = 0; ent < md_setup_ents; ent++)
md_setup_drive(&md_setup_args[ent]);
} }
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