History

md: Always set RECOVERY_NEEDED when clearing RECOVERY_FROZEN

md_check_recovery will skip any recovery and also clear MD_RECOVERY_NEEDED if MD_RECOVERY_FROZEN is set. So when we clear _FROZEN, we must set _NEEDED and ensure that md_check_recovery gets run. Otherwise we could miss out on something that is needed. In particular, this can make it impossible to remove a failed device from an array is the 'recovery-needed' processing didn't happen. Suitable for stable kernels since 3.13.

NeilBrown committed 12 years ago

Commit 45eaf451 parent 206c5f61 file · +4 −0Browse files

Unified · Split

drivers/md/md.c+4−0
@@ -5121,6 +5121,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) · 5120 unmodified lines
51215121 printk("md: %s still in use.\n",mdname(mddev));
51225122 if (did_freeze) {
51235123 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
5124+ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
51245125 md_wakeup_thread(mddev->thread);
51255126 }
51265127 err = -EBUSY;
@@ -5135,6 +5136,8 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) · 8 unmodified lines
51355136 mddev->ro = 1;
51365137 set_disk_ro(mddev->gendisk, 1);
51375138 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
5139+ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
5140+ md_wakeup_thread(mddev->thread);
51385141 sysfs_notify_dirent_safe(mddev->sysfs_state);
51395142 err = 0;
51405143 }
@@ -5178,6 +5181,7 @@ static int do_md_stop(struct mddev *mddev, int mode, · 37 unmodified lines
51785181 mutex_unlock(&mddev->open_mutex);
51795182 if (did_freeze) {
51805183 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
5184+ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
51815185 md_wakeup_thread(mddev->thread);
51825186 }
51835187 return -EBUSY;

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