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.

Cc: stable@vger.kernel.org (3.13+)
Reported-and-tested-by: Joe Lawrence <joe.lawrence@stratus.com>
Fixes: 30b8feb730f9b9b3c5de02580897da03f59b6b16
Signed-off-by: NeilBrown <neilb@suse.de>

NeilBrown 45eaf45d 206c5f60

+4
+4
drivers/md/md.c
··· 5121 printk("md: %s still in use.\n",mdname(mddev)); 5122 if (did_freeze) { 5123 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5124 md_wakeup_thread(mddev->thread); 5125 } 5126 err = -EBUSY; ··· 5136 mddev->ro = 1; 5137 set_disk_ro(mddev->gendisk, 1); 5138 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5139 sysfs_notify_dirent_safe(mddev->sysfs_state); 5140 err = 0; 5141 } ··· 5181 mutex_unlock(&mddev->open_mutex); 5182 if (did_freeze) { 5183 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5184 md_wakeup_thread(mddev->thread); 5185 } 5186 return -EBUSY;
··· 5121 printk("md: %s still in use.\n",mdname(mddev)); 5122 if (did_freeze) { 5123 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5124 + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 5125 md_wakeup_thread(mddev->thread); 5126 } 5127 err = -EBUSY; ··· 5135 mddev->ro = 1; 5136 set_disk_ro(mddev->gendisk, 1); 5137 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5138 + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 5139 + md_wakeup_thread(mddev->thread); 5140 sysfs_notify_dirent_safe(mddev->sysfs_state); 5141 err = 0; 5142 } ··· 5178 mutex_unlock(&mddev->open_mutex); 5179 if (did_freeze) { 5180 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5181 + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 5182 md_wakeup_thread(mddev->thread); 5183 } 5184 return -EBUSY;