unsigned long long bitmapsize;
mdu_array_info_t array;
- int major = BITMAP_MAJOR_HI;
+ int major_num = BITMAP_MAJOR_HI;
memset(&array, 0, sizeof(array));
Name ": at least 2 raid-devices needed for level 4 or 5\n");
return 1;
}
+ if (level <= 0 && sparedisks) {
+ fprintf(stderr,
+ Name ": This level does not support spare devices\n");
+ return 1;
+ }
if (subdevs > raiddisks+sparedisks) {
fprintf(stderr, Name ": You have listed more devices (%d) than are in the array(%d)!\n", subdevs, raiddisks+sparedisks);
return 1;
case 10:
case 6:
case 0:
- case -1: /* linear */
+ case LEVEL_LINEAR: /* linear */
if (chunk == 0) {
chunk = 64;
if (verbose > 0)
fprintf(stderr, Name ": chunk size defaults to 64K\n");
}
break;
- default: /* raid1, multipath */
+ case 1:
+ case LEVEL_FAULTY:
+ case LEVEL_MULTIPATH:
if (chunk) {
chunk = 0;
if (verbose > 0)
fprintf(stderr, Name ": chunk size ignored for this level\n");
}
break;
+ default:
+ fprintf(stderr, Name ": unknown level %d\n", level);
+ return 1;
}
/* now look at the subdevs */
if (level > 0 || level == LEVEL_MULTIPATH || level == LEVEL_FAULTY) {
/* size is meaningful */
if (minsize > 0x100000000ULL && st->ss->major == 0) {
- fprintf(stderr, Name ": devices too large for RAID level %d\n", level);
+ fprintf(stderr, Name ": devices too large for RAID level %d\n", level);
return 1;
}
size = minsize;
break;
}
}
-
+
+ if (level <= 0 && first_missing != subdevs * 2) {
+ fprintf(stderr,
+ Name ": This level does not support missing devices\n");
+ return 1;
+ }
+
/* Ok, lets try some ioctls */
array.level = level;
return 1;
if (bitmap_file && vers < 9003) {
- major = BITMAP_MAJOR_HOSTENDIAN;
+ major_num = BITMAP_MAJOR_HOSTENDIAN;
#ifdef __BIG_ENDIAN
fprintf(stderr, Name ": Warning - bitmaps created on this kernel are not portable\n"
" between different architectured. Consider upgrading the Linux kernel.\n");
}
if (!st->ss->add_internal_bitmap(st, super, &bitmap_chunk,
delay, write_behind,
- bitmapsize, 1, major)) {
+ bitmapsize, 1, major_num)) {
fprintf(stderr, Name ": Given bitmap chunk size not supported.\n");
return 1;
}
inf.major_version = st->ss->major;
inf.minor_version = st->minor_version;
rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
- } else
+ } else
rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
if (rv) {
fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n",
if (bitmap_file) {
int uuid[4];
- st->ss->uuid_from_super(uuid, super);
+ st->ss->uuid_from_super(st, uuid, super);
if (CreateBitmap(bitmap_file, force, (char*)uuid, bitmap_chunk,
delay, write_behind,
bitmapsize,
- major)) {
+ major_num)) {
return 1;
}
bitmap_fd = open(bitmap_file, O_RDWR);
}
switch(pass){
case 1:
- st->ss->add_to_super(super, &disk);
+ st->ss->add_to_super(st, super, &disk);
break;
case 2:
if (disk.state == 1) break;
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
fprintf(stderr, Name ": ADD_NEW_DISK for %s failed: %s\n",
dv->devname, strerror(errno));
- free(super);
+ st->ss->free_super(st, super);
return 1;
}
if (dv == moved_disk && dnum != insert_point) break;
}
}
- free(super);
+ st->ss->free_super(st, super);
/* param is not actually used */
if (runstop == 1 || subdevs >= raiddisks) {