Fix write_init_super usage when hot-adding a spare

Using write_init_super to add a spare to an active array is quite
different to how it is used when creating an array.

It mostly works, but if we are adding two devices to an array,
then when we add the second, there are still traces of the first
which confuse write_init_super.

So get write_init_super to ignore those traces.  Longer term, we
probably want to do this differently as for DDF, hot-adding to
an active array will have to be quite different - it will want to
write to all metadata, possibly via mdmon.
This commit is contained in:
Neil Brown 2008-07-12 20:27:36 +10:00
parent 6264b43733
commit a0c8a17f66
2 changed files with 4 additions and 6 deletions

View File

@ -698,6 +698,8 @@ static int write_init_super0(struct supertype *st)
if (di->disk.state == 1)
continue;
if (di->fd == -1)
continue;
Kill(di->devname, 0, 1, 1);
Kill(di->devname, 0, 1, 1);

View File

@ -900,16 +900,12 @@ static int write_init_super1(struct supertype *st)
for (di = st->info; di && ! rv ; di = di->next) {
if (di->disk.state == 1)
continue;
if (di->fd < 0)
continue;
Kill(di->devname, 0, 1, 1);
Kill(di->devname, 0, 1, 1);
if (di->fd < 0) {
fprintf(stderr,
Name": Failed to open %s to write superblock\n",
di->devname);
return -1;
}
sb->dev_number = __cpu_to_le32(di->disk.number);
if (di->disk.state & (1<<MD_DISK_WRITEMOSTLY))
sb->devflags |= __cpu_to_le32(WriteMostly1);