From 0237e0cafd5ff70304f0b09ed452adbe0e0e6384 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 23 May 2006 05:16:32 +0000 Subject: Support --update=homehost to allow updating of homehost information. Signed-off-by: Neil Brown --- mdadm.8 | 9 +++++++++ mdadm.c | 2 ++ super0.c | 7 +++++++ super1.c | 11 +++++++++++ 4 files changed, 29 insertions(+) diff --git a/mdadm.8 b/mdadm.8 index 132052a..ebabaa4 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 42fcf07..0df7369 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 d21032f..85e54fc 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 2ccda5d..b24bcea 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); -- cgit