diff options
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 233a4faede94..64f8016ab740 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -950,14 +950,16 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
950 | * really dead" tests... | 950 | * really dead" tests... |
951 | */ | 951 | */ |
952 | return; | 952 | return; |
953 | if (test_bit(In_sync, &rdev->flags)) { | 953 | if (test_and_clear_bit(In_sync, &rdev->flags)) { |
954 | unsigned long flags; | ||
955 | spin_lock_irqsave(&conf->device_lock, flags); | ||
954 | mddev->degraded++; | 956 | mddev->degraded++; |
957 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
955 | /* | 958 | /* |
956 | * if recovery is running, make sure it aborts. | 959 | * if recovery is running, make sure it aborts. |
957 | */ | 960 | */ |
958 | set_bit(MD_RECOVERY_ERR, &mddev->recovery); | 961 | set_bit(MD_RECOVERY_ERR, &mddev->recovery); |
959 | } | 962 | } |
960 | clear_bit(In_sync, &rdev->flags); | ||
961 | set_bit(Faulty, &rdev->flags); | 963 | set_bit(Faulty, &rdev->flags); |
962 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 964 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
963 | printk(KERN_ALERT "raid10: Disk failure on %s, disabling device. \n" | 965 | printk(KERN_ALERT "raid10: Disk failure on %s, disabling device. \n" |
@@ -1033,9 +1035,11 @@ static int raid10_spare_active(mddev_t *mddev) | |||
1033 | tmp = conf->mirrors + i; | 1035 | tmp = conf->mirrors + i; |
1034 | if (tmp->rdev | 1036 | if (tmp->rdev |
1035 | && !test_bit(Faulty, &tmp->rdev->flags) | 1037 | && !test_bit(Faulty, &tmp->rdev->flags) |
1036 | && !test_bit(In_sync, &tmp->rdev->flags)) { | 1038 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
1039 | unsigned long flags; | ||
1040 | spin_lock_irqsave(&conf->device_lock, flags); | ||
1037 | mddev->degraded--; | 1041 | mddev->degraded--; |
1038 | set_bit(In_sync, &tmp->rdev->flags); | 1042 | spin_unlock_irqrestore(&conf->device_lock, flags); |
1039 | } | 1043 | } |
1040 | } | 1044 | } |
1041 | 1045 | ||