浏览代码

skip match_mddev_units check for special roles

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>
Song Liu 10 年之前
父节点
当前提交
0b020e85bd
共有 1 个文件被更改,包括 12 次插入2 次删除
  1. 12 2
      drivers/md/md.c

+ 12 - 2
drivers/md/md.c

@@ -1935,13 +1935,23 @@ static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2)
 	struct md_rdev *rdev, *rdev2;
 	struct md_rdev *rdev, *rdev2;
 
 
 	rcu_read_lock();
 	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 ==
 			if (rdev->bdev->bd_contains ==
 			    rdev2->bdev->bd_contains) {
 			    rdev2->bdev->bd_contains) {
 				rcu_read_unlock();
 				rcu_read_unlock();
 				return 1;
 				return 1;
 			}
 			}
+		}
+	}
 	rcu_read_unlock();
 	rcu_read_unlock();
 	return 0;
 	return 0;
 }
 }