]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Discard 'array_list' in mdmon
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index 4acb367f3aefe20233eb5ec0643d5640df5a43a8..d026c3026430f1098aa7604816485be347e63d52 100644 (file)
--- a/util.c
+++ b/util.c
@@ -770,7 +770,8 @@ int dev_open(char *dev, int flags)
        if (e > dev && *e == ':' && e[1] &&
            (minor = strtoul(e+1, &e, 0)) >= 0 &&
            *e == 0) {
-               snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d", major, minor);
+               snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d",
+                        (int)getpid(), major, minor);
                if (mknod(devname, S_IFBLK|0600, makedev(major, minor))==0) {
                        fd = open(devname, flags);
                        unlink(devname);
@@ -783,6 +784,9 @@ int dev_open(char *dev, int flags)
 struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL };
 
 #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO)
+
+struct supertype supertype_container_member;
+
 struct supertype *super_by_fd(int fd)
 {
        mdu_array_info_t array;
@@ -812,8 +816,11 @@ struct supertype *super_by_fd(int fd)
                sprintf(version, "%d.%d", vers, minor);
                verstr = version;
        }
-       for (i = 0; st == NULL && superlist[i] ; i++)
-               st = superlist[i]->match_metadata_desc(verstr);
+       if (minor == -2 && verstr[0] == '/')
+               st = &supertype_container_member;
+       else
+               for (i = 0; st == NULL && superlist[i] ; i++)
+                       st = superlist[i]->match_metadata_desc(verstr);
 
        if (sra)
                sysfs_free(sra);
@@ -975,6 +982,7 @@ int open_container(int fd)
                        return dfd;
                }
        }
+       closedir(dir);
        return -1;
 }