diff -u mdadm-1.6.0-orig/Detail.c mdadm-1.6.0-dg/Detail.c --- mdadm-1.6.0-orig/Detail.c 2004-06-04 07:18:47.000000000 +0100 +++ mdadm-1.6.0-dg/Detail.c 2004-06-04 15:38:11.000000000 +0100 @@ -47,6 +47,8 @@ char *devices = NULL; int spares = 0; struct stat stb; + struct mdstat_ent *ms; + struct mdstat_ent *e; mdp_super_t super; int have_super = 0; @@ -85,13 +87,12 @@ rv = 0; /* Ok, we have some info to print... */ c = map_num(pers, array.level); + ms = mdstat_read(0); if (brief) printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks ); else { unsigned long array_size; unsigned long long larray_size; - struct mdstat_ent *ms = mdstat_read(0); - struct mdstat_ent *e; int devnum = array.md_minor; if (MAJOR(stb.st_rdev) != MD_MAJOR) devnum = -1 - devnum; @@ -109,7 +110,7 @@ larray_size <<= 9; } - else larray_size = 0; + else larray_size = 0; printf("%s:\n", dev); printf(" Version : %02d.%02d.%02d\n", @@ -158,12 +159,12 @@ if (e && e->percent >= 0) printf(" Rebuild Status : %d%% complete\n\n", e->percent); - free_mdstat(ms); printf(" Number Major Minor RaidDevice State\n"); } for (d= 0; dpercent >= 0) + /* a disk is rebuilding */ + /* look through mdstat response and see if it's me*/ + for (msdi=ms->devinfo;msdi;msdi=msdi->next) + if (msdi->arr_pos == disk.number) + printf(" rebuilding"); + printf(" spare"); + } } if (test && d < array.raid_disks && disk.state & (1<active = 1; else if (strcmp(w, "inactive")==0) @@ -168,7 +182,30 @@ ent->level == NULL && w[0] != '(' /*readonly*/) ent->level = strdup(w); - else if (!ent->pattern && + else if (ent->active >=0 && + ent->level && + /* dev[%d] only, not dev[%d](F) or [UUU] or [1/4] */ + /* ie only disks in the array */ + w[l-1] == ']' && w[0] != '[' && + (cpos=strchr(w, '[')) != NULL ) { + struct mdstat_ent_devinfo *new_ed; + /* fprintf(stderr, "found %s\n", w); */ + new_ed = malloc(sizeof(*new_ed)); + if (!new_ed) { + fprintf(stderr, Name ": malloc failed reading /proc/mdstat.\n"); + free_line(line); + free_mdstat(ent); + break; + } + new_ed->name=strdup(w); /* no strndup() */ + cpos = strchr(new_ed->name, '['); + if (cpos) *cpos = '\0'; + new_ed->arr_pos=atoi(cpos+1); + /* fprintf(stderr, "found /dev/%s @ pos=%d\n", new_ed->name,new_ed->arr_pos); */ + new_ed->next=NULL; + *end_ed = new_ed; + end_ed = &new_ed->next; + } else if (!ent->pattern && w[0] == '[' && (w[1] == 'U' || w[1] == '_')) { ent->pattern = strdup(w+1); @@ -177,8 +214,8 @@ } else if (ent->percent == -1 && strncmp(w, "re", 2)== 0 && w[l-1] == '%' && - (eq=strchr(w, '=')) != NULL ) { - ent->percent = atoi(eq+1); + (cpos=strchr(w, '=')) != NULL ) { + ent->percent = atoi(cpos+1); } else if (ent->percent == -1 && w[0] >= '0' && w[0] <= '9' &&