diff options
author | NeilBrown <neilb@suse.de> | 2010-08-18 11:56:59 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-08-18 12:04:32 +1000 |
commit | 6b9656205469269c050963c71fca1998b247a560 (patch) | |
tree | 9d090d2e363d269cdc55549213025d86af8ef70a /drivers/md/raid10.c | |
parent | e6ffbcb6cd0ac471223df24ae77eb486c1ee68cc (diff) | |
download | kernel_samsung_smdk4412-6b9656205469269c050963c71fca1998b247a560.zip kernel_samsung_smdk4412-6b9656205469269c050963c71fca1998b247a560.tar.gz kernel_samsung_smdk4412-6b9656205469269c050963c71fca1998b247a560.tar.bz2 |
md: provide appropriate return value for spare_active functions.
md_check_recovery expects ->spare_active to return 'true' if any
spares were activated, but none of them do, so the consequent change
in 'degraded' is not notified through sysfs.
So count the number of spares activated, subtract it from 'degraded'
just once, and return it.
Reported-by: Adrian Drzewiecki <adriand@vmware.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 76d1fc9..a2f8a71 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1116,6 +1116,8 @@ static int raid10_spare_active(mddev_t *mddev) int i; conf_t *conf = mddev->private; mirror_info_t *tmp; + int count = 0; + unsigned long flags; /* * Find all non-in_sync disks within the RAID10 configuration @@ -1126,16 +1128,16 @@ static int raid10_spare_active(mddev_t *mddev) if (tmp->rdev && !test_bit(Faulty, &tmp->rdev->flags) && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { - unsigned long flags; - spin_lock_irqsave(&conf->device_lock, flags); - mddev->degraded--; - spin_unlock_irqrestore(&conf->device_lock, flags); + count++; sysfs_notify_dirent(tmp->rdev->sysfs_state); } } + spin_lock_irqsave(&conf->device_lock, flags); + mddev->degraded -= count; + spin_unlock_irqrestore(&conf->device_lock, flags); print_conf(conf); - return 0; + return count; } |