raid5: don't set STRIPE_HANDLE to stripe which is in batch list
If stripe in batch list is set with STRIPE_HANDLE flag, then the stripe
could be set with STRIPE_ACTIVE by the handle_stripe function. And if
error happens to the batch_head at the same time, break_stripe_batch_list
is called, then below warning could happen (the same report in [1]), it
means a member of batch list was set with STRIPE_ACTIVE.
[
7028915.431770] stripe state: 2001
[
7028915.431815] ------------[ cut here ]------------
[
7028915.431828] WARNING: CPU: 18 PID: 29089 at drivers/md/raid5.c:4614 break_stripe_batch_list+0x203/0x240 [raid456]
[...]
[
7028915.431879] CPU: 18 PID: 29089 Comm: kworker/u82:5 Tainted: G O 4.14.86-1-storage #4.14.86-1.2~deb9
[
7028915.431881] Hardware name: Supermicro SSG-2028R-ACR24L/X10DRH-iT, BIOS 3.1 06/18/2018
[
7028915.431888] Workqueue: raid5wq raid5_do_work [raid456]
[
7028915.431890] task:
ffff9ab0ef36d7c0 task.stack:
ffffb72926f84000
[
7028915.431896] RIP: 0010:break_stripe_batch_list+0x203/0x240 [raid456]
[
7028915.431898] RSP: 0018:
ffffb72926f87ba8 EFLAGS:
00010286
[
7028915.431900] RAX:
0000000000000012 RBX:
ffff9aaa84a98000 RCX:
0000000000000000
[
7028915.431901] RDX:
0000000000000000 RSI:
ffff9ab2bfa15458 RDI:
ffff9ab2bfa15458
[
7028915.431902] RBP:
ffff9aaa8fb4e900 R08:
0000000000000001 R09:
0000000000002eb4
[
7028915.431903] R10:
00000000ffffffff R11:
0000000000000000 R12:
ffff9ab1736f1b00
[
7028915.431904] R13:
0000000000000000 R14:
ffff9aaa8fb4e900 R15:
0000000000000001
[
7028915.431906] FS:
0000000000000000(0000) GS:
ffff9ab2bfa00000(0000) knlGS:
0000000000000000
[
7028915.431907] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[
7028915.431908] CR2:
00007ff953b9f5d8 CR3:
0000000bf4009002 CR4:
00000000003606e0
[
7028915.431909] DR0:
0000000000000000 DR1:
0000000000000000 DR2:
0000000000000000
[
7028915.431910] DR3:
0000000000000000 DR6:
00000000fffe0ff0 DR7:
0000000000000400
[
7028915.431910] Call Trace:
[
7028915.431923] handle_stripe+0x8e7/0x2020 [raid456]
[
7028915.431930] ? __wake_up_common_lock+0x89/0xc0
[
7028915.431935] handle_active_stripes.isra.58+0x35f/0x560 [raid456]
[
7028915.431939] raid5_do_work+0xc6/0x1f0 [raid456]
Also commit
59fc630b8b5f9f ("RAID5: batch adjacent full stripe write")
said "If a stripe is added to batch list, then only the first stripe
of the list should be put to handle_list and run handle_stripe."
So don't set STRIPE_HANDLE to stripe which is already in batch list,
otherwise the stripe could be put to handle_list and run handle_stripe,
then the above warning could be triggered.
[1]. https://www.spinics.net/lists/raid/msg62552.html
Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Signed-off-by: Song Liu <songliubraving@fb.com>