diff options
author | Neil Brown <neilb@suse.de> | 2005-06-07 23:16:32 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-06-07 23:16:32 +0000 |
commit | 892debc8200517e8b00750367acd890199f9f4de (patch) | |
tree | b8add571ad863cf2667ea3a65c7c1d2f25468933 /super1.c | |
parent | eaac7dde0997d00241fea29b6e23659b7d167a65 (diff) | |
download | mdadm-892debc8200517e8b00750367acd890199f9f4de.tar.gz mdadm-892debc8200517e8b00750367acd890199f9f4de.tar.xz mdadm-892debc8200517e8b00750367acd890199f9f4de.zip |
Use ADD_NEW_DISK to hot-add to non-version-0 arrays
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'super1.c')
-rw-r--r-- | super1.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -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); |