From: Yu Kuai <yukuai3@xxxxxxxxxx> There are no functional changes, just to make the code simpler and prepare to delay remove_and_add_spares() to md_start_sync(). Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- drivers/md/md.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 561cac13ff96..ceace5ffadd6 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9153,6 +9153,22 @@ void md_do_sync(struct md_thread *thread) } EXPORT_SYMBOL_GPL(md_do_sync); +static bool rdev_removeable(struct md_rdev *rdev) +{ + if (rdev->raid_disk < 0 || test_bit(Blocked, &rdev->flags) || + atomic_read(&rdev->nr_pending)) + return false; + + if (test_bit(RemoveSynchronized, &rdev->flags)) + return true; + + if (test_bit(In_sync, &rdev->flags) || + test_bit(Journal, &rdev->flags)) + return false; + + return true; +} + static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this) { @@ -9166,11 +9182,7 @@ static int remove_and_add_spares(struct mddev *mddev, return 0; rdev_for_each(rdev, mddev) { - if ((this == NULL || rdev == this) && - rdev->raid_disk >= 0 && - !test_bit(Blocked, &rdev->flags) && - test_bit(Faulty, &rdev->flags) && - atomic_read(&rdev->nr_pending)==0) { + if ((this == NULL || rdev == this) && rdev_removeable(rdev)) { /* Faulty non-Blocked devices with nr_pending == 0 * never get nr_pending incremented, * never get Faulty cleared, and never get Blocked set. @@ -9185,19 +9197,12 @@ static int remove_and_add_spares(struct mddev *mddev, synchronize_rcu(); rdev_for_each(rdev, mddev) { if ((this == NULL || rdev == this) && - rdev->raid_disk >= 0 && - !test_bit(Blocked, &rdev->flags) && - ((test_bit(RemoveSynchronized, &rdev->flags) || - (!test_bit(In_sync, &rdev->flags) && - !test_bit(Journal, &rdev->flags))) && - atomic_read(&rdev->nr_pending)==0)) { - if (mddev->pers->hot_remove_disk( - mddev, rdev) == 0) { + rdev_removeable(rdev) && + mddev->pers->hot_remove_disk(mddev, rdev) == 0) { sysfs_unlink_rdev(mddev, rdev); rdev->saved_raid_disk = rdev->raid_disk; rdev->raid_disk = -1; removed++; - } } if (remove_some && test_bit(RemoveSynchronized, &rdev->flags)) clear_bit(RemoveSynchronized, &rdev->flags); -- 2.39.2