skip match_mddev_units check for special roles
authorSong Liu <songliubraving@fb.com>
Fri, 4 Sep 2015 06:00:35 +0000 (23:00 -0700)
committerNeilBrown <neilb@suse.com>
Sun, 1 Nov 2015 02:48:27 +0000 (13:48 +1100)
match_mddev_units is used to check whether 2 RAID arrays share
same disk(s). Arrays that share disk(s) will not do resync at the
same time for better performance (fewer HDD seek). However, this
check should not apply to Spare, Faulty, and Journal disks, as
they do not paticipate in resync.

In this patch, match_mddev_units skips check for disks with flag
"Faulty" or "Journal" or raid_disk < 0.

Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c

index 89149acd8a5e847b0d66460b8881bbb0c5c03a59..fe67272d0b1b0feb0e320ffd324ace153e43d036 100644 (file)
@@ -1935,13 +1935,23 @@ static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2)
        struct md_rdev *rdev, *rdev2;
 
        rcu_read_lock();
-       rdev_for_each_rcu(rdev, mddev1)
-               rdev_for_each_rcu(rdev2, mddev2)
+       rdev_for_each_rcu(rdev, mddev1) {
+               if (test_bit(Faulty, &rdev->flags) ||
+                   test_bit(Journal, &rdev->flags) ||
+                   rdev->raid_disk == -1)
+                       continue;
+               rdev_for_each_rcu(rdev2, mddev2) {
+                       if (test_bit(Faulty, &rdev2->flags) ||
+                           test_bit(Journal, &rdev2->flags) ||
+                           rdev2->raid_disk == -1)
+                               continue;
                        if (rdev->bdev->bd_contains ==
                            rdev2->bdev->bd_contains) {
                                rcu_read_unlock();
                                return 1;
                        }
+               }
+       }
        rcu_read_unlock();
        return 0;
 }