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,122 +126,117 @@ static inline int create_dev(char *name, dev_t dev) ...@@ -126,122 +126,117 @@ 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];
int fd;
int err = 0;
char *devname;
mdu_disk_info_t dinfo;
char name[16];
for (ent = 0; ent < md_setup_ents ; ent++) { minor = args->minor;
int fd; partitioned = args->partitioned;
int err = 0; devname = args->device_names;
char *devname;
mdu_disk_info_t dinfo;
char name[16];
minor = md_setup_args[ent].minor; sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor);
partitioned = md_setup_args[ent].partitioned; if (partitioned)
devname = md_setup_args[ent].device_names; dev = MKDEV(mdp_major, minor << MdpMinorShift);
else
dev = MKDEV(MD_MAJOR, minor);
create_dev(name, dev);
for (i = 0; i < MD_SB_DISKS && devname != NULL; i++) {
struct kstat stat;
char *p;
char comp_name[64];
sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor); p = strchr(devname, ',');
if (partitioned) if (p)
dev = MKDEV(mdp_major, minor << MdpMinorShift); *p++ = 0;
else
dev = MKDEV(MD_MAJOR, minor);
create_dev(name, dev);
for (i = 0; i < MD_SB_DISKS && devname != NULL; i++) {
struct kstat stat;
char *p;
char comp_name[64];
p = strchr(devname, ','); dev = name_to_dev_t(devname);
if (p) if (strncmp(devname, "/dev/", 5) == 0)
*p++ = 0; devname += 5;
snprintf(comp_name, 63, "/dev/%s", devname);
if (vfs_stat(comp_name, &stat) == 0 && S_ISBLK(stat.mode))
dev = new_decode_dev(stat.rdev);
if (!dev) {
printk(KERN_WARNING "md: Unknown device name: %s\n", devname);
break;
}
dev = name_to_dev_t(devname); devices[i] = dev;
if (strncmp(devname, "/dev/", 5) == 0) devname = p;
devname += 5; }
snprintf(comp_name, 63, "/dev/%s", devname); devices[i] = 0;
if (vfs_stat(comp_name, &stat) == 0 &&
S_ISBLK(stat.mode))
dev = new_decode_dev(stat.rdev);
if (!dev) {
printk(KERN_WARNING "md: Unknown device name: %s\n", devname);
break;
}
devices[i] = dev; if (!i)
return;
devname = p; printk(KERN_INFO "md: Loading md%s%d: %s\n",
} partitioned ? "_d" : "", minor,
devices[i] = 0; args->device_names);
if (!i) fd = ksys_open(name, 0, 0);
continue; if (fd < 0) {
printk(KERN_ERR "md: open failed - cannot start "
"array %s\n", name);
return;
}
if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) {
printk(KERN_WARNING
"md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n",
minor);
ksys_close(fd);
return;
}
printk(KERN_INFO "md: Loading md%s%d: %s\n", if (args->level != LEVEL_NONE) {
partitioned ? "_d" : "", minor, /* non-persistent */
md_setup_args[ent].device_names); mdu_array_info_t ainfo;
ainfo.level = args->level;
ainfo.size = 0;
ainfo.nr_disks =0;
ainfo.raid_disks =0;
while (devices[ainfo.raid_disks])
ainfo.raid_disks++;
ainfo.md_minor =minor;
ainfo.not_persistent = 1;
fd = ksys_open(name, 0, 0); ainfo.state = (1 << MD_SB_CLEAN);
if (fd < 0) { ainfo.layout = 0;
printk(KERN_ERR "md: open failed - cannot start " ainfo.chunk_size = args->chunk;
"array %s\n", name); err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo);
continue; for (i = 0; !err && i <= MD_SB_DISKS; i++) {
} dev = devices[i];
if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { if (!dev)
printk(KERN_WARNING break;
"md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", dinfo.number = i;
minor); dinfo.raid_disk = i;
ksys_close(fd); dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC);
continue; dinfo.major = MAJOR(dev);
dinfo.minor = MINOR(dev);
err = ksys_ioctl(fd, ADD_NEW_DISK,
(long)&dinfo);
} }
} else {
if (md_setup_args[ent].level != LEVEL_NONE) { /* persistent */
/* non-persistent */ for (i = 0; i <= MD_SB_DISKS; i++) {
mdu_array_info_t ainfo; dev = devices[i];
ainfo.level = md_setup_args[ent].level; if (!dev)
ainfo.size = 0; break;
ainfo.nr_disks =0; dinfo.major = MAJOR(dev);
ainfo.raid_disks =0; dinfo.minor = MINOR(dev);
while (devices[ainfo.raid_disks]) ksys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo);
ainfo.raid_disks++;
ainfo.md_minor =minor;
ainfo.not_persistent = 1;
ainfo.state = (1 << MD_SB_CLEAN);
ainfo.layout = 0;
ainfo.chunk_size = md_setup_args[ent].chunk;
err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo);
for (i = 0; !err && i <= MD_SB_DISKS; i++) {
dev = devices[i];
if (!dev)
break;
dinfo.number = i;
dinfo.raid_disk = i;
dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC);
dinfo.major = MAJOR(dev);
dinfo.minor = MINOR(dev);
err = ksys_ioctl(fd, ADD_NEW_DISK,
(long)&dinfo);
}
} else {
/* persistent */
for (i = 0; i <= MD_SB_DISKS; i++) {
dev = devices[i];
if (!dev)
break;
dinfo.major = MAJOR(dev);
dinfo.minor = MINOR(dev);
ksys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo);
}
} }
if (!err)
err = ksys_ioctl(fd, RUN_ARRAY, 0);
if (err)
printk(KERN_WARNING "md: starting md%d failed\n", minor);
ksys_close(fd);
} }
if (!err)
err = ksys_ioctl(fd, RUN_ARRAY, 0);
if (err)
printk(KERN_WARNING "md: starting md%d failed\n", minor);
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