From a0c8a17f66f944151434dff06dd28c83e0893e88 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Sat, 12 Jul 2008 20:27:36 +1000 Subject: [PATCH] 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. --- super0.c | 2 ++ super1.c | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/super0.c b/super0.c index 1ca3536..e8cc3f3 100644 --- a/super0.c +++ b/super0.c @@ -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); diff --git a/super1.c b/super1.c index 0fe54e9..bebd5f9 100644 --- a/super1.c +++ b/super1.c @@ -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<devflags |= __cpu_to_le32(WriteMostly1);