Commit 45eaf45dfa4850df16bc2e8e7903d89021137f40

Authored by NeilBrown
1 parent 206c5f60a3

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>

Showing 1 changed file with 4 additions and 0 deletions Side-by-side Diff

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