diff options
author | Neil Brown <neilb@suse.de> | 2007-05-21 14:25:37 +1000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-05-21 14:25:37 +1000 |
commit | f752781f81a68588d0225cf8e3d96eeb6867b245 (patch) | |
tree | 5ab20970f51fdc52017a6fcb95fe5f05d720fbb5 /super0.c | |
parent | 68754bd17c81377091e509367e8d0cf9c80369a5 (diff) | |
download | mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.tar.gz mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.tar.xz mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.zip |
Fix --grow --add for linear arrays.
The new superblock needs to have a new disk.number. This is a bit of a hack...
Fix handling of negative bitmap offsets on 64bit hosts.
The bitmap offset is a signed 32bit number, so casting to (long)
isn't sufficient. We must cast to (int32_t).
Fix various problems with --grow --add for linear.
The code to add a drive to a live linear array had never
been tested properly and so was buggy. This tidies it up
and means that the new regression-test passes.
Diffstat (limited to 'super0.c')
-rw-r--r-- | super0.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -459,7 +459,16 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, rv = 1; } } - if (strcmp(update, "grow") == 0) { + if (strcmp(update, "linear-grow-new") == 0) { + memset(&sb->disks[info->disk.number], 0, sizeof(sb->disks[0])); + sb->disks[info->disk.number].number = info->disk.number; + sb->disks[info->disk.number].major = info->disk.major; + sb->disks[info->disk.number].minor = info->disk.minor; + sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; + sb->disks[info->disk.number].state = info->disk.state; + sb->this_disk = sb->disks[info->disk.number]; + } + if (strcmp(update, "linear-grow-update") == 0) { sb->raid_disks = info->array.raid_disks; sb->nr_disks = info->array.nr_disks; sb->active_disks = info->array.active_disks; @@ -470,8 +479,6 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, sb->disks[info->disk.number].minor = info->disk.minor; sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; sb->disks[info->disk.number].state = info->disk.state; - if (sb->this_disk.number == info->disk.number) - sb->this_disk = sb->disks[info->disk.number]; } if (strcmp(update, "resync") == 0) { /* make sure resync happens */ |