]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdopen: use parameters/new_array to create arrays whenever possible.
authorNeilBrown <neilb@suse.com>
Wed, 12 Apr 2017 06:29:04 +0000 (16:29 +1000)
committerJes Sorensen <jsorensen@fb.com>
Wed, 12 Apr 2017 17:34:44 +0000 (13:34 -0400)
In a sufficiently recent kernel, an md%d array can be
created by writing to .../parameters/new_array.
If mdadm does this consistently, then another new
feature, disabling create_on_open, can be enabled.
This avoids races on shutdown.

An added benefit of using new_array (where available)
is that it allows md arrays with numbers larger than 511
(e.g. md999) to be created.  The old create_on_open
mechanism doesn't support such devices since
Commit: af5628f05db6 ("md: disable probing for md devices 512 and over.")
in Linux 3.17.

After a few more mdadm releases it would be good to
have mdadm disable create_on_open automatically.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
mdopen.c

index fe240e5c7ef296ef582187bf6c0e8cff9efffd64..82b97fc903394d432f4de982ffbe2e7ed30c38a4 100644 (file)
--- a/mdopen.c
+++ b/mdopen.c
@@ -313,6 +313,18 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
                if (n < 0)
                        devnm[0] = 0;
        }
+       if (num >= 0) {
+               int fd;
+               int n = -1;
+               sprintf(devnm, "md%d", num);
+               fd = open("/sys/module/md_mod/parameters/new_array", O_WRONLY);
+               if (fd >= 0) {
+                       n = write(fd, devnm, strlen(devnm));
+                       close(fd);
+               }
+               if (n < 0)
+                       devnm[0] = 0;
+       }
        if (devnm[0])
                ;
        else if (num < 0) {