From: Neil Brown Date: Tue, 23 May 2006 05:16:32 +0000 (+0000) Subject: Support --update=homehost to allow updating of homehost information. X-Git-Tag: mdadm-2.5~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0237e0cafd5ff70304f0b09ed452adbe0e0e6384;p=thirdparty%2Fmdadm.git Support --update=homehost to allow updating of homehost information. Signed-off-by: Neil Brown --- diff --git a/mdadm.8 b/mdadm.8 index 132052ad..ebabaa4f 100644 --- a/mdadm.8 +++ b/mdadm.8 @@ -651,6 +651,7 @@ argument given to this flag can be one of .BR summaries , .BR uuid , .BR name , +.BR homehost , .BR resync , .BR byteorder , or @@ -689,6 +690,14 @@ option will change the of the array as stored in the superblock. This is only supported for version-1 superblocks. +The +.B homehost +option will change the +.I homehost +as recorded in the superblock. For version-0 superblocks, this is the +same as updating the UUID. +For version-1 superblocks, this involves updating the name. + The .B resync option will cause the array to be marked diff --git a/mdadm.c b/mdadm.c index 42fcf076..0df73691 100644 --- a/mdadm.c +++ b/mdadm.c @@ -568,6 +568,8 @@ int main(int argc, char *argv[]) continue; if (strcmp(update, "name")==0) continue; + if (strcmp(update, "homehost")==0) + continue; if (strcmp(update, "byteorder")==0) { if (ss) { fprintf(stderr, Name ": must not set metadata type with --update=byteorder.\n"); diff --git a/super0.c b/super0.c index d21032f3..85e54fc9 100644 --- a/super0.c +++ b/super0.c @@ -442,6 +442,13 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, sb->state &= ~(1<recovery_cp = 0; } + if (strcmp(update, "homehost") == 0 && + homehost) { + uuid_set = 0; + update = "uuid"; + info->uuid[0] = sb->set_uuid0; + info->uuid[1] = sb->set_uuid1; + } if (strcmp(update, "uuid") == 0) { if (!uuid_set && homehost) { unsigned char *hash = SHA1((unsigned char*)homehost, diff --git a/super1.c b/super1.c index 2ccda5da..b24bceae 100644 --- a/super1.c +++ b/super1.c @@ -496,6 +496,17 @@ static int update_super1(struct mdinfo *info, void *sbv, char *update, memcpy(bm->uuid, info->uuid, 16); } } + 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[33] = 0; + } if (strcmp(update, "name") == 0) { if (info->name[0] == 0) sprintf(info->name, "%d", info->array.md_minor);