]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Change "mdadm --run" to use the same code as "mdadm --IRs".
authorNeilBrown <neilb@suse.de>
Mon, 26 Aug 2013 05:24:53 +0000 (15:24 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 26 Aug 2013 05:24:53 +0000 (15:24 +1000)
Current "mdadm --run /dev/mdX" will not handle external metadata
properly.  mdmon won't be started etc.

So use the code from "mdadm -IRs" instead - that already does all
the right things.

Reported-by: Francis Moreau <francis.moro@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Incremental.c
Manage.c
mdadm.c
mdadm.h

index fbaa29fe051845977fe1f96e44b884a841ab0e43..06415ed6fca52b1e31c51a69dc620649478783b2 100644 (file)
@@ -1278,7 +1278,7 @@ static int try_spare(char *devname, int *dfdp, struct dev_policy *pol,
        return rv;
 }
 
-int IncrementalScan(int verbose)
+int IncrementalScan(int verbose, char *devnm)
 {
        /* look at every device listed in the 'map' file.
         * If one is found that is not running then:
@@ -1298,7 +1298,11 @@ int IncrementalScan(int verbose)
                mdu_array_info_t array;
                mdu_bitmap_file_t bmf;
                struct mdinfo *sra;
-               int mdfd = open_dev(me->devnm);
+               int mdfd;
+
+               if (devnm && strcmp(devnm, me->devnm) != 0)
+                       continue;
+               mdfd = open_dev(me->devnm);
 
                if (mdfd < 0)
                        continue;
index b107289ebbcceafff5bc5531670bed7f283dffb6..53f47946bd5b6e426e6548aee56b617c9280f1b6 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -175,23 +175,19 @@ int Manage_run(char *devname, int fd, int verbose)
        /* Run the array.  Array must already be configured
         *  Requires >= 0.90.0
         */
-       mdu_param_t param; /* unused */
-       int rv = 0;
+       char nm[32], *nmp;
 
        if (md_get_version(fd) < 9000) {
                pr_err("need md driver version 0.90.0 or later\n");
                return 1;
        }
-
-       if (ioctl(fd, RUN_ARRAY, &param)) {
-               if (verbose >= 0)
-                       pr_err("failed to run array %s: %s\n",
-                              devname, strerror(errno));
+       nmp = fd2devnm(fd);
+       if (!nmp) {
+               pr_err("Cannot find %s in sysfs!!\n", devname);
                return 1;
        }
-       if (verbose >= 0)
-               pr_err("started %s\n", devname);
-       return rv;
+       strcpy(nm, nmp);
+       return IncrementalScan(verbose, nm);
 }
 
 int Manage_stop(char *devname, int fd, int verbose, int will_retry)
diff --git a/mdadm.c b/mdadm.c
index 86a4fad210b1725c6b49e73838516359d75491f1..ca86300a0c617ad0ee4b4ac79eeac786f2322511 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1535,7 +1535,7 @@ int main(int argc, char *argv[])
                                pr_err("--incremental --scan --fail not supported.\n");
                                break;
                        }
-                       rv = IncrementalScan(c.verbose);
+                       rv = IncrementalScan(c.verbose, NULL);
                }
                if (!devlist) {
                        if (!rebuild_map && !c.scan) {
diff --git a/mdadm.h b/mdadm.h
index 43f3a57dd058f3f02071a3a32d27af9d5726b4bc..91d2713908463e94ba557420bdb31f08f4353c18 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1235,7 +1235,7 @@ extern int WaitClean(char *dev, int sock, int verbose);
 extern int Incremental(char *devname, struct context *c,
                       struct supertype *st);
 extern void RebuildMap(void);
-extern int IncrementalScan(int verbose);
+extern int IncrementalScan(int verbose, char *devnm);
 extern int IncrementalRemove(char *devname, char *path, int verbose);
 extern int CreateBitmap(char *filename, int force, char uuid[16],
                        unsigned long chunksize, unsigned long daemon_sleep,