]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
FIX: Close unused handle in child process during reshape restart
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index ce0323964562361ecb061227ad461304d58656fd..2cf617df4454aecf71620e07debdf771618b494a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -640,7 +640,7 @@ char *human_size(long long bytes)
         * We allow upto 2048Megabytes before converting to
         * gigabytes, as that shows more precision and isn't
         * too large a number.
-        * Terrabytes are not yet handled.
+        * Terabytes are not yet handled.
         */
 
        if (bytes < 5000*1024)
@@ -702,6 +702,12 @@ void print_r10_layout(int layout)
 
 unsigned long long calc_array_size(int level, int raid_disks, int layout,
                                   int chunksize, unsigned long long devsize)
+{
+       devsize &= ~(unsigned long long)((chunksize>>9)-1);
+       return get_data_disks(level, layout, raid_disks) * devsize;
+}
+
+int get_data_disks(int level, int layout, int raid_disks)
 {
        int data_disks = 0;
        switch (level) {
@@ -713,8 +719,8 @@ unsigned long long calc_array_size(int level, int raid_disks, int layout,
        case 10: data_disks = raid_disks / (layout & 255) / ((layout>>8)&255);
                break;
        }
-       devsize &= ~(unsigned long long)((chunksize>>9)-1);
-       return data_disks * devsize;
+
+       return data_disks;
 }
 
 #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO)
@@ -1370,7 +1376,7 @@ int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet)
                if (!quiet)
                        fprintf(stderr, Name ": Couldn't open %s, aborting\n",
                                dev);
-               return 2;
+               return -1;
        }
 
        st->devnum = fd2devnum(fd);
@@ -1573,7 +1579,7 @@ int mdmon_running(int devnum)
 
 int start_mdmon(int devnum)
 {
-       int i;
+       int i, skipped;
        int len;
        pid_t pid;      
        int status;
@@ -1588,7 +1594,7 @@ int start_mdmon(int devnum)
        if (check_env("MDADM_NO_MDMON"))
                return 0;
 
-       len = readlink("/proc/self/exe", pathbuf, sizeof(pathbuf));
+       len = readlink("/proc/self/exe", pathbuf, sizeof(pathbuf)-1);
        if (len > 0) {
                char *sl;
                pathbuf[len] = 0;
@@ -1604,8 +1610,13 @@ int start_mdmon(int devnum)
        switch(fork()) {
        case 0:
                /* FIXME yuk. CLOSE_EXEC?? */
-               for (i=3; i < 100; i++)
-                       close(i);
+               skipped = 0;
+               for (i=3; skipped < 20; i++)
+                       if (close(i) < 0)
+                               skipped++;
+                       else
+                               skipped = 0;
+
                for (i=0; paths[i]; i++)
                        if (paths[i][0])
                                execl(paths[i], "mdmon",
@@ -1698,7 +1709,8 @@ int experimental(void)
        if (check_env("MDADM_EXPERIMENTAL"))
                return 1;
        else {
-               fprintf(stderr, Name ": To use this feature MDADM_EXPERIMENTAL enviroment variable has to defined.\n");
+               fprintf(stderr, Name ": To use this feature MDADM_EXPERIMENTAL"
+                               " environment variable has to be defined.\n");
                return 0;
        }
 }