File tree Expand file tree Collapse file tree 1 file changed +8
-3
lines changed Expand file tree Collapse file tree 1 file changed +8
-3
lines changed Original file line number Diff line number Diff line change @@ -9417,8 +9417,13 @@ static void md_start_sync(struct work_struct *ws)
9417
9417
{
9418
9418
struct mddev * mddev = container_of (ws , struct mddev , sync_work );
9419
9419
int spares = 0 ;
9420
+ bool suspend = false;
9420
9421
9421
- mddev_lock_nointr (mddev );
9422
+ if (md_spares_need_change (mddev ))
9423
+ suspend = true;
9424
+
9425
+ suspend ? mddev_suspend_and_lock_nointr (mddev ) :
9426
+ mddev_lock_nointr (mddev );
9422
9427
9423
9428
if (!md_is_rdwr (mddev )) {
9424
9429
/*
@@ -9454,7 +9459,7 @@ static void md_start_sync(struct work_struct *ws)
9454
9459
goto not_running ;
9455
9460
}
9456
9461
9457
- mddev_unlock (mddev );
9462
+ suspend ? mddev_unlock_and_resume ( mddev ) : mddev_unlock (mddev );
9458
9463
md_wakeup_thread (mddev -> sync_thread );
9459
9464
sysfs_notify_dirent_safe (mddev -> sysfs_action );
9460
9465
md_new_event ();
@@ -9466,7 +9471,7 @@ static void md_start_sync(struct work_struct *ws)
9466
9471
clear_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
9467
9472
clear_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
9468
9473
clear_bit (MD_RECOVERY_RUNNING , & mddev -> recovery );
9469
- mddev_unlock (mddev );
9474
+ suspend ? mddev_unlock_and_resume ( mddev ) : mddev_unlock (mddev );
9470
9475
9471
9476
wake_up (& resync_wait );
9472
9477
if (test_and_clear_bit (MD_RECOVERY_RECOVER , & mddev -> recovery ) &&
You can’t perform that action at this time.
0 commit comments