#define START_MD _IO (MD_MAJOR, 2)
#define STOP_MD _IO (MD_MAJOR, 3)
-int Build(char *mddev, int mdfd, int chunk, int level,
+int Build(char *mddev, int mdfd, int chunk, int level, int layout,
int raiddisks,
- mddev_dev_t devlist)
+ mddev_dev_t devlist, int assume_clean)
{
/* Build a linear or raid0 arrays without superblocks
* We cannot really do any checks, we just do it.
* SET_ARRAY_INFO, ADD_NEW_DISK, RUN_ARRAY
*
*/
+ int verbose = 0;
int i;
int vers;
struct stat stb;
return 1;
}
+ if (layout == UnSet)
+ switch(level) {
+ default: /* no layout */
+ layout = 0;
+ break;
+ case 10:
+ layout = 0x102; /* near=2, far=1 */
+ if (verbose)
+ fprintf(stderr,
+ Name ": layout defaults to n1\n");
+ break;
+ case 5:
+ case 6:
+ layout = map_name(r5layout, "default");
+ if (verbose)
+ fprintf(stderr,
+ Name ": layout defaults to %s\n", map_num(r5layout, layout));
+ break;
+ case LEVEL_FAULTY:
+ layout = map_name(faultylayout, "default");
+
+ if (verbose)
+ fprintf(stderr,
+ Name ": layout defaults to %s\n", map_num(faultylayout, layout));
+ break;
+ }
+
+
vers = md_get_version(mdfd);
/* looks Ok, go for it */
array.raid_disks = raiddisks;
array.md_minor = 0;
if (fstat(mdfd, &stb)==0)
- array.md_minor = MINOR(stb.st_rdev);
+ array.md_minor = minor(stb.st_rdev);
array.not_persistent = 1;
array.state = 0; /* not clean, but no errors */
+ if (assume_clean)
+ array.state |= 1;
array.active_disks = raiddisks;
array.working_disks = raiddisks;
array.spare_disks = 0;
if (chunk == 0)
chunk = 64;
array.chunk_size = chunk*1024;
+ array.layout = layout;
if (ioctl(mdfd, SET_ARRAY_INFO, &array)) {
fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n",
mddev, strerror(errno));
disk.number = i;
disk.raid_disk = i;
disk.state = 6;
- disk.major = MAJOR(stb.st_rdev);
- disk.minor = MINOR(stb.st_rdev);
+ disk.major = major(stb.st_rdev);
+ disk.minor = minor(stb.st_rdev);
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
fprintf(stderr, Name ": ADD_NEW_DISK failed for %s: %s\n",
dv->devname, strerror(errno));
}
} else {
if (ioctl(mdfd, REGISTER_DEV, &stb.st_rdev)) {
- fprintf(stderr, Name ": REGISTER_DEV failed for %s.\n",
+ fprintf(stderr, Name ": REGISTER_DEV failed for %s: %s.\n",
dv->devname, strerror(errno));
goto abort;
}