From: Neil Brown Date: Fri, 14 Dec 2007 09:14:59 +0000 (+1100) Subject: Replace sysarray with mdinfo X-Git-Tag: mdadm-2.6.5~28 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=7e0f69790c47b21c4aa7636a4b05925687c80a6e Replace sysarray with mdinfo Sure, mdinfo is bigger, but having a uniform structure for lots of things will make life easier. --- diff --git a/Grow.c b/Grow.c index c02ff800..b24e9587 100644 --- a/Grow.c +++ b/Grow.c @@ -435,7 +435,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, int nrdisks; int err; - struct sysarray *sra; + struct mdinfo *sra; struct mdinfo *sd; if (ioctl(fd, GET_ARRAY_INFO, &array) < 0) { @@ -631,13 +631,13 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, devname); return 1; } - if (sra->spares == 0 && backup_file == NULL) { + if (sra->array.spare_disks == 0 && backup_file == NULL) { fprintf(stderr, Name ": %s: Cannot grow - need a spare or backup-file to backup critical section\n", devname); return 1; } - nrdisks = array.nr_disks + sra->spares; + nrdisks = array.nr_disks + sra->array.spare_disks; /* Now we need to open all these devices so we can read/write. */ fdlist = malloc((1+nrdisks) * sizeof(int)); @@ -683,7 +683,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, " --grow aborted\n", devname, i); goto abort; } - spares = sra->spares; + spares = sra->array.spare_disks; if (backup_file) { fdlist[d] = open(backup_file, O_RDWR|O_CREAT|O_EXCL, 0600); if (fdlist[d] < 0) { diff --git a/Incremental.c b/Incremental.c index df5314dd..ab37ef0c 100644 --- a/Incremental.c +++ b/Incremental.c @@ -32,7 +32,7 @@ static int count_active(struct supertype *st, int mdfd, char **availp, struct mdinfo *info); -static void find_reject(int mdfd, struct supertype *st, struct sysarray *sra, +static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra, int number, __u64 events, int verbose, char *array_name); @@ -279,7 +279,7 @@ int Incremental(char *devname, int verbose, int runstop, mdu_array_info_t ainf; mdu_disk_info_t disk; char md[20]; - struct sysarray *sra; + struct mdinfo *sra; memset(&ainf, 0, sizeof(ainf)); ainf.major_version = st->ss->major; @@ -328,17 +328,18 @@ int Incremental(char *devname, int verbose, int runstop, int dfd2; mdu_disk_info_t disk; int err; - struct sysarray *sra; + struct mdinfo *sra; struct supertype *st2; sra = sysfs_read(mdfd, devnum, (GET_VERSION | GET_DEVS | GET_STATE)); - if (sra->major_version != st->ss->major || - sra->minor_version != st->minor_version) { + if (sra->array.major_version != st->ss->major || + sra->array.minor_version != st->minor_version) { if (verbose >= 0) fprintf(stderr, Name ": %s has different metadata to chosen array %s %d.%d %d.%d.\n", devname, chosen_name, - sra->major_version, sra->minor_version, + sra->array.major_version, + sra->array.minor_version, st->ss->major, st->minor_version); close(mdfd); return 1; @@ -427,7 +428,7 @@ int Incremental(char *devname, int verbose, int runstop, } } if (runstop > 0 || active_disks >= info.array.working_disks) { - struct sysarray *sra; + struct mdinfo *sra; /* Let's try to start it */ if (match && match->bitmap_file) { int bmfd = open(match->bitmap_file, O_RDWR); @@ -477,7 +478,7 @@ int Incremental(char *devname, int verbose, int runstop, return rv; } -static void find_reject(int mdfd, struct supertype *st, struct sysarray *sra, +static void find_reject(int mdfd, struct supertype *st, struct mdinfo *sra, int number, __u64 events, int verbose, char *array_name) { @@ -528,7 +529,7 @@ static int count_active(struct supertype *st, int mdfd, char **availp, struct mdinfo *d; int cnt = 0, cnt1 = 0; __u64 max_events = 0; - struct sysarray *sra = sysfs_read(mdfd, -1, GET_DEVS | GET_STATE); + struct mdinfo *sra = sysfs_read(mdfd, -1, GET_DEVS | GET_STATE); char *avail = NULL; for (d = sra->devs ; d ; d = d->next) { @@ -595,7 +596,7 @@ void RebuildMap(void) int mdp = get_mdp_major(); for (md = mdstat ; md ; md = md->next) { - struct sysarray *sra = sysfs_read(-1, md->devnum, GET_DEVS); + struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_DEVS); struct mdinfo *sd; for (sd = sra->devs ; sd ; sd = sd->next) { @@ -654,7 +655,7 @@ int IncrementalScan(int verbose) char path[1024]; mdu_array_info_t array; mdu_bitmap_file_t bmf; - struct sysarray *sra; + struct mdinfo *sra; int mdfd = open_mddev_devnum(me->path, me->devnum, NULL, path); if (mdfd < 0) continue; diff --git a/Monitor.c b/Monitor.c index d43e5531..6b0c760b 100644 --- a/Monitor.c +++ b/Monitor.c @@ -312,7 +312,7 @@ int Monitor(mddev_dev_t devlist, * If there is a number in /mismatch_cnt, * we should report that. */ - struct sysarray *sra = + struct mdinfo *sra = sysfs_read(-1, st->devnum, GET_MISMATCH); if (sra && sra->mismatch_cnt > 0) { char cnt[40]; diff --git a/mdadm.h b/mdadm.h index 483a072e..1a7db812 100644 --- a/mdadm.h +++ b/mdadm.h @@ -132,8 +132,12 @@ struct mdinfo { unsigned long long reshape_progress; int new_level, delta_disks, new_layout, new_chunk; int errors; + int cache_size; /* size of raid456 stripe cache*/ + int mismatch_cnt; + char text_version[50]; char sys_name[20]; + struct mdinfo *devs; struct mdinfo *next; }; @@ -272,18 +276,6 @@ extern void map_free(struct map_ent *map); extern void map_add(struct map_ent **melp, int devnum, int major, int minor, int uuid[4], char *path); -struct sysarray { - char name[20]; - struct mdinfo *devs; - int chunk; - unsigned long long component_size; - int layout; - int level; - int spares; - int cache_size; - int mismatch_cnt; - int major_version, minor_version; -}; /* various details can be requested */ #define GET_LEVEL 1 #define GET_LAYOUT 2 @@ -302,13 +294,13 @@ struct sysarray { /* If fd >= 0, get the array it is open on, * else use devnum. >=0 -> major9. <0..... */ -extern void sysfs_free(struct sysarray *sra); -extern struct sysarray *sysfs_read(int fd, int devnum, unsigned long options); -extern int sysfs_set_str(struct sysarray *sra, struct mdinfo *dev, +extern void sysfs_free(struct mdinfo *sra); +extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options); +extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev, char *name, char *val); -extern int sysfs_set_num(struct sysarray *sra, struct mdinfo *dev, +extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev, char *name, unsigned long long val); -extern int sysfs_get_ll(struct sysarray *sra, struct mdinfo *dev, +extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev, char *name, unsigned long long *val); diff --git a/sysfs.c b/sysfs.c index 970d2117..f198d164 100644 --- a/sysfs.c +++ b/sysfs.c @@ -42,19 +42,21 @@ int load_sys(char *path, char *buf) return 0; } -void sysfs_free(struct sysarray *sra) +void sysfs_free(struct mdinfo *sra) { - if (!sra) - return; - while (sra->devs) { - struct mdinfo *d = sra->devs; - sra->devs = d->next; - free(d); + while (sra) { + struct mdinfo *sra2 = sra->next; + while (sra->devs) { + struct mdinfo *d = sra->devs; + sra->devs = d->next; + free(d); + } + free(sra); + sra = sra2; } - free(sra); } -struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) +struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options) { /* Longest possible name in sysfs, mounted at /sys, is * /sys/block/md_dXXX/md/dev-XXXXX/block/dev @@ -65,7 +67,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) char buf[1024]; char *base; char *dbase; - struct sysarray *sra; + struct mdinfo *sra; struct mdinfo *dev; DIR *dir; struct dirent *de; @@ -73,6 +75,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) sra = malloc(sizeof(*sra)); if (sra == NULL) return sra; + sra->next = NULL; if (fd >= 0) { struct stat stb; @@ -81,18 +84,18 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) if (ioctl(fd, RAID_VERSION, &vers) != 0) return NULL; if (major(stb.st_rdev)==9) - sprintf(sra->name, "md%d", minor(stb.st_rdev)); + sprintf(sra->sys_name, "md%d", minor(stb.st_rdev)); else - sprintf(sra->name, "md_d%d", + sprintf(sra->sys_name, "md_d%d", minor(stb.st_rdev)>>MdpMinorShift); } else { if (devnum >= 0) - sprintf(sra->name, "md%d", devnum); + sprintf(sra->sys_name, "md%d", devnum); else - sprintf(sra->name, "md_d%d", + sprintf(sra->sys_name, "md_d%d", -1-devnum); } - sprintf(fname, "/sys/block/%s/md/", sra->name); + sprintf(fname, "/sys/block/%s/md/", sra->sys_name); base = fname + strlen(fname); sra->devs = NULL; @@ -101,22 +104,24 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) if (load_sys(fname, buf)) goto abort; if (strncmp(buf, "none", 4) == 0) - sra->major_version = sra->minor_version = -1; + sra->array.major_version = + sra->array.minor_version = -1; else sscanf(buf, "%d.%d", - &sra->major_version, &sra->minor_version); + &sra->array.major_version, + &sra->array.minor_version); } if (options & GET_LEVEL) { strcpy(base, "level"); if (load_sys(fname, buf)) goto abort; - sra->level = map_name(pers, buf); + sra->array.level = map_name(pers, buf); } if (options & GET_LAYOUT) { strcpy(base, "layout"); if (load_sys(fname, buf)) goto abort; - sra->layout = strtoul(buf, NULL, 0); + sra->array.layout = strtoul(buf, NULL, 0); } if (options & GET_COMPONENT) { strcpy(base, "component_size"); @@ -130,7 +135,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) strcpy(base, "chunk_size"); if (load_sys(fname, buf)) goto abort; - sra->chunk = strtoul(buf, NULL, 0); + sra->array.chunk_size = strtoul(buf, NULL, 0); } if (options & GET_CACHE) { strcpy(base, "stripe_cache_size"); @@ -153,7 +158,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) dir = opendir(fname); if (!dir) goto abort; - sra->spares = 0; + sra->array.spare_disks = 0; while ((de = readdir(dir)) != NULL) { char *ep; @@ -205,7 +210,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options) if (strstr(buf, "faulty")) dev->disk.state |= (1<disk.state == 0) - sra->spares++; + sra->array.spare_disks++; } if (options & GET_ERROR) { strcpy(buf, "errors"); @@ -251,14 +256,14 @@ unsigned long long get_component_size(int fd) return strtoull(fname, NULL, 10) * 2; } -int sysfs_set_str(struct sysarray *sra, struct mdinfo *dev, +int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev, char *name, char *val) { char fname[50]; int n; int fd; sprintf(fname, "/sys/block/%s/md/%s/%s", - sra->name, dev?dev->sys_name:"", name); + sra->sys_name, dev?dev->sys_name:"", name); fd = open(fname, O_WRONLY); if (fd < 0) return -1; @@ -269,7 +274,7 @@ int sysfs_set_str(struct sysarray *sra, struct mdinfo *dev, return 0; } -int sysfs_set_num(struct sysarray *sra, struct mdinfo *dev, +int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev, char *name, unsigned long long val) { char valstr[50]; @@ -277,7 +282,7 @@ int sysfs_set_num(struct sysarray *sra, struct mdinfo *dev, return sysfs_set_str(sra, dev, name, valstr); } -int sysfs_get_ll(struct sysarray *sra, struct mdinfo *dev, +int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev, char *name, unsigned long long *val) { char fname[50]; @@ -286,7 +291,7 @@ int sysfs_get_ll(struct sysarray *sra, struct mdinfo *dev, int fd; char *ep; sprintf(fname, "/sys/block/%s/md/%s/%s", - sra->name, dev?dev->sys_name:"", name); + sra->sys_name, dev?dev->sys_name:"", name); fd = open(fname, O_RDONLY); if (fd < 0) return -1; diff --git a/util.c b/util.c index 732bc1c4..dd8b176a 100644 --- a/util.c +++ b/util.c @@ -729,7 +729,7 @@ struct supertype *super_by_fd(int fd) int vers; int minor; struct supertype *st = NULL; - struct sysarray *sra; + struct mdinfo *sra; char *verstr = NULL; char version[20]; int i; @@ -737,8 +737,8 @@ struct supertype *super_by_fd(int fd) sra = sysfs_read(fd, 0, GET_VERSION); if (sra) { - vers = sra->major_version; - minor = sra->minor_version; + vers = sra->array.major_version; + minor = sra->array.minor_version; } else { if (ioctl(fd, GET_ARRAY_INFO, &array)) array.major_version = array.minor_version = 0;