]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
make --update=homehost work again
authorNeilBrown <neilb@suse.de>
Thu, 7 Feb 2013 00:51:21 +0000 (11:51 +1100)
committerNeilBrown <neilb@suse.de>
Sun, 10 Feb 2013 04:40:42 +0000 (15:40 +1100)
Commit 1e2b276535cea41c348292a019bdda8a58cb1679 (Report error in --update
string is not recognised) broke homehost updating functionality because it
depended on each string comparison being done even after we already found
a match.  Make it work again by restructuring code.

Reported-by: (and original version by) Justin Maggard <jmaggard10@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super0.c
super1.c

index d54a5d7ff92cf909dbb87fa7beb410c7eb34ec38..bc95fb66e2ccb310aae6a120f5a47fdff858259e 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -435,6 +435,18 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
        int rv = 0;
        int uuid[4];
        mdp_super_t *sb = st->sb;
+
+       if (strcmp(update, "homehost") == 0 &&
+           homehost) {
+               /* note that 'homehost' is special as it is really
+                * a "uuid" update.
+                */
+               uuid_set = 0;
+               update = "uuid";
+               info->uuid[0] = sb->set_uuid0;
+               info->uuid[1] = sb->set_uuid1;
+       }
+
        if (strcmp(update, "sparc2.2")==0 ) {
                /* 2.2 sparc put the events in the wrong place
                 * So we copy the tail of the superblock
@@ -551,12 +563,6 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
                /* make sure resync happens */
                sb->state &= ~(1<<MD_SB_CLEAN);
                sb->recovery_cp = 0;
-       } else if (strcmp(update, "homehost") == 0 &&
-                  homehost) {
-               uuid_set = 0;
-               update = "uuid";
-               info->uuid[0] = sb->set_uuid0;
-               info->uuid[1] = sb->set_uuid1;
        } else if (strcmp(update, "uuid") == 0) {
                if (!uuid_set && homehost) {
                        char buf[20];
index fe83af5b3d00619b04622e8eb82c19411f2d1d71..4e380d98a4c3b6c918f515cd00247c6065a72e69 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -885,6 +885,21 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
        int rv = 0;
        struct mdp_superblock_1 *sb = st->sb;
 
+       if (strcmp(update, "homehost") == 0 &&
+           homehost) {
+               /* Note that 'homehost' is special as it is really
+                * a "name" update.
+                */
+               char *c;
+               update = "name";
+               c = strchr(sb->set_name, ':');
+               if (c)
+                       strncpy(info->name, c+1, 31 - (c-sb->set_name));
+               else
+                       strncpy(info->name, sb->set_name, 32);
+               info->name[32] = 0;
+       }
+
        if (strcmp(update, "force-one")==0) {
                /* Not enough devices for a working array,
                 * so bring this one up-to-date
@@ -1037,16 +1052,6 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        sb->bblog_shift = 0;
                        sb->bblog_offset = 0;
                }
-       } else if (strcmp(update, "homehost") == 0 &&
-                  homehost) {
-               char *c;
-               update = "name";
-               c = strchr(sb->set_name, ':');
-               if (c)
-                       strncpy(info->name, c+1, 31 - (c-sb->set_name));
-               else
-                       strncpy(info->name, sb->set_name, 32);
-               info->name[32] = 0;
        } else if (strcmp(update, "name") == 0) {
                if (info->name[0] == 0)
                        sprintf(info->name, "%d", info->array.md_minor);