diff options
author | Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> | 2003-02-21 11:45:47 -0600 |
---|---|---|
committer | Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> | 2003-02-21 11:45:47 -0600 |
commit | 2039955ca2ccc9b98be0053ba670676b26a2f32a (patch) | |
tree | 344f0e01da2617a04a1ebeed015b9bd61d9c978a /init | |
parent | 224e4d06c7eb0a1ccc88c7feef4ffd8334f4509b (diff) | |
download | history-2039955ca2ccc9b98be0053ba670676b26a2f32a.tar.gz |
do_mounts: move early MD setup into own file
Again, just get rid of some #ifdefs by moving MD setup into
its own file which is only compiled when CONFIG_BLK_DEV_MD is set.
Diffstat (limited to 'init')
-rw-r--r-- | init/Makefile | 1 | ||||
-rw-r--r-- | init/do_mounts.c | 261 | ||||
-rw-r--r-- | init/do_mounts.h | 23 | ||||
-rw-r--r-- | init/do_mounts_md.c | 256 |
4 files changed, 275 insertions, 266 deletions
diff --git a/init/Makefile b/init/Makefile index b7b210d850a927..7cd9403dc31698 100644 --- a/init/Makefile +++ b/init/Makefile @@ -4,6 +4,7 @@ obj-y := main.o version.o do_mounts.o initramfs.o obj-$(CONFIG_DEVFS_FS) += do_mounts_devfs.o +obj-$(CONFIG_BLK_DEV_MD)+= do_mounts_md.o # files to be removed upon make clean clean-files := ../include/linux/compile.h diff --git a/init/do_mounts.c b/init/do_mounts.c index e6fc6afcd0a2bc..cfd4820b465454 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -14,8 +14,6 @@ #include <linux/ext2_fs.h> #include <linux/romfs_fs.h> -#include <linux/raid/md.h> - #include "do_mounts.h" #define BUILD_CRAMDISK @@ -27,7 +25,6 @@ extern asmlinkage long sys_rmdir(const char *name); extern asmlinkage long sys_chdir(const char *name); extern asmlinkage long sys_fchdir(int fd); extern asmlinkage long sys_chroot(const char *name); -extern asmlinkage long sys_ioctl(int fd, int cmd, unsigned long arg); #ifdef CONFIG_BLK_DEV_INITRD unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ @@ -699,8 +696,6 @@ static int __init initrd_load(void) return rd_load_image("/dev/initrd"); } -static void __init md_run_setup(void); - /* * Prepare the namespace - decide what/where to mount, load ramdisks, etc. */ @@ -909,259 +904,3 @@ static int __init crd_load(int in_fd, int out_fd) #endif /* BUILD_CRAMDISK && CONFIG_BLK_DEV_RAM */ -#ifdef CONFIG_BLK_DEV_MD - -/* - * When md (and any require personalities) are compiled into the kernel - * (not a module), arrays can be assembles are boot time using with AUTODETECT - * where specially marked partitions are registered with md_autodetect_dev(), - * and with MD_BOOT where devices to be collected are given on the boot line - * with md=..... - * The code for that is here. - */ - -struct { - int set; - int noautodetect; -} raid_setup_args __initdata; - -static struct { - char device_set [MAX_MD_DEVS]; - int pers[MAX_MD_DEVS]; - int chunk[MAX_MD_DEVS]; - char *device_names[MAX_MD_DEVS]; -} md_setup_args __initdata; - -/* - * Parse the command-line parameters given our kernel, but do not - * actually try to invoke the MD device now; that is handled by - * md_setup_drive after the low-level disk drivers have initialised. - * - * 27/11/1999: Fixed to work correctly with the 2.3 kernel (which - * assigns the task of parsing integer arguments to the - * invoked program now). Added ability to initialise all - * the MD devices (by specifying multiple "md=" lines) - * instead of just one. -- KTK - * 18May2000: Added support for persistent-superblock arrays: - * md=n,0,factor,fault,device-list uses RAID0 for device n - * md=n,-1,factor,fault,device-list uses LINEAR for device n - * md=n,device-list reads a RAID superblock from the devices - * elements in device-list are read by name_to_kdev_t so can be - * a hex number or something like /dev/hda1 /dev/sdb - * 2001-06-03: Dave Cinege <dcinege@psychosis.com> - * Shifted name_to_kdev_t() and related operations to md_set_drive() - * for later execution. Rewrote section to make devfs compatible. - */ -static int __init md_setup(char *str) -{ - int minor, level, factor, fault, pers; - char *pername = ""; - char *str1 = str; - - if (get_option(&str, &minor) != 2) { /* MD Number */ - printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); - return 0; - } - if (minor >= MAX_MD_DEVS) { - printk(KERN_WARNING "md: md=%d, Minor device number too high.\n", minor); - return 0; - } else if (md_setup_args.device_names[minor]) { - printk(KERN_WARNING "md: md=%d, Specified more than once. " - "Replacing previous definition.\n", minor); - } - switch (get_option(&str, &level)) { /* RAID Personality */ - case 2: /* could be 0 or -1.. */ - if (level == 0 || level == LEVEL_LINEAR) { - if (get_option(&str, &factor) != 2 || /* Chunk Size */ - get_option(&str, &fault) != 2) { - printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); - return 0; - } - md_setup_args.pers[minor] = level; - md_setup_args.chunk[minor] = 1 << (factor+12); - switch(level) { - case LEVEL_LINEAR: - pers = LINEAR; - pername = "linear"; - break; - case 0: - pers = RAID0; - pername = "raid0"; - break; - default: - printk(KERN_WARNING - "md: The kernel has not been configured for raid%d support!\n", - level); - return 0; - } - md_setup_args.pers[minor] = pers; - break; - } - /* FALL THROUGH */ - case 1: /* the first device is numeric */ - str = str1; - /* FALL THROUGH */ - case 0: - md_setup_args.pers[minor] = 0; - pername="super-block"; - } - - printk(KERN_INFO "md: Will configure md%d (%s) from %s, below.\n", - minor, pername, str); - md_setup_args.device_names[minor] = str; - - return 1; -} -static void __init md_setup_drive(void) -{ - int minor, i; - dev_t dev; - dev_t devices[MD_SB_DISKS+1]; - - for (minor = 0; minor < MAX_MD_DEVS; minor++) { - int fd; - int err = 0; - char *devname; - mdu_disk_info_t dinfo; - char name[16], devfs_name[16]; - - if (!(devname = md_setup_args.device_names[minor])) - continue; - - sprintf(name, "/dev/md%d", minor); - sprintf(devfs_name, "/dev/md/%d", minor); - create_dev(name, MKDEV(MD_MAJOR, minor), devfs_name); - for (i = 0; i < MD_SB_DISKS && devname != 0; i++) { - char *p; - char comp_name[64]; - struct stat buf; - - p = strchr(devname, ','); - if (p) - *p++ = 0; - - dev = name_to_dev_t(devname); - if (strncmp(devname, "/dev/", 5)) - devname += 5; - snprintf(comp_name, 63, "/dev/%s", devname); - if (sys_newstat(comp_name, &buf) == 0 && - S_ISBLK(buf.st_mode)) - dev = buf.st_rdev; - if (!dev) { - printk(KERN_WARNING "md: Unknown device name: %s\n", devname); - break; - } - - devices[i] = dev; - md_setup_args.device_set[minor] = 1; - - devname = p; - } - devices[i] = 0; - - if (!md_setup_args.device_set[minor]) - continue; - - printk(KERN_INFO "md: Loading md%d: %s\n", minor, md_setup_args.device_names[minor]); - - fd = open(name, 0, 0); - if (fd < 0) { - printk(KERN_ERR "md: open failed - cannot start array %d\n", minor); - continue; - } - if (sys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { - printk(KERN_WARNING - "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", - minor); - close(fd); - continue; - } - - if (md_setup_args.pers[minor]) { - /* non-persistent */ - mdu_array_info_t ainfo; - ainfo.level = pers_to_level(md_setup_args.pers[minor]); - 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; - - ainfo.state = (1 << MD_SB_CLEAN); - ainfo.layout = 0; - ainfo.chunk_size = md_setup_args.chunk[minor]; - err = sys_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 = sys_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); - sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); - } - } - if (!err) - err = sys_ioctl(fd, RUN_ARRAY, 0); - if (err) - printk(KERN_WARNING "md: starting md%d failed\n", minor); - close(fd); - } -} - -static int __init raid_setup(char *str) -{ - int len, pos; - - len = strlen(str) + 1; - pos = 0; - - while (pos < len) { - char *comma = strchr(str+pos, ','); - int wlen; - if (comma) - wlen = (comma-str)-pos; - else wlen = (len-1)-pos; - - if (!strncmp(str, "noautodetect", wlen)) - raid_setup_args.noautodetect = 1; - pos += wlen+1; - } - raid_setup_args.set = 1; - return 1; -} - -__setup("raid=", raid_setup); -__setup("md=", md_setup); -#endif - -static void __init md_run_setup(void) -{ -#ifdef CONFIG_BLK_DEV_MD - create_dev("/dev/md0", MKDEV(MD_MAJOR, 0), "md/0"); - if (raid_setup_args.noautodetect) - printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=noautodetect)\n"); - else { - int fd = open("/dev/md0", 0, 0); - if (fd >= 0) { - sys_ioctl(fd, RAID_AUTORUN, 0); - close(fd); - } - } - md_setup_drive(); -#endif -} diff --git a/init/do_mounts.h b/init/do_mounts.h index 76223ed32d2909..dcb5a52141be8f 100644 --- a/init/do_mounts.h +++ b/init/do_mounts.h @@ -7,12 +7,15 @@ #include <linux/slab.h> #include <linux/mount.h> -extern asmlinkage long sys_unlink(const char *name); -extern asmlinkage long sys_mknod(const char *name, int mode, dev_t dev); -extern asmlinkage long sys_newstat(char * filename, struct stat * statbuf); -extern asmlinkage long sys_mount(char *dev_name, char *dir_name, char *type, +asmlinkage long sys_unlink(const char *name); +asmlinkage long sys_mknod(const char *name, int mode, dev_t dev); +asmlinkage long sys_newstat(char * filename, struct stat * statbuf); +asmlinkage long sys_ioctl(int fd, int cmd, unsigned long arg); +asmlinkage long sys_mount(char *dev_name, char *dir_name, char *type, unsigned long flags, void *data); -extern asmlinkage long sys_umount(char *name, int flags); +asmlinkage long sys_umount(char *name, int flags); + +dev_t name_to_dev_t(char *name); #ifdef CONFIG_DEVFS_FS @@ -33,3 +36,13 @@ static inline int create_dev(char *name, dev_t dev, char *devfs_name) } #endif + +#ifdef CONFIG_BLK_DEV_MD + +void md_run_setup(void); + +#else + +static inline void md_run_setup(void) {} + +#endif diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c new file mode 100644 index 00000000000000..4da148027c8754 --- /dev/null +++ b/init/do_mounts_md.c @@ -0,0 +1,256 @@ + +#include <linux/raid/md.h> + +#include "do_mounts.h" + +/* + * When md (and any require personalities) are compiled into the kernel + * (not a module), arrays can be assembles are boot time using with AUTODETECT + * where specially marked partitions are registered with md_autodetect_dev(), + * and with MD_BOOT where devices to be collected are given on the boot line + * with md=..... + * The code for that is here. + */ + +struct { + int set; + int noautodetect; +} raid_setup_args __initdata; + +static struct { + char device_set [MAX_MD_DEVS]; + int pers[MAX_MD_DEVS]; + int chunk[MAX_MD_DEVS]; + char *device_names[MAX_MD_DEVS]; +} md_setup_args __initdata; + +/* + * Parse the command-line parameters given our kernel, but do not + * actually try to invoke the MD device now; that is handled by + * md_setup_drive after the low-level disk drivers have initialised. + * + * 27/11/1999: Fixed to work correctly with the 2.3 kernel (which + * assigns the task of parsing integer arguments to the + * invoked program now). Added ability to initialise all + * the MD devices (by specifying multiple "md=" lines) + * instead of just one. -- KTK + * 18May2000: Added support for persistent-superblock arrays: + * md=n,0,factor,fault,device-list uses RAID0 for device n + * md=n,-1,factor,fault,device-list uses LINEAR for device n + * md=n,device-list reads a RAID superblock from the devices + * elements in device-list are read by name_to_kdev_t so can be + * a hex number or something like /dev/hda1 /dev/sdb + * 2001-06-03: Dave Cinege <dcinege@psychosis.com> + * Shifted name_to_kdev_t() and related operations to md_set_drive() + * for later execution. Rewrote section to make devfs compatible. + */ +static int __init md_setup(char *str) +{ + int minor, level, factor, fault, pers; + char *pername = ""; + char *str1 = str; + + if (get_option(&str, &minor) != 2) { /* MD Number */ + printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); + return 0; + } + if (minor >= MAX_MD_DEVS) { + printk(KERN_WARNING "md: md=%d, Minor device number too high.\n", minor); + return 0; + } else if (md_setup_args.device_names[minor]) { + printk(KERN_WARNING "md: md=%d, Specified more than once. " + "Replacing previous definition.\n", minor); + } + switch (get_option(&str, &level)) { /* RAID Personality */ + case 2: /* could be 0 or -1.. */ + if (level == 0 || level == LEVEL_LINEAR) { + if (get_option(&str, &factor) != 2 || /* Chunk Size */ + get_option(&str, &fault) != 2) { + printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); + return 0; + } + md_setup_args.pers[minor] = level; + md_setup_args.chunk[minor] = 1 << (factor+12); + switch(level) { + case LEVEL_LINEAR: + pers = LINEAR; + pername = "linear"; + break; + case 0: + pers = RAID0; + pername = "raid0"; + break; + default: + printk(KERN_WARNING + "md: The kernel has not been configured for raid%d support!\n", + level); + return 0; + } + md_setup_args.pers[minor] = pers; + break; + } + /* FALL THROUGH */ + case 1: /* the first device is numeric */ + str = str1; + /* FALL THROUGH */ + case 0: + md_setup_args.pers[minor] = 0; + pername="super-block"; + } + + printk(KERN_INFO "md: Will configure md%d (%s) from %s, below.\n", + minor, pername, str); + md_setup_args.device_names[minor] = str; + + return 1; +} +static void __init md_setup_drive(void) +{ + int minor, i; + dev_t dev; + dev_t devices[MD_SB_DISKS+1]; + + for (minor = 0; minor < MAX_MD_DEVS; minor++) { + int fd; + int err = 0; + char *devname; + mdu_disk_info_t dinfo; + char name[16], devfs_name[16]; + + if (!(devname = md_setup_args.device_names[minor])) + continue; + + sprintf(name, "/dev/md%d", minor); + sprintf(devfs_name, "/dev/md/%d", minor); + create_dev(name, MKDEV(MD_MAJOR, minor), devfs_name); + for (i = 0; i < MD_SB_DISKS && devname != 0; i++) { + char *p; + char comp_name[64]; + struct stat buf; + + p = strchr(devname, ','); + if (p) + *p++ = 0; + + dev = name_to_dev_t(devname); + if (strncmp(devname, "/dev/", 5)) + devname += 5; + snprintf(comp_name, 63, "/dev/%s", devname); + if (sys_newstat(comp_name, &buf) == 0 && + S_ISBLK(buf.st_mode)) + dev = buf.st_rdev; + if (!dev) { + printk(KERN_WARNING "md: Unknown device name: %s\n", devname); + break; + } + + devices[i] = dev; + md_setup_args.device_set[minor] = 1; + + devname = p; + } + devices[i] = 0; + + if (!md_setup_args.device_set[minor]) + continue; + + printk(KERN_INFO "md: Loading md%d: %s\n", minor, md_setup_args.device_names[minor]); + + fd = open(name, 0, 0); + if (fd < 0) { + printk(KERN_ERR "md: open failed - cannot start array %d\n", minor); + continue; + } + if (sys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { + printk(KERN_WARNING + "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", + minor); + close(fd); + continue; + } + + if (md_setup_args.pers[minor]) { + /* non-persistent */ + mdu_array_info_t ainfo; + ainfo.level = pers_to_level(md_setup_args.pers[minor]); + 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; + + ainfo.state = (1 << MD_SB_CLEAN); + ainfo.layout = 0; + ainfo.chunk_size = md_setup_args.chunk[minor]; + err = sys_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 = sys_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); + sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); + } + } + if (!err) + err = sys_ioctl(fd, RUN_ARRAY, 0); + if (err) + printk(KERN_WARNING "md: starting md%d failed\n", minor); + close(fd); + } +} + +static int __init raid_setup(char *str) +{ + int len, pos; + + len = strlen(str) + 1; + pos = 0; + + while (pos < len) { + char *comma = strchr(str+pos, ','); + int wlen; + if (comma) + wlen = (comma-str)-pos; + else wlen = (len-1)-pos; + + if (!strncmp(str, "noautodetect", wlen)) + raid_setup_args.noautodetect = 1; + pos += wlen+1; + } + raid_setup_args.set = 1; + return 1; +} + +__setup("raid=", raid_setup); +__setup("md=", md_setup); + +void __init md_run_setup(void) +{ + create_dev("/dev/md0", MKDEV(MD_MAJOR, 0), "md/0"); + if (raid_setup_args.noautodetect) + printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=noautodetect)\n"); + else { + int fd = open("/dev/md0", 0, 0); + if (fd >= 0) { + sys_ioctl(fd, RAID_AUTORUN, 0); + close(fd); + } + } + md_setup_drive(); +} |