summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-06-07 23:03:46 +0000
committerNeil Brown <neilb@suse.de>2005-06-07 23:03:46 +0000
commitea32955930cc63d2fa445ff00437f5f767f7a4af (patch)
tree2778cbed10cdee740eea76dde1ab2f18f2ee6a09
parent8d75b7fce26fd0c41e53e9d9000ebbf969fd5fee (diff)
downloadmdadm-ea32955930cc63d2fa445ff00437f5f767f7a4af.tar.gz
mdadm-ea32955930cc63d2fa445ff00437f5f767f7a4af.tar.xz
mdadm-ea32955930cc63d2fa445ff00437f5f767f7a4af.zip
Increase max-devs on type-1 superblocks
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
-rw-r--r--Detail.c7
-rw-r--r--Grow.c2
-rw-r--r--mdadm.c6
-rw-r--r--mdadm.h1
-rw-r--r--super0.c2
-rw-r--r--super1.c4
6 files changed, 16 insertions, 6 deletions
diff --git a/Detail.c b/Detail.c
index 8d7a5ff..370177a 100644
--- a/Detail.c
+++ b/Detail.c
@@ -51,6 +51,7 @@ int Detail(char *dev, int brief, int test)
int is_rebuilding = 0;
int failed = 0;
struct supertype *st = NULL;
+ int max_disks = MD_SB_DISKS;
void *super = NULL;
int rv = test ? 4 : 1;
@@ -89,8 +90,10 @@ int Detail(char *dev, int brief, int test)
stb.st_rdev = 0;
rv = 0;
+ if (st) max_disks = st->max_devs;
+
/* try to load a superblock */
- for (d= 0; d<MD_SB_DISKS; d++) {
+ for (d= 0; d<max_disks; d++) {
mdu_disk_info_t disk;
char *dv;
disk.number = d;
@@ -210,7 +213,7 @@ int Detail(char *dev, int brief, int test)
printf(" Number Major Minor RaidDevice State\n");
}
- for (d= 0; d<MD_SB_DISKS; d++) {
+ for (d= 0; d < max_disks; d++) {
mdu_disk_info_t disk;
char *dv;
disk.number = d;
diff --git a/Grow.c b/Grow.c
index 817a17a..33e50c3 100644
--- a/Grow.c
+++ b/Grow.c
@@ -236,7 +236,7 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay)
}
if (strcmp(file, "internal") == 0) {
int d;
- for (d=0; d< MD_SB_DISKS; d++) {
+ for (d=0; d< st->max_devs; d++) {
mdu_disk_info_t disk;
char *dv;
disk.number = d;
diff --git a/mdadm.c b/mdadm.c
index 83b452e..6c7162a 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -50,6 +50,7 @@ int main(int argc, char *argv[])
int level = UnSet;
int layout = UnSet;
int raiddisks = 0;
+ int max_disks = MD_SB_DISKS;
int sparedisks = 0;
struct mddev_ident_s ident;
char *configfile = NULL;
@@ -302,6 +303,7 @@ int main(int argc, char *argv[])
fprintf(stderr, Name ": unrecognised metadata identifier: %s\n", optarg);
exit(2);
}
+ max_disks = ss->max_devs;
continue;
case O(GROW,'z'):
@@ -425,7 +427,7 @@ int main(int argc, char *argv[])
exit(2);
}
raiddisks = strtol(optarg, &c, 10);
- if (!optarg[0] || *c || raiddisks<=0 || raiddisks > MD_SB_DISKS) {
+ if (!optarg[0] || *c || raiddisks<=0 || raiddisks > max_disks) {
fprintf(stderr, Name ": invalid number of raid devices: %s\n",
optarg);
exit(2);
@@ -451,7 +453,7 @@ int main(int argc, char *argv[])
exit(2);
}
sparedisks = strtol(optarg, &c, 10);
- if (!optarg[0] || *c || sparedisks < 0 || sparedisks > MD_SB_DISKS - raiddisks) {
+ if (!optarg[0] || *c || sparedisks < 0 || sparedisks > max_disks - raiddisks) {
fprintf(stderr, Name ": invalid number of spare-devices: %s\n",
optarg);
exit(2);
diff --git a/mdadm.h b/mdadm.h
index 3f8424e..f82574a 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -194,6 +194,7 @@ extern struct superswitch {
struct supertype {
struct superswitch *ss;
int minor_version;
+ int max_devs;
};
extern struct supertype *super_by_version(int vers, int minor);
diff --git a/super0.c b/super0.c
index a2e7700..1c2bb5e 100644
--- a/super0.c
+++ b/super0.c
@@ -589,6 +589,7 @@ static int load_super0(struct supertype *st, int fd, void **sbp, char *devname)
if (st->ss == NULL) {
st->ss = &super0;
st->minor_version = 90;
+ st->max_devs = MD_SB_DISKS;
}
return 0;
@@ -601,6 +602,7 @@ static struct supertype *match_metadata_desc0(char *arg)
st->ss = &super0;
st->minor_version = 90;
+ st->max_devs = MD_SB_DISKS;
if (strcmp(arg, "0") == 0 ||
strcmp(arg, "0.90") == 0 ||
strcmp(arg, "default") == 0
diff --git a/super1.c b/super1.c
index c5813b9..1f6cbe2 100644
--- a/super1.c
+++ b/super1.c
@@ -399,7 +399,7 @@ static int init_super1(void **sbp, mdu_array_info_t *info)
sb->ctime = __cpu_to_le64((unsigned long long)time(0));
sb->level = __cpu_to_le32(info->level);
- sb->layout = __cpu_to_le32(info->level);
+ sb->layout = __cpu_to_le32(info->layout);
sb->size = __cpu_to_le64(info->size*2ULL);
sb->chunksize = __cpu_to_le32(info->chunk_size>>9);
sb->raid_disks = __cpu_to_le32(info->raid_disks);
@@ -621,6 +621,7 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
int rv;
st->minor_version = bestvers;
st->ss = &super1;
+ st->max_devs = 384;
rv = load_super1(st, fd, sbp, devname);
if (rv) st->ss = NULL;
return rv;
@@ -719,6 +720,7 @@ static struct supertype *match_metadata_desc1(char *arg)
if (!st) return st;
st->ss = &super1;
+ st->max_devs = 384;
if (strcmp(arg, "1") == 0 ||
strcmp(arg, "1.0") == 0) {
st->minor_version = 0;