]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Change Incremental and related functions to take struct context
authorNeilBrown <neilb@suse.de>
Mon, 9 Jul 2012 07:20:22 +0000 (17:20 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 9 Jul 2012 07:20:22 +0000 (17:20 +1000)
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
Incremental.c
mdadm.c
mdadm.h

index 210bfa004c55ffe732381fd79bf7d939ffd120ed..2b7900ddd5f2e7ad8723253d8099a42e4bcadfbb 100644 (file)
@@ -715,10 +715,8 @@ int Assemble(struct supertype *st, char *mddev,
        if (content != &info) {
                /* This is a member of a container.  Try starting the array. */
                int err;
-               err = assemble_container_content(st, mdfd, content, c->runstop,
-                                                c->readonly,
-                                                chosen_name, c->verbose,
-                                                c->backup_file, c->freeze_reshape);
+               err = assemble_container_content(st, mdfd, content, c,
+                                                chosen_name);
                close(mdfd);
                return err;
        }
@@ -1545,10 +1543,8 @@ int Assemble(struct supertype *st, char *mddev,
 
 #ifndef MDASSEMBLE
 int assemble_container_content(struct supertype *st, int mdfd,
-                              struct mdinfo *content, int runstop,
-                              int readonly,
-                              char *chosen_name, int verbose,
-                              char *backup_file, int freeze_reshape)
+                              struct mdinfo *content, struct context *c,
+                              char *chosen_name)
 {
        struct mdinfo *dev, *sra;
        int working = 0, preexist = 0;
@@ -1563,7 +1559,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
        if (sra == NULL || strcmp(sra->text_version, content->text_version) != 0) {
                if (content->array.major_version == -1 &&
                    content->array.minor_version == -2 &&
-                   readonly &&
+                   c->readonly &&
                    content->text_version[0] == '/')
                        content->text_version[0] = '-';
                if (sysfs_set_array(content, md_get_version(mdfd)) != 0) {
@@ -1605,7 +1601,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
                   content->text_version,
                   content->uuid, chosen_name);
 
-       if (runstop > 0 ||
+       if (c->runstop > 0 ||
                 (working + preexist + expansion) >=
                        content->array.working_disks) {
                int err;
@@ -1614,7 +1610,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
                        int spare = content->array.raid_disks + expansion;
                        if (restore_backup(st, content,
                                           working,
-                                          spare, backup_file, verbose) == 1)
+                                          spare, c->backup_file, c->verbose) == 1)
                                return 1;
 
                        err = sysfs_set_str(content, NULL,
@@ -1631,14 +1627,14 @@ int assemble_container_content(struct supertype *st, int mdfd,
                                        st->update_tail = &st->updates;
                        }
 
-                       err = Grow_continue(mdfd, st, content, backup_file,
-                                           freeze_reshape);
+                       err = Grow_continue(mdfd, st, content, c->backup_file,
+                                           c->freeze_reshape);
                } else switch(content->array.level) {
                case LEVEL_LINEAR:
                case LEVEL_MULTIPATH:
                case 0:
                        err = sysfs_set_str(content, NULL, "array_state",
-                                           readonly ? "readonly" : "active");
+                                           c->readonly ? "readonly" : "active");
                        break;
                default:
                        err = sysfs_set_str(content, NULL, "array_state",
@@ -1662,7 +1658,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
                    !start_reshape)
                        block_subarray(content);
 
-               if (verbose >= 0) {
+               if (c->verbose >= 0) {
                        if (err)
                                pr_err("array %s now has %d device%s",
                                       chosen_name, working + preexist,
@@ -1683,7 +1679,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
                return err;
                /* FIXME should have an O_EXCL and wait for read-auto */
        } else {
-               if (verbose >= 0) {
+               if (c->verbose >= 0) {
                        pr_err("%s assembled with %d device%s",
                               chosen_name, preexist + working,
                               preexist + working == 1 ? "":"s");
index 009d88c1f7921d0deeaddaf6a3f062e08fdb9f92..9f7f54c7e36202fa3a8afa24f75e771ff34bdc31 100644 (file)
@@ -43,14 +43,10 @@ static int try_spare(char *devname, int *dfdp, struct dev_policy *pol,
                     struct supertype *st, int verbose);
 
 static int Incremental_container(struct supertype *st, char *devname,
-                                char *homehost,
-                                int verbose, int runstop,
-                                int readonly, int autof,
-                                int freeze_reshape);
-
-int Incremental(char *devname, int verbose, int runstop,
-               struct supertype *st, char *homehost, int require_homehost,
-               int autof, int freeze_reshape)
+                                struct context *c);
+
+int Incremental(char *devname, struct context *c,
+               struct supertype *st)
 {
        /* Add this device to an array, creating the array if necessary
         * and starting the array if sensible or - if runstop>0 - if possible.
@@ -109,20 +105,20 @@ int Incremental(char *devname, int verbose, int runstop,
        struct createinfo *ci = conf_get_create_info();
 
        if (stat(devname, &stb) < 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("stat failed for %s: %s.\n",
                                devname, strerror(errno));
                return rv;
        }
        if ((stb.st_mode & S_IFMT) != S_IFBLK) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s is not a block device.\n",
                                devname);
                return rv;
        }
        dfd = dev_open(devname, O_RDONLY|O_EXCL);
        if (dfd < 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("cannot open %s: %s.\n",
                                devname, strerror(errno));
                return rv;
@@ -139,10 +135,7 @@ int Incremental(char *devname, int verbose, int runstop,
                        if (map_lock(&map))
                                pr_err("failed to get "
                                       "exclusive lock on mapfile\n");
-                       rv = Incremental_container(st, devname, homehost,
-                                                  verbose, runstop,
-                                                  0, autof,
-                                                  freeze_reshape);
+                       rv = Incremental_container(st, devname, c);
                        map_unlock(&map);
                        return rv;
                }
@@ -155,7 +148,7 @@ int Incremental(char *devname, int verbose, int runstop,
        /* 1/ Check if device is permitted by mdadm.conf */
 
        if (!conf_test_dev(devname)) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s not permitted by mdadm.conf.\n",
                               devname);
                goto out;
@@ -165,13 +158,13 @@ int Incremental(char *devname, int verbose, int runstop,
         *            version/name from args) */
 
        if (fstat(dfd, &stb) < 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("fstat failed for %s: %s.\n",
                                devname, strerror(errno));
                goto out;
        }
        if ((stb.st_mode & S_IFMT) != S_IFBLK) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s is not a block device.\n",
                                devname);
                goto out;
@@ -184,22 +177,22 @@ int Incremental(char *devname, int verbose, int runstop,
        have_target = policy_check_path(&dinfo, &target_array);
 
        if (st == NULL && (st = guess_super(dfd)) == NULL) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("no recognisable superblock on %s.\n",
                               devname);
                rv = try_spare(devname, &dfd, policy,
                               have_target ? &target_array : NULL,
-                              st, verbose);
+                              st, c->verbose);
                goto out;
        }
        if (st->ss->compare_super == NULL ||
            st->ss->load_super(st, dfd, NULL)) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("no RAID superblock on %s.\n",
                                devname);
                rv = try_spare(devname, &dfd, policy,
                               have_target ? &target_array : NULL,
-                              st, verbose);
+                              st, c->verbose);
                free(st);
                goto out;
        }
@@ -208,13 +201,13 @@ int Incremental(char *devname, int verbose, int runstop,
        st->ss->getinfo_super(st, &info, NULL);
 
        /* 3/ Check if there is a match in mdadm.conf */
-       match = conf_match(st, &info, devname, verbose, &rv);
+       match = conf_match(st, &info, devname, c->verbose, &rv);
        if (!match && rv == 2)
                goto out;
 
        if (match && match->devname
            && strcasecmp(match->devname, "<ignore>") == 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("array containing %s is explicitly"
                                " ignored by mdadm.conf\n",
                                devname);
@@ -227,7 +220,7 @@ int Incremental(char *devname, int verbose, int runstop,
         * on that. */
        if (match)
                trustworthy = LOCAL;
-       else if (st->ss->match_home(st, homehost) == 1)
+       else if (st->ss->match_home(st, c->homehost) == 1)
                trustworthy = LOCAL;
        else if (st->ss->match_home(st, "any") == 1)
                trustworthy = LOCAL_ANY;
@@ -237,7 +230,7 @@ int Incremental(char *devname, int verbose, int runstop,
 
        if (!match && !conf_test_metadata(st->ss->name, policy,
                                          (trustworthy == LOCAL))) {
-               if (verbose >= 1)
+               if (c->verbose >= 1)
                        pr_err("%s has metadata type %s for which "
                               "auto-assembly is disabled\n",
                               devname, st->ss->name);
@@ -252,9 +245,9 @@ int Incremental(char *devname, int verbose, int runstop,
         * CREATE.
         */
        if (match && match->autof)
-               autof = match->autof;
-       if (autof == 0)
-               autof = ci->autof;
+               c->autof = match->autof;
+       if (c->autof == 0)
+               c->autof = ci->autof;
 
        name_to_use = info.name;
        if (name_to_use[0] == 0 &&
@@ -263,7 +256,7 @@ int Incremental(char *devname, int verbose, int runstop,
                trustworthy = METADATA;
        }
        if (name_to_use[0] && trustworthy != LOCAL &&
-           ! require_homehost &&
+           ! c->require_homehost &&
            conf_name_is_free(name_to_use))
                trustworthy = LOCAL;
 
@@ -288,7 +281,7 @@ int Incremental(char *devname, int verbose, int runstop,
 
                /* Couldn't find an existing array, maybe make a new one */
                mdfd = create_mddev(match ? match->devname : NULL,
-                                   name_to_use, autof, trustworthy, chosen_name);
+                                   name_to_use, c->autof, trustworthy, chosen_name);
 
                if (mdfd < 0)
                        goto out_unlock;
@@ -365,7 +358,7 @@ int Incremental(char *devname, int verbose, int runstop,
                    && (info.disk.state & (1<<MD_DISK_SYNC)) != 0
                    && ! policy_action_allows(policy, st->ss->name,
                                              act_re_add)
-                   && runstop < 1) {
+                   && c->runstop < 1) {
                        if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) {
                                pr_err("not adding %s to active array (without --run) %s\n",
                                       devname, chosen_name);
@@ -419,7 +412,7 @@ int Incremental(char *devname, int verbose, int runstop,
                         * disk.number. Find and reject any such
                         */
                        find_reject(mdfd, st, sra, info.disk.number,
-                                   info.events, verbose, chosen_name);
+                                   info.events, c->verbose, chosen_name);
                        err = add_disk(mdfd, st, sra, &info);
                }
                if (err < 0) {
@@ -440,7 +433,7 @@ int Incremental(char *devname, int verbose, int runstop,
                int devnum = devnum; /* defined and used iff ->external */
                /* Try to assemble within the container */
                sysfs_uevent(sra, "change");
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("container %s now has %d device%s\n",
                               chosen_name, info.array.working_disks,
                               info.array.working_disks==1?"":"s");
@@ -452,9 +445,7 @@ int Incremental(char *devname, int verbose, int runstop,
                close(mdfd);
                sysfs_free(sra);
                if (!rv)
-                       rv = Incremental_container(st, chosen_name, homehost,
-                                                  verbose, runstop, 0, autof,
-                                                  freeze_reshape);
+                       rv = Incremental_container(st, chosen_name, c);
                map_unlock(&map);
                if (rv == 1)
                        /* Don't fail the whole -I if a subarray didn't
@@ -479,7 +470,7 @@ int Incremental(char *devname, int verbose, int runstop,
        if (enough(info.array.level, info.array.raid_disks,
                   info.array.layout, info.array.state & 1,
                   avail) == 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s attached to %s, not enough to start (%d).\n",
                               devname, chosen_name, active_disks);
                rv = 0;
@@ -493,7 +484,7 @@ int Incremental(char *devname, int verbose, int runstop,
        /*   + start the array (auto-readonly). */
 
        if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s attached to %s which is already active.\n",
                               devname, chosen_name);
                rv = 0;
@@ -501,7 +492,7 @@ int Incremental(char *devname, int verbose, int runstop,
        }
 
        map_unlock(&map);
-       if (runstop > 0 || active_disks >= info.array.working_disks) {
+       if (c->runstop > 0 || active_disks >= info.array.working_disks) {
                struct mdinfo *dsk;
                /* Let's try to start it */
                if (match && match->bitmap_file) {
@@ -533,7 +524,7 @@ int Incremental(char *devname, int verbose, int runstop,
                        rv = sysfs_set_str(sra, NULL,
                                           "array_state", "read-auto");
                if (rv == 0) {
-                       if (verbose >= 0)
+                       if (c->verbose >= 0)
                                pr_err("%s attached to %s, which has been started.\n",
                                       devname, chosen_name);
                        rv = 0;
@@ -556,7 +547,7 @@ int Incremental(char *devname, int verbose, int runstop,
                        rv = 1;
                }
        } else {
-               if (verbose >= 0)
+               if (c->verbose >= 0)
                        pr_err("%s attached to %s, not enough to start safely.\n",
                               devname, chosen_name);
                rv = 0;
@@ -1336,9 +1327,7 @@ static char *container2devname(char *devname)
 }
 
 static int Incremental_container(struct supertype *st, char *devname,
-                                char *homehost, int verbose,
-                                int runstop, int readonly,
-                                int autof, int freeze_reshape)
+                                struct context *c)
 {
        /* Collect the contents of this container and for each
         * array, choose a device name and assemble the array.
@@ -1360,23 +1349,23 @@ static int Incremental_container(struct supertype *st, char *devname,
 
        st->ss->getinfo_super(st, &info, NULL);
 
-       if ((runstop > 0 && info.container_enough >= 0) ||
+       if ((c->runstop > 0 && info.container_enough >= 0) ||
            info.container_enough > 0)
                /* pass */;
        else {
-               if (verbose)
+               if (c->verbose)
                        pr_err("not enough devices to start the container\n");
                return 0;
        }
 
-       match = conf_match(st, &info, devname, verbose, &rv);
+       match = conf_match(st, &info, devname, c->verbose, &rv);
        if (match == NULL && rv == 2)
                return rv;
 
        /* Need to compute 'trustworthy' */
        if (match)
                trustworthy = LOCAL;
-       else if (st->ss->match_home(st, homehost) == 1)
+       else if (st->ss->match_home(st, c->homehost) == 1)
                trustworthy = LOCAL;
        else if (st->ss->match_home(st, "any") == 1)
                trustworthy = LOCAL;
@@ -1443,7 +1432,7 @@ static int Incremental_container(struct supertype *st, char *devname,
                                free(dn);
                                /* we have a match */
                                match = array_list;
-                               if (verbose>0)
+                               if (c->verbose>0)
                                        pr_err("match found for member %s\n",
                                                array_list->member);
                                break;
@@ -1451,7 +1440,7 @@ static int Incremental_container(struct supertype *st, char *devname,
 
                        if (match && match->devname &&
                            strcasecmp(match->devname, "<ignore>") == 0) {
-                               if (verbose > 0)
+                               if (c->verbose > 0)
                                        pr_err("array %s/%s is "
                                               "explicitly ignored by mdadm.conf\n",
                                               match->container, match->member);
@@ -1462,7 +1451,7 @@ static int Incremental_container(struct supertype *st, char *devname,
 
                        mdfd = create_mddev(match ? match->devname : NULL,
                                            ra->name,
-                                           autof,
+                                           c->autof,
                                            trustworthy,
                                            chosen_name);
                }
@@ -1473,9 +1462,8 @@ static int Incremental_container(struct supertype *st, char *devname,
                        return 2;
                }
 
-               assemble_container_content(st, mdfd, ra, runstop, readonly,
-                                          chosen_name, verbose, NULL,
-                                          freeze_reshape);
+               assemble_container_content(st, mdfd, ra, c,
+                                          chosen_name);
                close(mdfd);
        }
 
diff --git a/mdadm.c b/mdadm.c
index d57ab957b8b23b9ee1d19c182620b3056290de90..c979b94e3e5e5a9eb021f4e77ad1b6be14c9152e 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1499,10 +1499,7 @@ int main(int argc, char *argv[])
                        rv = IncrementalRemove(devlist->devname, remove_path,
                                               c.verbose);
                else
-                       rv = Incremental(devlist->devname, c.verbose,
-                                        c.runstop, ss, c.homehost,
-                                        c.require_homehost, c.autof,
-                                        c.freeze_reshape);
+                       rv = Incremental(devlist->devname, &c, ss);
                break;
        case AUTODETECT:
                autodetect();
diff --git a/mdadm.h b/mdadm.h
index 166bae4f9b964957ecb3c7824c0e0ddf7b58deec..2bf4e8cba0f103c6090cbff2795ca0733d6c6159 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1131,9 +1131,8 @@ extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev
 extern int Wait(char *dev);
 extern int WaitClean(char *dev, int sock, int verbose);
 
-extern int Incremental(char *devname, int verbose, int runstop,
-                      struct supertype *st, char *homehost, int require_homehost,
-                      int autof, int freeze_reshape);
+extern int Incremental(char *devname, struct context *c,
+                      struct supertype *st);
 extern void RebuildMap(void);
 extern int IncrementalScan(int verbose);
 extern int IncrementalRemove(char *devname, char *path, int verbose);
@@ -1216,10 +1215,9 @@ extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
 extern int flush_metadata_updates(struct supertype *st);
 extern void append_metadata_update(struct supertype *st, void *buf, int len);
 extern int assemble_container_content(struct supertype *st, int mdfd,
-                                     struct mdinfo *content, int runstop,
-                                     int readonly,
-                                     char *chosen_name, int verbose,
-                                     char *backup_file, int freeze_reshape);
+                                     struct mdinfo *content,
+                                     struct context *c,
+                                     char *chosen_name);
 extern struct mdinfo *container_choose_spares(struct supertype *st,
                                              unsigned long long min_size,
                                              struct domainlist *domlist,