@@ -4839,6 +4839,15 @@ metadata_store(struct mddev *mddev, const char *buf, size_t len)
48394839static struct md_sysfs_entry md_metadata =
48404840__ATTR_PREALLOC (metadata_version , S_IRUGO |S_IWUSR , metadata_show , metadata_store );
48414841
4842+ static bool rdev_needs_recovery (struct md_rdev * rdev , sector_t sectors )
4843+ {
4844+ return rdev -> raid_disk >= 0 &&
4845+ !test_bit (Journal , & rdev -> flags ) &&
4846+ !test_bit (Faulty , & rdev -> flags ) &&
4847+ !test_bit (In_sync , & rdev -> flags ) &&
4848+ rdev -> recovery_offset < sectors ;
4849+ }
4850+
48424851enum sync_action md_sync_action (struct mddev * mddev )
48434852{
48444853 unsigned long recovery = mddev -> recovery ;
@@ -8995,11 +9004,7 @@ static sector_t md_sync_position(struct mddev *mddev, enum sync_action action)
89959004 start = MaxSector ;
89969005 rcu_read_lock ();
89979006 rdev_for_each_rcu (rdev , mddev )
8998- if (rdev -> raid_disk >= 0 &&
8999- !test_bit (Journal , & rdev -> flags ) &&
9000- !test_bit (Faulty , & rdev -> flags ) &&
9001- !test_bit (In_sync , & rdev -> flags ) &&
9002- rdev -> recovery_offset < start )
9007+ if (rdev_needs_recovery (rdev , start ))
90039008 start = rdev -> recovery_offset ;
90049009 rcu_read_unlock ();
90059010
@@ -9358,12 +9363,8 @@ void md_do_sync(struct md_thread *thread)
93589363 test_bit (MD_RECOVERY_RECOVER , & mddev -> recovery )) {
93599364 rcu_read_lock ();
93609365 rdev_for_each_rcu (rdev , mddev )
9361- if (rdev -> raid_disk >= 0 &&
9362- mddev -> delta_disks >= 0 &&
9363- !test_bit (Journal , & rdev -> flags ) &&
9364- !test_bit (Faulty , & rdev -> flags ) &&
9365- !test_bit (In_sync , & rdev -> flags ) &&
9366- rdev -> recovery_offset < mddev -> curr_resync )
9366+ if (mddev -> delta_disks >= 0 &&
9367+ rdev_needs_recovery (rdev , mddev -> curr_resync ))
93679368 rdev -> recovery_offset = mddev -> curr_resync ;
93689369 rcu_read_unlock ();
93699370 }
0 commit comments