@@ -4839,6 +4839,15 @@ metadata_store(struct mddev *mddev, const char *buf, size_t len)
4839
4839
static struct md_sysfs_entry md_metadata =
4840
4840
__ATTR_PREALLOC (metadata_version , S_IRUGO |S_IWUSR , metadata_show , metadata_store );
4841
4841
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
+
4842
4851
enum sync_action md_sync_action (struct mddev * mddev )
4843
4852
{
4844
4853
unsigned long recovery = mddev -> recovery ;
@@ -8995,11 +9004,7 @@ static sector_t md_sync_position(struct mddev *mddev, enum sync_action action)
8995
9004
start = MaxSector ;
8996
9005
rcu_read_lock ();
8997
9006
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 ))
9003
9008
start = rdev -> recovery_offset ;
9004
9009
rcu_read_unlock ();
9005
9010
@@ -9358,12 +9363,8 @@ void md_do_sync(struct md_thread *thread)
9358
9363
test_bit (MD_RECOVERY_RECOVER , & mddev -> recovery )) {
9359
9364
rcu_read_lock ();
9360
9365
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 ))
9367
9368
rdev -> recovery_offset = mddev -> curr_resync ;
9368
9369
rcu_read_unlock ();
9369
9370
}
0 commit comments