]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
FIX: ping_monitor() usage causes memory leaks
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index a0d8283c79bdcedf7f96e18b7b63acef28595bb1..cc6ccb4d25f99ae737ce65996cd3d1c71d80477a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -160,6 +160,7 @@ int get_linux_version()
        return (a*1000000)+(b*1000)+c;
 }
 
+#ifndef MDASSEMBLE
 int mdadm_version(char *version)
 {
        int a, b, c;
@@ -185,7 +186,6 @@ int mdadm_version(char *version)
        return (a*1000000)+(b*1000)+c;
 }
 
-#ifndef MDASSEMBLE
 long long parse_size(char *size)
 {
        /* parse 'size' which should be a number optionally
@@ -1003,7 +1003,7 @@ int open_dev(int devnum)
        char buf[20];
 
        sprintf(buf, "%d:%d", dev2major(devnum), dev2minor(devnum));
-       return dev_open(buf, O_RDWR);
+       return dev_open(buf, O_RDONLY);
 }
 
 int open_dev_excl(int devnum)
@@ -1370,7 +1370,8 @@ static int get_last_partition_end(int fd, unsigned long long *endofpart)
        return retval;
 }
 
-int check_partitions(int fd, char *dname, unsigned long long freesize)
+int check_partitions(int fd, char *dname, unsigned long long freesize,
+                       unsigned long long size)
 {
        /*
         * Check where the last partition ends
@@ -1393,6 +1394,12 @@ int check_partitions(int fd, char *dname, unsigned long long freesize)
                                Name ": metadata will over-write last partition on %s.\n",
                                dname);
                        return 1;
+               } else if (size && endofpart > size) {
+                       /* partitions will be truncated in new device */
+                       fprintf(stderr,
+                               Name ": array size is too small to cover all partitions on %s.\n",
+                               dname);
+                       return 1;
                }
        }
        return 0;
@@ -1956,7 +1963,7 @@ struct mdinfo *container_choose_spares(struct supertype *st,
                                if (spare_group)
                                        pol_add(&pol, pol_domain,
                                                spare_group, NULL);
-                               if (!domain_test(domlist, pol, metadata))
+                               if (domain_test(domlist, pol, metadata) != 1)
                                        found = 0;
                                dev_policy_free(pol);
                        }