]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Increase max-devs on type-1 superblocks
authorNeil Brown <neilb@suse.de>
Tue, 7 Jun 2005 23:03:46 +0000 (23:03 +0000)
committerNeil Brown <neilb@suse.de>
Tue, 7 Jun 2005 23:03:46 +0000 (23:03 +0000)
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Detail.c
Grow.c
mdadm.c
mdadm.h
super0.c
super1.c

index 8d7a5ffc4a7a99a769847a41b7a474e31b5e9c36..370177a4e9586d4f902196da49bdf848e6118ded 100644 (file)
--- 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 817a17a8e5b667cae63e4b7e0156572be58dff4f..33e50c35567f937a7943872d2e06c770fd6b3fe6 100644 (file)
--- 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 83b452e25fdbd59e16b233372b4f8b24abf84c53..6c7162a7a164b927a88262113740f5221869b9c8 100644 (file)
--- 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 3f8424e53c0302c7e45771d6dd14c14353bc72f6..f82574a013f16e649d0b1f3556ba701651e066fd 100644 (file)
--- 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);
index a2e77005e385bf126496f07be58ca49abcc60770..1c2bb5e06a976a62373bfe5d54de25508e09f4a5 100644 (file)
--- 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
index c5813b9c4e04542d6871c5e5bbe047241daf838d..1f6cbe2e5b05aeac4016b2c80564a56246b96c4a 100644 (file)
--- 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;