]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
Add new mode: --incremental
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 25ede6b7b054fe6754353400ae4590bc34fb1cbe..16744f1b6e388cba4a0f5d2bcfd712e1ffcf1d37 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -42,6 +42,18 @@ int load_sys(char *path, char *buf)
        return 0;
 }
 
+void sysfs_free(struct sysarray *sra)
+{
+       if (!sra)
+               return;
+       while (sra->devs) {
+               struct sysdev *d = sra->devs;
+               sra->devs = d->next;
+               free(d);
+       }
+       free(sra);
+}
+
 struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
 {
        /* Longest possible name in sysfs, mounted at /sys, is
@@ -81,6 +93,16 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
        base = fname + strlen(fname);
 
        sra->devs = NULL;
+       if (options & GET_VERSION) {
+               strcpy(base, "metadata_version");
+               if (load_sys(fname, buf))
+                       goto abort;
+               if (strncmp(buf, "none", 4) == 0)
+                       sra->major_version = sra->minor_version = -1;
+               else
+                       sscanf(buf, "%d.%d",
+                              &sra->major_version, &sra->minor_version);
+       }
        if (options & GET_LEVEL) {
                strcpy(base, "level");
                if (load_sys(fname, buf))
@@ -144,6 +166,7 @@ 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);
 
                /* Always get slot, major, minor */
                strcpy(dbase, "slot");
@@ -191,12 +214,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
        return sra;
 
  abort:
-       while (sra && sra->devs) {
-               dev = sra->devs;
-               sra->devs = dev->next;
-               free(dev);
-       }
-       if(sra) free(sra);
+       sysfs_free(sra);
        return NULL;
 }