From: NeilBrown Date: Thu, 7 Feb 2013 00:51:21 +0000 (+1100) Subject: make --update=homehost work again X-Git-Tag: mdadm-3.3-rc1~124 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=def1133297d8f619c8fd644d6d8c6633ddcaa929 make --update=homehost work again 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 Signed-off-by: NeilBrown --- diff --git a/super0.c b/super0.c index d54a5d7f..bc95fb66 100644 --- 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<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]; diff --git a/super1.c b/super1.c index fe83af5b..4e380d98 100644 --- 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);