| From foo@baz Sat Nov 10 11:24:34 PST 2018 |
| From: Shaohua Li <shli@fb.com> |
| Date: Mon, 1 Oct 2018 18:36:36 -0700 |
| Subject: MD: fix invalid stored role for a disk |
| |
| From: Shaohua Li <shli@fb.com> |
| |
| [ Upstream commit d595567dc4f0c1d90685ec1e2e296e2cad2643ac ] |
| |
| If we change the number of array's device after device is removed from array, |
| then add the device back to array, we can see that device is added as active |
| role instead of spare which we expected. |
| |
| Please see the below link for details: |
| https://marc.info/?l=linux-raid&m=153736982015076&w=2 |
| |
| This is caused by that we prefer to use device's previous role which is |
| recorded by saved_raid_disk, but we should respect the new number of |
| conf->raid_disks since it could be changed after device is removed. |
| |
| Reported-by: Gioh Kim <gi-oh.kim@profitbricks.com> |
| Tested-by: Gioh Kim <gi-oh.kim@profitbricks.com> |
| Acked-by: Guoqing Jiang <gqjiang@suse.com> |
| Signed-off-by: Shaohua Li <shli@fb.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/md/md.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/md/md.c |
| +++ b/drivers/md/md.c |
| @@ -1665,6 +1665,10 @@ static int super_1_validate(struct mddev |
| } else |
| set_bit(In_sync, &rdev->flags); |
| rdev->raid_disk = role; |
| + if (role >= mddev->raid_disks) { |
| + rdev->saved_raid_disk = -1; |
| + rdev->raid_disk = -1; |
| + } |
| break; |
| } |
| if (sb->devflags & WriteMostly1) |