diff options
author | Neil Brown <neilb@suse.de> | 2006-12-14 07:33:10 +0100 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2006-12-14 07:33:10 +0100 |
commit | 3d3dd91e3837d5eb6eeaa876c39153f2b0a4929d (patch) | |
tree | 912f688af1c896c0ee76ef5a517a2e25e3860e58 /super1.c | |
parent | Fix bug where v1 superblock might appear active when they should be clean. (diff) | |
download | 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.c | 31 |
1 files changed, 23 insertions, 8 deletions
@@ -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); |