diff options
author | Neil Brown <neilb@suse.de> | 2006-06-26 12:26:09 +1000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2006-06-26 12:26:09 +1000 |
commit | 7eae7080e2e9edd69d31ae2c88d9e28d1c24217c (patch) | |
tree | 4418e400c725690d29f3e66752515bab63f3fe77 /Manage.c | |
parent | c3684618b7cc50a12a651bf2f83f62b24ba95bcd (diff) | |
download | mdadm-7eae7080e2e9edd69d31ae2c88d9e28d1c24217c.tar.gz mdadm-7eae7080e2e9edd69d31ae2c88d9e28d1c24217c.tar.xz mdadm-7eae7080e2e9edd69d31ae2c88d9e28d1c24217c.zip |
Work around bug in --add handling for version-1 superblocks
In 2.6.17 (and prior), the dev_number is ignored when a device
is added to an active array. Rather the first free number is used.
So we work around this by making sure we use the first free
number for dev_number.
Description...
Diffstat (limited to 'Manage.c')
-rw-r--r-- | Manage.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -271,8 +271,14 @@ int Manage_subdevs(char *devname, int fd, * If so, we can simply re-add it. */ st->ss->uuid_from_super(duuid, dsuper); - - if (osuper) { + + /* re-add doesn't work for version-1 superblocks + * before 2.6.18 :-( + */ + if (array.major_version == 1 && + get_linux_version() <= 2006018) + ; + else if (osuper) { st->ss->uuid_from_super(ouuid, osuper); if (memcmp(duuid, ouuid, sizeof(ouuid))==0) { /* look close enough for now. Kernel @@ -295,7 +301,12 @@ int Manage_subdevs(char *devname, int fd, } } } - for (j=0; j< st->max_devs; j++) { + /* in 2.6.17 and earlier, version-1 superblocks won't + * use the number we write, but will choose a free number. + * we must choose the same free number, which requires + * starting at 'raid_disks' and counting up + */ + for (j = array.raid_disks; j< st->max_devs; j++) { disc.number = j; if (ioctl(fd, GET_DISK_INFO, &disc)) break; |