It isn't generally meaningful.
== devices[devcnt].i.events
&& (devices[best[i]].i.disk.minor
!= devices[devcnt].i.disk.minor)
- && st->ss->major == 0
- && info.array.level != -4) {
+ && st->ss == &super0
+ && info.array.level != LEVEL_MULTIPATH) {
/* two different devices with identical superblock.
* Could be a mis-detection caused by overlapping
* partitions. fail-safe.
if ((vers % 100) >= 1) { /* can use different versions */
mdu_array_info_t inf;
memset(&inf, 0, sizeof(inf));
- inf.major_version = st->ss->major;
- inf.minor_version = st->minor_version;
+ inf.major_version = info.array.major_version;
+ inf.minor_version = info.array.minor_version;
rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
} else
rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
unsigned long long bitmapsize;
struct mdinfo *sra;
struct mdinfo info;
+ int did_default = 0;
int major_num = BITMAP_MAJOR_HI;
dname);
exit(2);
}
- if (st->ss->major != 0 ||
+ if (st->ss != &super0 ||
st->minor_version != 90)
- fprintf(stderr, Name ": Defaulting to version"
- " %d.%d metadata\n",
- st->ss->major,
- st->minor_version);
+ did_default = 1;
} else {
if (!st->ss->validate_geometry(st, level, layout,
raiddisks,
}
if (level > 0 || level == LEVEL_MULTIPATH
|| level == LEVEL_FAULTY
- || (st && st->ss->external) ) {
+ || st->ss->external ) {
/* size is meaningful */
- if (minsize > 0x100000000ULL && st->ss->major == 0) {
+ if (!st->ss->validate_geometry(st, level, layout,
+ raiddisks,
+ chunk, minsize,
+ NULL, NULL)) {
fprintf(stderr, Name ": devices too large for RAID level %d\n", level);
return 1;
}
+ info.array.failed_disks;
info.array.layout = layout;
info.array.chunk_size = chunk*1024;
- info.array.major_version = st->ss->major;
+ info.array.major_version = 0; /* Flag to say "not zeroing superblock" */
if (name == NULL || *name == 0) {
/* base name on mddev */
st->ss->getinfo_super(st, &info);
+ if (did_default)
+ fprintf(stderr, Name ": Defaulting to version"
+ " %s metadata\n", info.text_version);
+
if (bitmap_file && vers < 9003) {
major_num = BITMAP_MAJOR_HOSTENDIAN;
#ifdef __BIG_ENDIAN
} else if ((vers % 100) >= 1) { /* can use different versions */
mdu_array_info_t inf;
memset(&inf, 0, sizeof(inf));
- inf.major_version = st->ss->major;
- inf.minor_version = st->minor_version;
+ inf.major_version = info.array.major_version;
+ inf.minor_version = info.array.minor_version;
rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
} else
rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
/* - add the device */
mdu_array_info_t ainf;
mdu_disk_info_t disk;
- char md[20];
struct mdinfo *sra;
memset(&ainf, 0, sizeof(ainf));
- ainf.major_version = st->ss->major;
- ainf.minor_version = st->minor_version;
+ ainf.major_version = info.array.major_version;
+ ainf.minor_version = info.array.minor_version;
if (ioctl(mdfd, SET_ARRAY_INFO, &ainf) != 0) {
fprintf(stderr, Name
": SET_ARRAY_INFO failed for %s: %s\b",
close(mdfd);
return 2;
}
- sprintf(md, "%d.%d\n", st->ss->major, st->minor_version);
sra = sysfs_read(mdfd, devnum, GET_VERSION);
- sysfs_set_str(sra, NULL, "metadata_version", md);
+ sysfs_set_str(sra, NULL, "metadata_version", info.text_version);
memset(&disk, 0, sizeof(disk));
disk.major = major(stb.st_rdev);
disk.minor = minor(stb.st_rdev);
int err;
struct mdinfo *sra;
struct supertype *st2;
- sra = sysfs_read(mdfd, devnum, (GET_VERSION | GET_DEVS |
- GET_STATE));
+ sra = sysfs_read(mdfd, devnum, (GET_DEVS | GET_STATE));
- if (sra->array.major_version != st->ss->major ||
- sra->array.minor_version != st->minor_version) {
- if (verbose >= 0)
- fprintf(stderr, Name
- ": %s has different metadata to chosen array %s %d.%d %d.%d.\n",
- devname, chosen_name,
- sra->array.major_version,
- sra->array.minor_version,
- st->ss->major, st->minor_version);
- close(mdfd);
- return 1;
- }
sprintf(dn, "%d:%d", sra->devs->disk.major,
sra->devs->disk.minor);
dfd2 = dev_open(dn, O_RDONLY);
st2 = dup_super(st);
- if (st2->ss->load_super(st2, dfd2, NULL)) {
+ if (st2->ss->load_super(st2, dfd2, NULL) ||
+ st->ss->compare_super(st, st2) != 0) {
fprintf(stderr, Name
- ": Strange error loading metadata for %s.\n",
- chosen_name);
+ ": metadata mismatch between %s and "
+ "chosen array %s\n",
+ devname, chosen_name);
close(mdfd);
close(dfd2);
return 2;
if (superror == 0) {
/* array might be active... */
st->ss->getinfo_super(st, &info);
- if (st->ss->major == 0) {
+ if (st->ss == &super0) {
mddev = get_md_name(info.array.md_minor);
disc.number = info.disk.number;
activity = "undetected";
activity,
map_num(pers, info.array.level),
mddev);
- if (st->ss->major == 0)
+ if (st->ss == &super0)
put_md_name(mddev);
}
return 0;
struct mdinfo *(*activate_spare)(struct active_array *a,
struct metadata_update **updates);
- int major;
int swapuuid; /* true if uuid is bigending rather than hostendian */
int external;
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
.match_metadata_desc = match_metadata_desc_ddf,
.getinfo_super_n = getinfo_super_n_container,
- .major = 1000,
.swapuuid = 0,
.external = 1,
.container_content = container_content_ddf,
.getinfo_super_n = getinfo_super_n_container,
- .major = 1000,
.swapuuid = 0,
.external = 1,
};
.free_super = free_super_ddf,
.match_metadata_desc = match_metadata_desc_ddf_bvd,
- .major = 1001,
.swapuuid = 0,
.external = 2,
};
.free_super = free_super_ddf,
.match_metadata_desc = match_metadata_desc_ddf_svd,
- .major = 1002,
.swapuuid = 0,
.external = 2,
};
.getinfo_super_n = getinfo_super_n_imsm_container,
.validate_geometry = validate_geometry_imsm,
- .major = 2000,
.swapuuid = 0,
.external = 1,
.container_content = container_content_imsm,
- .major = 2000,
.swapuuid = 0,
.external = 1,
};
.validate_geometry = validate_geometry_imsm_volume,
- .major = 2001,
.swapuuid = 0,
.external = 2,
};
.write_bitmap = write_bitmap0,
.free_super = free_super0,
.validate_geometry = validate_geometry0,
- .major = 0,
.swapuuid = 0,
};
int role;
info->array.major_version = 1;
- info->array.minor_version = __le32_to_cpu(sb->feature_map);
+ info->array.minor_version = st->minor_version;
info->array.patch_version = 0;
info->array.raid_disks = __le32_to_cpu(sb->raid_disks);
info->array.level = __le32_to_cpu(sb->level);
.write_bitmap = write_bitmap1,
.free_super = free_super1,
.validate_geometry = validate_geometry1,
- .major = 1,
#if __BYTE_ORDER == BIG_ENDIAN
.swapuuid = 0,
#else
sra->array.major_version = -1;
sra->array.minor_version = -2;
strcpy(sra->text_version, buf+9);
- } else
+ } else {
sscanf(buf, "%d.%d",
&sra->array.major_version,
&sra->array.minor_version);
+ strcpy(sra->text_version, buf);
+ }
}
if (options & GET_LEVEL) {
strcpy(base, "level");