summaryrefslogtreecommitdiffstats
path: root/super1.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-12-14 17:33:10 +1100
committerNeil Brown <neilb@suse.de>2006-12-14 17:33:10 +1100
commit3d3dd91e3837d5eb6eeaa876c39153f2b0a4929d (patch)
tree912f688af1c896c0ee76ef5a517a2e25e3860e58 /super1.c
parent4855f95c7081d7438b55fed8f8808cc656f0ccc0 (diff)
downloadmdadm-3d3dd91e3837d5eb6eeaa876c39153f2b0a4929d.tar.gz
mdadm-3d3dd91e3837d5eb6eeaa876c39153f2b0a4929d.tar.xz
mdadm-3d3dd91e3837d5eb6eeaa876c39153f2b0a4929d.zip
Support --uuid= with --create to choose your own UUID.
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/super1.c b/super1.c
index 88f1502..eb6499e 100644
--- a/super1.c
+++ b/super1.c
@@ -600,7 +600,7 @@ static int update_super1(struct mdinfo *info, void *sbv, char *update,
}
static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
- unsigned long long size, char *name, char *homehost)
+ unsigned long long size, char *name, char *homehost, int *uuid)
{
struct mdp_superblock_1 *sb = malloc(1024 + sizeof(bitmap_super_t) +
sizeof(struct misc_dev_info));
@@ -627,14 +627,29 @@ static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
sb->feature_map = 0;
sb->pad0 = 0;
- if ((rfd = open("/dev/urandom", O_RDONLY)) < 0 ||
- read(rfd, sb->set_uuid, 16) != 16) {
- *(__u32*)(sb->set_uuid) = random();
- *(__u32*)(sb->set_uuid+4) = random();
- *(__u32*)(sb->set_uuid+8) = random();
- *(__u32*)(sb->set_uuid+12) = random();
+ if (uuid) {
+ if (super1.swapuuid) {
+ unsigned char *ac = (unsigned char *)sb->set_uuid;
+ unsigned char *bc = (unsigned char *)uuid;
+ int i;
+ for (i=0; i<16; i+= 4) {
+ ac[i+0] = bc[i+3];
+ ac[i+1] = bc[i+2];
+ ac[i+2] = bc[i+1];
+ ac[i+3] = bc[i+0];
+ }
+ } else
+ memcpy(sb->set_uuid, uuid, 16);
+ } else {
+ if ((rfd = open("/dev/urandom", O_RDONLY)) < 0 ||
+ read(rfd, sb->set_uuid, 16) != 16) {
+ *(__u32*)(sb->set_uuid) = random();
+ *(__u32*)(sb->set_uuid+4) = random();
+ *(__u32*)(sb->set_uuid+8) = random();
+ *(__u32*)(sb->set_uuid+12) = random();
+ }
+ if (rfd >= 0) close(rfd);
}
- if (rfd >= 0) close(rfd);
if (name == NULL || *name == 0) {
sprintf(defname, "%d", info->md_minor);