]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Reduce dependance on MD_SB_DISKS
authorNeil Brown <neilb@suse.de>
Tue, 28 Mar 2006 23:02:45 +0000 (23:02 +0000)
committerNeil Brown <neilb@suse.de>
Tue, 28 Mar 2006 23:02:45 +0000 (23:02 +0000)
--monitor should now work with arrays larger than 28 devices.

Signed-off-by: Neil Brown <neilb@suse.de>
Detail.c
Monitor.c
mdadm.c

index 25b31c48aa0cd22da644abd96993b58ddf854fe0..8fa044a5315cf8ecfe4c444d91cdf3e197c8fb41 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -53,7 +53,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;
+       int max_disks = MD_SB_DISKS; /* just a default */
        struct mdinfo info;
 
        void *super = NULL;
index 0ab5e0cea5ffdd53d3476f8a3315a39ac6495cc9..55f5c967307e06edda29fd8fc7bb00c5f6b823ae 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -46,6 +46,11 @@ static char *percentalerts[] = {
        "Rebuild80",
 };
 
+/* The largest number of disks current arrays can manage is 384
+ * This really should be dynamically, but that will have to wait
+ * At least it isn't MD_SB_DISKS.
+ */
+#define MaxDisks 384
 int Monitor(mddev_dev_t devlist,
            char *mailaddr, char *alert_cmd,
            int period, int daemonise, int scan, int oneshot,
@@ -101,8 +106,8 @@ int Monitor(mddev_dev_t devlist,
                char *spare_group;
                int active, working, failed, spare, raid;
                int expected_spares;
-               int devstate[MD_SB_DISKS];
-               int devid[MD_SB_DISKS];
+               int devstate[MaxDisks];
+               int devid[MaxDisks];
                int percent;
                struct state *next;
        } *statelist = NULL;
@@ -300,21 +305,26 @@ int Monitor(mddev_dev_t devlist,
 
                        if (mse)
                                st->percent = mse->percent;
-                                       
-                       for (i=0; i<MD_SB_DISKS; i++) {
+
+                       for (i=0; i<MaxDisks; i++) {
                                mdu_disk_info_t disc;
                                int newstate=0;
                                int change;
                                char *dv = NULL;
                                disc.number = i;
-                               if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
+                               if (i > array.raid_disks + array.nr_disks) {
+                                       newstate = 0;
+                                       disc.major = disc.minor = 0;
+                               } else if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
                                        newstate = disc.state;
                                        dv = map_dev(disc.major, disc.minor, 1);
-                               } else if (mse &&  mse->pattern && i < strlen(mse->pattern))
+                               } else if (mse &&  mse->pattern && i < strlen(mse->pattern)) {
                                        switch(mse->pattern[i]) {
                                        case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
                                        case '_': newstate = 0; break;
                                        }
+                                       disc.major = disc.minor = 0;
+                               }
                                if (dv == NULL && st->devid[i])
                                        dv = map_dev(major(st->devid[i]),
                                                     minor(st->devid[i]), 1);
@@ -412,7 +422,7 @@ int Monitor(mddev_dev_t devlist,
                                                        if (fd2>=0) close(fd2);
                                                        continue;
                                                }
-                                               for (d=st2->raid; d<MD_SB_DISKS; d++) {
+                                               for (d=st2->raid; d < MaxDisks; d++) {
                                                        if (st2->devid[d] > 0 &&
                                                            st2->devstate[d] == 0) {
                                                                dev = st2->devid[d];
diff --git a/mdadm.c b/mdadm.c
index 6e57c5bc2f812a75bf33bd18e9b706813bd7f40d..b32158ed7bdbdca9287de71b4672e4de051fd326 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -49,7 +49,7 @@ int main(int argc, char *argv[])
        int level = UnSet;
        int layout = UnSet;
        int raiddisks = 0;
-       int max_disks = MD_SB_DISKS;
+       int max_disks = MD_SB_DISKS; /* just a default */
        int sparedisks = 0;
        struct mddev_ident_s ident;
        char *configfile = NULL;