diff options
-rw-r--r-- | mdadm.8 | 9 | ||||
-rw-r--r-- | mdadm.c | 2 | ||||
-rw-r--r-- | super0.c | 7 | ||||
-rw-r--r-- | super1.c | 11 |
4 files changed, 29 insertions, 0 deletions
@@ -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 @@ -690,6 +691,14 @@ 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 .I dirty @@ -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"); @@ -442,6 +442,13 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, sb->state &= ~(1<<MD_SB_CLEAN); sb->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, @@ -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); |