md: tidy up rdev_for_each usage.
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / md / raid5.c
index 360f2b98f62b3eaf946d3420e816c822bbe9e37e..23ac880bba9a5cbee0533e5144f135d3eb120ace 100644 (file)
@@ -208,11 +208,10 @@ static void __release_stripe(struct r5conf *conf, struct stripe_head *sh)
                        md_wakeup_thread(conf->mddev->thread);
                } else {
                        BUG_ON(stripe_operations_active(sh));
-                       if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) {
-                               atomic_dec(&conf->preread_active_stripes);
-                               if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD)
+                       if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
+                               if (atomic_dec_return(&conf->preread_active_stripes)
+                                   < IO_THRESHOLD)
                                        md_wakeup_thread(conf->mddev->thread);
-                       }
                        atomic_dec(&conf->active_stripes);
                        if (!test_bit(STRIPE_EXPANDING, &sh->state)) {
                                list_add_tail(&sh->lru, &conf->inactive_list);
@@ -4843,7 +4842,7 @@ static struct r5conf *setup_conf(struct mddev *mddev)
 
        pr_debug("raid456: run(%s) called.\n", mdname(mddev));
 
-       list_for_each_entry(rdev, &mddev->disks, same_set) {
+       rdev_for_each(rdev, mddev) {
                raid_disk = rdev->raid_disk;
                if (raid_disk >= max_disks
                    || raid_disk < 0)
@@ -5178,7 +5177,7 @@ static int run(struct mddev *mddev)
                blk_queue_io_opt(mddev->queue, chunk_size *
                                 (conf->raid_disks - conf->max_degraded));
 
-               list_for_each_entry(rdev, &mddev->disks, same_set)
+               rdev_for_each(rdev, mddev)
                        disk_stack_limits(mddev->gendisk, rdev->bdev,
                                          rdev->data_offset << 9);
        }
@@ -5362,7 +5361,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
        if (mddev->recovery_disabled == conf->recovery_disabled)
                return -EBUSY;
 
-       if (has_failed(conf))
+       if (rdev->saved_raid_disk < 0 && has_failed(conf))
                /* no point adding a device */
                return -EINVAL;
 
@@ -5501,7 +5500,7 @@ static int raid5_start_reshape(struct mddev *mddev)
        if (!check_stripe_cache(mddev))
                return -ENOSPC;
 
-       list_for_each_entry(rdev, &mddev->disks, same_set)
+       rdev_for_each(rdev, mddev)
                if (!test_bit(In_sync, &rdev->flags)
                    && !test_bit(Faulty, &rdev->flags))
                        spares++;
@@ -5547,16 +5546,14 @@ static int raid5_start_reshape(struct mddev *mddev)
         * such devices during the reshape and confusion could result.
         */
        if (mddev->delta_disks >= 0) {
-               int added_devices = 0;
-               list_for_each_entry(rdev, &mddev->disks, same_set)
+               rdev_for_each(rdev, mddev)
                        if (rdev->raid_disk < 0 &&
                            !test_bit(Faulty, &rdev->flags)) {
                                if (raid5_add_disk(mddev, rdev) == 0) {
                                        if (rdev->raid_disk
-                                           >= conf->previous_raid_disks) {
+                                           >= conf->previous_raid_disks)
                                                set_bit(In_sync, &rdev->flags);
-                                               added_devices++;
-                                       } else
+                                       else
                                                rdev->recovery_offset = 0;
 
                                        if (sysfs_link_rdev(mddev, rdev))
@@ -5566,7 +5563,6 @@ static int raid5_start_reshape(struct mddev *mddev)
                                   && !test_bit(Faulty, &rdev->flags)) {
                                /* This is a spare that was manually added */
                                set_bit(In_sync, &rdev->flags);
-                               added_devices++;
                        }
 
                /* When a reshape changes the number of devices,
@@ -5592,6 +5588,7 @@ static int raid5_start_reshape(struct mddev *mddev)
                spin_lock_irq(&conf->device_lock);
                mddev->raid_disks = conf->raid_disks = conf->previous_raid_disks;
                conf->reshape_progress = MaxSector;
+               mddev->reshape_position = MaxSector;
                spin_unlock_irq(&conf->device_lock);
                return -EAGAIN;
        }