]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
Replace sysarray with mdinfo
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 16744f1b6e388cba4a0f5d2bcfd712e1ffcf1d37..f198d1646e4930d33f70173d646d33ec900c5bfc 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 sysdev *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,31 +67,35 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
        char buf[1024];
        char *base;
        char *dbase;
-       struct sysarray *sra;
-       struct sysdev *dev;
+       struct mdinfo *sra;
+       struct mdinfo *dev;
        DIR *dir;
        struct dirent *de;
 
        sra = malloc(sizeof(*sra));
        if (sra == NULL)
                return sra;
+       sra->next = NULL;
 
        if (fd >= 0) {
                struct stat stb;
-               if (fstat(fd, &stb)) return NULL;
+               mdu_version_t vers;
+               if (fstat(fd, &stb)) return NULL;
+               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;
@@ -98,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");
@@ -127,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");
@@ -150,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;
@@ -166,43 +174,43 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
                        goto abort;
                dev->next = sra->devs;
                sra->devs = dev;
-               strcpy(dev->name, de->d_name);
+               strcpy(dev->sys_name, de->d_name);
 
                /* Always get slot, major, minor */
                strcpy(dbase, "slot");
                if (load_sys(fname, buf))
                        goto abort;
-               dev->role = strtoul(buf, &ep, 10);
-               if (*ep) dev->role = -1;
+               dev->disk.raid_disk = strtoul(buf, &ep, 10);
+               if (*ep) dev->disk.raid_disk = -1;
 
                strcpy(dbase, "block/dev");
                if (load_sys(fname, buf))
                        goto abort;
-               sscanf(buf, "%d:%d", &dev->major, &dev->minor);
+               sscanf(buf, "%d:%d", &dev->disk.major, &dev->disk.minor);
 
                if (options & GET_OFFSET) {
                        strcpy(dbase, "offset");
                        if (load_sys(fname, buf))
                                goto abort;
-                       dev->offset = strtoull(buf, NULL, 0);
+                       dev->data_offset = strtoull(buf, NULL, 0);
                }
                if (options & GET_SIZE) {
                        strcpy(dbase, "size");
                        if (load_sys(fname, buf))
                                goto abort;
-                       dev->size = strtoull(buf, NULL, 0);
+                       dev->component_size = strtoull(buf, NULL, 0);
                }
                if (options & GET_STATE) {
-                       dev->state = 0;
+                       dev->disk.state = 0;
                        strcpy(dbase, "state");
                        if (load_sys(fname, buf))
                                goto abort;
                        if (strstr(buf, "in_sync"))
-                               dev->state |= (1<<MD_DISK_SYNC);
+                               dev->disk.state |= (1<<MD_DISK_SYNC);
                        if (strstr(buf, "faulty"))
-                               dev->state |= (1<<MD_DISK_FAULTY);
-                       if (dev->state == 0)
-                               sra->spares++;
+                               dev->disk.state |= (1<<MD_DISK_FAULTY);
+                       if (dev->disk.state == 0)
+                               sra->array.spare_disks++;
                }
                if (options & GET_ERROR) {
                        strcpy(buf, "errors");
@@ -248,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 sysdev *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->name:"", name);
+               sra->sys_name, dev?dev->sys_name:"", name);
        fd = open(fname, O_WRONLY);
        if (fd < 0)
                return -1;
@@ -266,7 +274,7 @@ int sysfs_set_str(struct sysarray *sra, struct sysdev *dev,
        return 0;
 }
 
-int sysfs_set_num(struct sysarray *sra, struct sysdev *dev,
+int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
                  char *name, unsigned long long val)
 {
        char valstr[50];
@@ -274,7 +282,7 @@ int sysfs_set_num(struct sysarray *sra, struct sysdev *dev,
        return sysfs_set_str(sra, dev, name, valstr);
 }
 
-int sysfs_get_ll(struct sysarray *sra, struct sysdev *dev,
+int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                       char *name, unsigned long long *val)
 {
        char fname[50];
@@ -283,7 +291,7 @@ int sysfs_get_ll(struct sysarray *sra, struct sysdev *dev,
        int fd;
        char *ep;
        sprintf(fname, "/sys/block/%s/md/%s/%s",
-               sra->name, dev?dev->name:"", name);
+               sra->sys_name, dev?dev->sys_name:"", name);
        fd = open(fname, O_RDONLY);
        if (fd < 0)
                return -1;