| From d47648fcf0611812286f68131b40251c6fa54f5e Mon Sep 17 00:00:00 2001 |
| From: Shaohua Li <shli@kernel.org> |
| Date: Sat, 19 Oct 2013 14:51:42 +0800 |
| Subject: raid5: avoid finding "discard" stripe |
| |
| From: Shaohua Li <shli@kernel.org> |
| |
| commit d47648fcf0611812286f68131b40251c6fa54f5e upstream. |
| |
| SCSI discard will damage discard stripe bio setting, eg, some fields are |
| changed. If the stripe is reused very soon, we have wrong bios setting. We |
| remove discard stripe from hash list, so next time the strip will be fully |
| initialized. |
| |
| Suitable for backport to 3.7+. |
| |
| Signed-off-by: Shaohua Li <shli@fusionio.com> |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/raid5.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/drivers/md/raid5.c |
| +++ b/drivers/md/raid5.c |
| @@ -2812,6 +2812,14 @@ static void handle_stripe_clean_event(st |
| } |
| /* now that discard is done we can proceed with any sync */ |
| clear_bit(STRIPE_DISCARD, &sh->state); |
| + /* |
| + * SCSI discard will change some bio fields and the stripe has |
| + * no updated data, so remove it from hash list and the stripe |
| + * will be reinitialized |
| + */ |
| + spin_lock_irq(&conf->device_lock); |
| + remove_hash(sh); |
| + spin_unlock_irq(&conf->device_lock); |
| if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state)) |
| set_bit(STRIPE_HANDLE, &sh->state); |
| |