summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-05-23 05:16:32 +0000
committerNeil Brown <neilb@suse.de>2006-05-23 05:16:32 +0000
commit0237e0cafd5ff70304f0b09ed452adbe0e0e6384 (patch)
tree40e3c1614b29ece3e48c095e468ed88f7db9833f
parentc4f12c134069e191b08074b4ed7ba689d0827d11 (diff)
downloadmdadm-0237e0cafd5ff70304f0b09ed452adbe0e0e6384.tar.gz
mdadm-0237e0cafd5ff70304f0b09ed452adbe0e0e6384.tar.xz
mdadm-0237e0cafd5ff70304f0b09ed452adbe0e0e6384.zip
Support --update=homehost to allow updating of homehost information.
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r--mdadm.89
-rw-r--r--mdadm.c2
-rw-r--r--super0.c7
-rw-r--r--super1.c11
4 files changed, 29 insertions, 0 deletions
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
@@ -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
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<<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,
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);