summaryrefslogtreecommitdiffstats
path: root/super1.c
diff options
context:
space:
mode:
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/super1.c b/super1.c
index 6330248..751e28d 100644
--- a/super1.c
+++ b/super1.c
@@ -459,10 +459,13 @@ static int store_super1(int fd, void *sbv)
return 0;
}
+static int load_super1(struct supertype *st, int fd, void **sbp, char *devname);
+
static int write_init_super1(struct supertype *st, void *sbv, mdu_disk_info_t *dinfo, char *devname)
{
struct mdp_superblock_1 *sb = sbv;
- int fd = open(devname, O_RDWR, O_EXCL);
+ struct mdp_superblock_1 *refsb = NULL;
+ int fd = open(devname, O_RDWR | O_EXCL);
int rv;
long size;
@@ -476,11 +479,22 @@ static int write_init_super1(struct supertype *st, void *sbv, mdu_disk_info_t *d
}
sb->dev_number = __cpu_to_le32(dinfo->number);
+
*(__u32*)(sb->device_uuid) = random();
*(__u32*)(sb->device_uuid+4) = random();
*(__u32*)(sb->device_uuid+8) = random();
*(__u32*)(sb->device_uuid+12) = random();
-
+ sb->events = 0;
+
+ if (load_super1(st, fd, (void**)&refsb, NULL)==0) {
+ memcpy(sb->device_uuid, refsb->device_uuid, 16);
+ if (memcmp(sb->set_uuid, refsb->set_uuid, 16)==0) {
+ /* same array, so preserve events and dev_number */
+ sb->events = refsb->events;
+ sb->dev_number = refsb->dev_number;
+ }
+ free(refsb);
+ }
if (ioctl(fd, BLKGETSIZE, &size)) {
close(fd);