From e27d562bcc3936d8988a46943881e2641d3d9036 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 28 Mar 2006 23:02:45 +0000 Subject: [PATCH] Reduce dependance on MD_SB_DISKS --monitor should now work with arrays larger than 28 devices. Signed-off-by: Neil Brown --- Detail.c | 2 +- Monitor.c | 24 +++++++++++++++++------- mdadm.c | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Detail.c b/Detail.c index 25b31c48..8fa044a5 100644 --- 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; diff --git a/Monitor.c b/Monitor.c index 0ab5e0ce..55f5c967 100644 --- 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= 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; draid; 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 6e57c5bc..b32158ed 100644 --- 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; -- 2.39.2