History

md: make sure MD_RECOVERY_DONE is clear before starting recovery/resync

MD_RECOVERY_DONE is normally cleared by md_check_recovery after a resync etc finished. However it is possible for raid5_start_reshape to race and start a reshape before MD_RECOVERY_DONE is cleared. This can lean to multiple reshapes running at the same time, which isn't good. To make sure it is cleared before starting a reshape, and also clear it when reaping a thread, just to be safe.

NeilBrown committed 11 years ago

Commit ea358cd1 parent 8e8e2513 files · +3 −0Browse files

Unified · Split

3 files
  1. drivers/md/md.c +1 −0
  2. drivers/md/raid10.c +1 −0
  3. drivers/md/raid5.c +1 −0
drivers/md/md.c+1−0
@@ -8262,6 +8262,7 @@ void md_reap_sync_thread(struct mddev *mddev) · 8261 unmodified lines
8262 if (mddev_is_clustered(mddev))8262 if (mddev_is_clustered(mddev))
8263 md_cluster_ops->metadata_update_finish(mddev);8263 md_cluster_ops->metadata_update_finish(mddev);
8264 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);8264 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
8265 clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
8265 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);8266 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
8266 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);8267 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
8267 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);8268 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
drivers/md/raid10.c+1−0
@@ -4156,6 +4156,7 @@ static int raid10_start_reshape(struct mddev *mddev) · 4155 unmodified lines
4156 4156
4157 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);4157 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
4158 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);4158 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
4159 clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
4159 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);4160 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
4160 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);4161 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
4161 4162
drivers/md/raid5.c+1−0
@@ -7354,6 +7354,7 @@ static int raid5_start_reshape(struct mddev *mddev) · 7353 unmodified lines
7354 7354
7355 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);7355 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
7356 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);7356 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
7357 clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
7357 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);7358 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
7358 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);7359 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
7359 mddev->sync_thread = md_register_thread(md_do_sync, mddev,7360 mddev->sync_thread = md_register_thread(md_do_sync, mddev,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t