Replace sysarray with mdinfo
authorNeil Brown <neilb@suse.de>
Fri, 14 Dec 2007 09:14:59 +0000 (20:14 +1100)
committerNeil Brown <neilb@suse.de>
Fri, 14 Dec 2007 09:14:59 +0000 (20:14 +1100)
Sure, mdinfo is bigger, but having a uniform structure for lots of things
will make life easier.

Grow.c
Incremental.c
Monitor.c
mdadm.h
sysfs.c
util.c

diff --git a/Grow.c b/Grow.c
index c02ff80..b24e958 100644 (file)
--- 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) {
index df5314d..ab37ef0 100644 (file)
@@ -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;
index d43e553..6b0c760 100644 (file)
--- 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 483a072..1a7db81 100644 (file)
--- 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 970d211..f198d16 100644 (file)
--- 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<<MD_DISK_FAULTY);
                        if (dev->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 732bc1c..dd8b176 100644 (file)
--- 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;