]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Move calls to SET_ARRAY_INFO to common helper.
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index 7469fca4111e0f0a577c4c36766d5b2333a54acc..b63251f4df166a29625981ecb5c021fca90b6459 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1009,10 +1009,15 @@ int add_disk(int mdfd, struct supertype *st,
                rv = sysfs_add_disk(sra, info);
                if (! rv) {
                        struct mdinfo *sd2;
-                       sd2 = malloc(sizeof(*sd2));
-                       *sd2 = *info;
-                       sd2->next = sra->devs;
-                       sra->devs = sd2;
+                       for (sd2 = sra->devs; sd2; sd2=sd2->next)
+                               if (sd2 == info)
+                                       break;
+                       if (sd2 == NULL) {
+                               sd2 = malloc(sizeof(*sd2));
+                               *sd2 = *info;
+                               sd2->next = sra->devs;
+                               sra->devs = sd2;
+                       }
                }
        } else
 #endif
@@ -1020,6 +1025,31 @@ int add_disk(int mdfd, struct supertype *st,
        return rv;
 }
 
+int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
+{
+       /* Initialise kernel's knowledge of array.
+        * This varies between externally managed arrays
+        * and older kernels
+        */
+       int vers = md_get_version(mdfd);
+       int rv;
+
+#ifndef MDASSEMBLE
+       if (st->ss->external)
+               rv = sysfs_set_array(info, vers);
+       else
+#endif
+               if ((vers % 100) >= 1) { /* can use different versions */
+               mdu_array_info_t inf;
+               memset(&inf, 0, sizeof(inf));
+               inf.major_version = info->array.major_version;
+               inf.minor_version = info->array.minor_version;
+               rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
+       } else
+               rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
+       return rv;
+}
+
 char *devnum2devname(int num)
 {
        char name[100];