Loading drivers/md/raid5.c +32 −26 Original line number Diff line number Diff line Loading @@ -5086,10 +5086,17 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) struct r5conf *conf = mddev->private; int err = 0; int number = rdev->raid_disk; struct md_rdev **rdevp; struct disk_info *p = conf->disks + number; print_raid5_conf(conf); if (rdev == p->rdev) { if (rdev == p->rdev) rdevp = &p->rdev; else if (rdev == p->replacement) rdevp = &p->replacement; else return 0; if (number >= conf->raid_disks && conf->reshape_progress == MaxSector) clear_bit(In_sync, &rdev->flags); Loading @@ -5109,13 +5116,12 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) err = -EBUSY; goto abort; } p->rdev = NULL; *rdevp = NULL; synchronize_rcu(); if (atomic_read(&rdev->nr_pending)) { /* lost the race, try later */ err = -EBUSY; p->rdev = rdev; } *rdevp = rdev; } abort: Loading Loading
drivers/md/raid5.c +32 −26 Original line number Diff line number Diff line Loading @@ -5086,10 +5086,17 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) struct r5conf *conf = mddev->private; int err = 0; int number = rdev->raid_disk; struct md_rdev **rdevp; struct disk_info *p = conf->disks + number; print_raid5_conf(conf); if (rdev == p->rdev) { if (rdev == p->rdev) rdevp = &p->rdev; else if (rdev == p->replacement) rdevp = &p->replacement; else return 0; if (number >= conf->raid_disks && conf->reshape_progress == MaxSector) clear_bit(In_sync, &rdev->flags); Loading @@ -5109,13 +5116,12 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) err = -EBUSY; goto abort; } p->rdev = NULL; *rdevp = NULL; synchronize_rcu(); if (atomic_read(&rdev->nr_pending)) { /* lost the race, try later */ err = -EBUSY; p->rdev = rdev; } *rdevp = rdev; } abort: Loading