aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/raid5.c20
-rw-r--r--include/linux/raid/raid5.h2
2 files changed, 9 insertions, 13 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index d5a06b258427..1c8ab340a11d 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -698,9 +698,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
698 if (!test_bit(Faulty, &rdev->flags)) { 698 if (!test_bit(Faulty, &rdev->flags)) {
699 set_bit(MD_CHANGE_DEVS, &mddev->flags); 699 set_bit(MD_CHANGE_DEVS, &mddev->flags);
700 if (test_bit(In_sync, &rdev->flags)) { 700 if (test_bit(In_sync, &rdev->flags)) {
701 conf->working_disks--;
702 mddev->degraded++; 701 mddev->degraded++;
703 conf->failed_disks++;
704 clear_bit(In_sync, &rdev->flags); 702 clear_bit(In_sync, &rdev->flags);
705 /* 703 /*
706 * if recovery was running, make sure it aborts. 704 * if recovery was running, make sure it aborts.
@@ -711,7 +709,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
711 printk (KERN_ALERT 709 printk (KERN_ALERT
712 "raid5: Disk failure on %s, disabling device." 710 "raid5: Disk failure on %s, disabling device."
713 " Operation continuing on %d devices\n", 711 " Operation continuing on %d devices\n",
714 bdevname(rdev->bdev,b), conf->working_disks); 712 bdevname(rdev->bdev,b), conf->raid_disks - mddev->degraded);
715 } 713 }
716} 714}
717 715
@@ -3074,6 +3072,7 @@ static int run(mddev_t *mddev)
3074 mdk_rdev_t *rdev; 3072 mdk_rdev_t *rdev;
3075 struct disk_info *disk; 3073 struct disk_info *disk;
3076 struct list_head *tmp; 3074 struct list_head *tmp;
3075 int working_disks = 0;
3077 3076
3078 if (mddev->level != 5 && mddev->level != 4 && mddev->level != 6) { 3077 if (mddev->level != 5 && mddev->level != 4 && mddev->level != 6) {
3079 printk(KERN_ERR "raid5: %s: raid level not set to 4/5/6 (%d)\n", 3078 printk(KERN_ERR "raid5: %s: raid level not set to 4/5/6 (%d)\n",
@@ -3176,14 +3175,14 @@ static int run(mddev_t *mddev)
3176 printk(KERN_INFO "raid5: device %s operational as raid" 3175 printk(KERN_INFO "raid5: device %s operational as raid"
3177 " disk %d\n", bdevname(rdev->bdev,b), 3176 " disk %d\n", bdevname(rdev->bdev,b),
3178 raid_disk); 3177 raid_disk);
3179 conf->working_disks++; 3178 working_disks++;
3180 } 3179 }
3181 } 3180 }
3182 3181
3183 /* 3182 /*
3184 * 0 for a fully functional array, 1 or 2 for a degraded array. 3183 * 0 for a fully functional array, 1 or 2 for a degraded array.
3185 */ 3184 */
3186 mddev->degraded = conf->failed_disks = conf->raid_disks - conf->working_disks; 3185 mddev->degraded = conf->raid_disks - working_disks;
3187 conf->mddev = mddev; 3186 conf->mddev = mddev;
3188 conf->chunk_size = mddev->chunk_size; 3187 conf->chunk_size = mddev->chunk_size;
3189 conf->level = mddev->level; 3188 conf->level = mddev->level;
@@ -3218,7 +3217,7 @@ static int run(mddev_t *mddev)
3218 if (mddev->degraded > conf->max_degraded) { 3217 if (mddev->degraded > conf->max_degraded) {
3219 printk(KERN_ERR "raid5: not enough operational devices for %s" 3218 printk(KERN_ERR "raid5: not enough operational devices for %s"
3220 " (%d/%d failed)\n", 3219 " (%d/%d failed)\n",
3221 mdname(mddev), conf->failed_disks, conf->raid_disks); 3220 mdname(mddev), mddev->degraded, conf->raid_disks);
3222 goto abort; 3221 goto abort;
3223 } 3222 }
3224 3223
@@ -3375,7 +3374,7 @@ static void status (struct seq_file *seq, mddev_t *mddev)
3375 int i; 3374 int i;
3376 3375
3377 seq_printf (seq, " level %d, %dk chunk, algorithm %d", mddev->level, mddev->chunk_size >> 10, mddev->layout); 3376 seq_printf (seq, " level %d, %dk chunk, algorithm %d", mddev->level, mddev->chunk_size >> 10, mddev->layout);
3378 seq_printf (seq, " [%d/%d] [", conf->raid_disks, conf->working_disks); 3377 seq_printf (seq, " [%d/%d] [", conf->raid_disks, conf->raid_disks - mddev->degraded);
3379 for (i = 0; i < conf->raid_disks; i++) 3378 for (i = 0; i < conf->raid_disks; i++)
3380 seq_printf (seq, "%s", 3379 seq_printf (seq, "%s",
3381 conf->disks[i].rdev && 3380 conf->disks[i].rdev &&
@@ -3397,8 +3396,8 @@ static void print_raid5_conf (raid5_conf_t *conf)
3397 printk("(conf==NULL)\n"); 3396 printk("(conf==NULL)\n");
3398 return; 3397 return;
3399 } 3398 }
3400 printk(" --- rd:%d wd:%d fd:%d\n", conf->raid_disks, 3399 printk(" --- rd:%d wd:%d\n", conf->raid_disks,
3401 conf->working_disks, conf->failed_disks); 3400 conf->raid_disks - conf->mddev->degraded);
3402 3401
3403 for (i = 0; i < conf->raid_disks; i++) { 3402 for (i = 0; i < conf->raid_disks; i++) {
3404 char b[BDEVNAME_SIZE]; 3403 char b[BDEVNAME_SIZE];
@@ -3422,8 +3421,6 @@ static int raid5_spare_active(mddev_t *mddev)
3422 && !test_bit(Faulty, &tmp->rdev->flags) 3421 && !test_bit(Faulty, &tmp->rdev->flags)
3423 && !test_bit(In_sync, &tmp->rdev->flags)) { 3422 && !test_bit(In_sync, &tmp->rdev->flags)) {
3424 mddev->degraded--; 3423 mddev->degraded--;
3425 conf->failed_disks--;
3426 conf->working_disks++;
3427 set_bit(In_sync, &tmp->rdev->flags); 3424 set_bit(In_sync, &tmp->rdev->flags);
3428 } 3425 }
3429 } 3426 }
@@ -3593,7 +3590,6 @@ static int raid5_start_reshape(mddev_t *mddev)
3593 if (raid5_add_disk(mddev, rdev)) { 3590 if (raid5_add_disk(mddev, rdev)) {
3594 char nm[20]; 3591 char nm[20];
3595 set_bit(In_sync, &rdev->flags); 3592 set_bit(In_sync, &rdev->flags);
3596 conf->working_disks++;
3597 added_devices++; 3593 added_devices++;
3598 rdev->recovery_offset = 0; 3594 rdev->recovery_offset = 0;
3599 sprintf(nm, "rd%d", rdev->raid_disk); 3595 sprintf(nm, "rd%d", rdev->raid_disk);
diff --git a/include/linux/raid/raid5.h b/include/linux/raid/raid5.h
index f1e28952a82f..f13299a15591 100644
--- a/include/linux/raid/raid5.h
+++ b/include/linux/raid/raid5.h
@@ -214,7 +214,7 @@ struct raid5_private_data {
214 struct disk_info *spare; 214 struct disk_info *spare;
215 int chunk_size, level, algorithm; 215 int chunk_size, level, algorithm;
216 int max_degraded; 216 int max_degraded;
217 int raid_disks, working_disks, failed_disks; 217 int raid_disks;
218 int max_nr_stripes; 218 int max_nr_stripes;
219 219
220 /* used during an expand */ 220 /* used during an expand */