Guoqing Jiang a377a472b9 raid5: call clear_batch_ready before set STRIPE_ACTIVE
We tried to only put the head sh of batch list to handle_list, then the
handle_stripe doesn't handle other members in the batch list. However,
we still got the calltrace in break_stripe_batch_list.

[593764.644269] stripe state: 2003
kernel: [593764.644299] ------------[ cut here ]------------
kernel: [593764.644308] WARNING: CPU: 12 PID: 856 at drivers/md/raid5.c:4625 break_stripe_batch_list+0x203/0x240 [raid456]
[...]
kernel: [593764.644363] Call Trace:
kernel: [593764.644370]  handle_stripe+0x907/0x20c0 [raid456]
kernel: [593764.644376]  ? __wake_up_common_lock+0x89/0xc0
kernel: [593764.644379]  handle_active_stripes.isra.57+0x35f/0x570 [raid456]
kernel: [593764.644382]  ? raid5_wakeup_stripe_thread+0x96/0x1f0 [raid456]
kernel: [593764.644385]  raid5d+0x480/0x6a0 [raid456]
kernel: [593764.644390]  ? md_thread+0x11f/0x160
kernel: [593764.644392]  md_thread+0x11f/0x160
kernel: [593764.644394]  ? wait_woken+0x80/0x80
kernel: [593764.644396]  kthread+0xfc/0x130
kernel: [593764.644398]  ? find_pers+0x70/0x70
kernel: [593764.644399]  ? kthread_create_on_node+0x70/0x70
kernel: [593764.644401]  ret_from_fork+0x1f/0x30

As we can see, the stripe was set with STRIPE_ACTIVE and STRIPE_HANDLE,
and only handle_stripe could set those flags then return. And since the
stipe was already in the batch list, we need to return earlier before
set the two flags.

And after dig a little about git history especially commit 3664847d95e6
("md/raid5: fix a race condition in stripe batch"), it seems the batched
stipe still could be handled by handle_stipe, then handle_stipe needs to
return earlier if clear_batch_ready to return true.

Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
2020-07-16 10:12:18 -07:00
..
2020-07-03 16:15:31 +02:00
2020-06-19 13:09:40 -07:00
2020-06-26 12:32:11 -07:00
2020-06-28 14:41:55 +02:00
2020-07-02 17:49:00 +03:00
2020-06-28 14:55:18 -07:00
2020-06-26 17:26:31 +02:00
2020-07-03 11:18:21 +10:00
2020-06-04 11:03:45 -07:00
2020-06-13 13:29:16 -07:00
2020-06-11 12:53:23 -07:00
2020-06-13 13:29:16 -07:00
2020-06-13 13:29:16 -07:00
2020-06-04 19:09:28 +02:00
2020-06-08 13:01:08 -07:00
2020-06-08 13:01:08 -07:00
2020-06-07 16:11:23 -07:00
2020-07-15 08:47:11 -06:00
2020-06-28 14:57:14 -07:00
2020-06-29 10:10:16 -07:00
2020-06-13 13:29:16 -07:00
2020-07-08 08:02:13 -06:00
2020-06-27 13:12:10 -07:00
2020-06-22 12:34:21 -04:00
2020-07-03 23:58:12 -07:00