]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - msg.c
FIX: ping_monitor() usage causes memory leaks
[thirdparty/mdadm.git] / msg.c
diff --git a/msg.c b/msg.c
index 7bd85f8154477a6d009ab2bcd9fec9833fa11ab6..a10c930d45317f27e713c8b3212940f4b7572757 100644 (file)
--- a/msg.c
+++ b/msg.c
@@ -213,6 +213,20 @@ int ping_monitor(char *devname)
        return err;
 }
 
+/* ping monitor using device number */
+int ping_monitor_by_id(int devnum)
+{
+       int err = -1;
+       char *container = devnum2devname(devnum);
+
+       if (container) {
+               err = ping_monitor(container);
+               free(container);
+       }
+
+       return err;
+}
+
 static char *ping_monitor_version(char *devname)
 {
        int sfd = connect_monitor(devname);
@@ -235,7 +249,7 @@ static char *ping_monitor_version(char *devname)
        return msg.buf;
 }
 
-static int unblock_subarray(struct mdinfo *sra, const int unfreeze)
+int unblock_subarray(struct mdinfo *sra, const int unfreeze)
 {
        char buf[64];
        int rc = 0;
@@ -255,6 +269,18 @@ static int unblock_subarray(struct mdinfo *sra, const int unfreeze)
        return rc;
 }
 
+int block_subarray(struct mdinfo *sra)
+{
+       char buf[64];
+       int rc = 0;
+
+       sprintf(buf, "external:%s\n", sra->text_version);
+       buf[9] = '-';
+       if (sysfs_set_str(sra, NULL, "metadata_version", buf))
+               rc = -1;
+
+       return rc;
+}
 /**
  * block_monitor - prevent mdmon spare assignment
  * @container - container to block
@@ -334,9 +360,7 @@ int block_monitor(char *container, const int freeze)
                 * takeover in reshape case and spare reassignment in the
                 * auto-rebuild case)
                 */
-               sprintf(buf, "external:%s\n", sra->text_version);
-               buf[9] = '-';
-               if (sysfs_set_str(sra, NULL, "metadata_version", buf))
+               if (block_subarray(sra))
                        break;
                ping_monitor(container);
 
@@ -383,7 +407,6 @@ int block_monitor(char *container, const int freeze)
 
        sysfs_free(sra);
        free_mdstat(ent);
-       free(container);
 
        return rv;
 }