X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=super1.c;h=a480f21cf3386fbdfdd059238b37804f64147b70;hb=350f29f90d1f6bb3ddfafea368327911f9e8b27c;hp=f1732f7b6c751e56842b255702e4bf3ad5b2f729;hpb=beae1dfe2e5a3f11e6e52a93fbf617d644708415;p=thirdparty%2Fmdadm.git diff --git a/super1.c b/super1.c index f1732f7b..a480f21c 100644 --- a/super1.c +++ b/super1.c @@ -431,7 +431,9 @@ static void getinfo_super1(struct mdinfo *info, void *sbv) info->array.ctime = __le64_to_cpu(sb->ctime); info->array.utime = __le64_to_cpu(sb->utime); info->array.chunk_size = __le32_to_cpu(sb->chunksize)*512; - info->array.state = (__le64_to_cpu(sb->resync_offset)+1) ? 0 : 1; + info->array.state = + (__le64_to_cpu(sb->resync_offset) >= __le64_to_cpu(sb->size)) + ? 1 : 0; info->data_offset = __le64_to_cpu(sb->data_offset); info->component_size = __le64_to_cpu(sb->size); @@ -536,18 +538,7 @@ static int update_super1(struct mdinfo *info, void *sbv, char *update, sb->resync_offset = 0ULL; } if (strcmp(update, "uuid") == 0) { - if (super1.swapuuid) { - unsigned char *ac = (unsigned char *)sb->set_uuid; - unsigned char *bc = (unsigned char *)info->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, info->uuid, 16); + copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid); if (__le32_to_cpu(sb->feature_map)&MD_FEATURE_BITMAP_OFFSET) { struct bitmap_super_s *bm; @@ -598,7 +589,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)); @@ -625,14 +616,18 @@ 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) + copy_uuid(sb->set_uuid, uuid, super1.swapuuid); + 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);