@@ -4822,6 +4822,15 @@ metadata_store(struct mddev *mddev, const char *buf, size_t len)
48224822static struct md_sysfs_entry md_metadata =
48234823__ATTR_PREALLOC (metadata_version , S_IRUGO |S_IWUSR , metadata_show , metadata_store );
48244824
4825+ static bool rdev_needs_recovery (struct md_rdev * rdev , sector_t sectors )
4826+ {
4827+ return rdev -> raid_disk >= 0 &&
4828+ !test_bit (Journal , & rdev -> flags ) &&
4829+ !test_bit (Faulty , & rdev -> flags ) &&
4830+ !test_bit (In_sync , & rdev -> flags ) &&
4831+ rdev -> recovery_offset < sectors ;
4832+ }
4833+
48254834enum sync_action md_sync_action (struct mddev * mddev )
48264835{
48274836 unsigned long recovery = mddev -> recovery ;
@@ -8959,11 +8968,7 @@ static sector_t md_sync_position(struct mddev *mddev, enum sync_action action)
89598968 start = MaxSector ;
89608969 rcu_read_lock ();
89618970 rdev_for_each_rcu (rdev , mddev )
8962- if (rdev -> raid_disk >= 0 &&
8963- !test_bit (Journal , & rdev -> flags ) &&
8964- !test_bit (Faulty , & rdev -> flags ) &&
8965- !test_bit (In_sync , & rdev -> flags ) &&
8966- rdev -> recovery_offset < start )
8971+ if (rdev_needs_recovery (rdev , start ))
89678972 start = rdev -> recovery_offset ;
89688973 rcu_read_unlock ();
89698974
@@ -9322,12 +9327,8 @@ void md_do_sync(struct md_thread *thread)
93229327 test_bit (MD_RECOVERY_RECOVER , & mddev -> recovery )) {
93239328 rcu_read_lock ();
93249329 rdev_for_each_rcu (rdev , mddev )
9325- if (rdev -> raid_disk >= 0 &&
9326- mddev -> delta_disks >= 0 &&
9327- !test_bit (Journal , & rdev -> flags ) &&
9328- !test_bit (Faulty , & rdev -> flags ) &&
9329- !test_bit (In_sync , & rdev -> flags ) &&
9330- rdev -> recovery_offset < mddev -> curr_resync )
9330+ if (mddev -> delta_disks >= 0 &&
9331+ rdev_needs_recovery (rdev , mddev -> curr_resync ))
93319332 rdev -> recovery_offset = mddev -> curr_resync ;
93329333 rcu_read_unlock ();
93339334 }
0 commit comments