md/raid1,raid10: fix deadlock in read error recovery path
authorAbd-Alrhman Masalkhi <abd.masalkhi@gmail.com>
Fri, 1 May 2026 11:46:49 +0000 (13:46 +0200)
committerYu Kuai <yukuai@fygo.io>
Sun, 31 May 2026 11:09:18 +0000 (19:09 +0800)
commit7b15c24f805339a585cfe7d72f446b7e88b9bcc0
tree9541aba02b518b38724075bb5d1bd884d9043457
parent6b8a26af065ddc93de2aa5c9f0df98dce9723442
md/raid1,raid10: fix deadlock in read error recovery path

raid1d and raid10d may resubmit a split md cloned bio while handling
a read error. In this case, resubmitting the bio can lead to a deadlock
if the array is suspended before md_handle_request() acquires an
active_io reference via percpu_ref_tryget_live().

Since the cloned bio already holds an active_io reference,
trying to acquire another reference via percpu_ref_tryget_live()
can lead to a deadlock while the array is suspended.

Fix this by using percpu_ref_get() for md cloned bios.

Fixes: bb2a9acefaf9 ("md/raid1: switch to use md_account_bio() for io accounting")
Fixes: 820455238366 ("md/raid10: switch to use md_account_bio() for io accounting")
Signed-off-by: Abd-Alrhman Masalkhi <abd.masalkhi@gmail.com>
Reviewed-by: Xiao Ni <xiao@kernel.org>
Reviewed-by: Yu Kuai <yukuai@fygo.io>
Link: https://patch.msgid.link/20260501114652.590037-2-abd.masalkhi@gmail.com
Signed-off-by: Yu Kuai <yukuai@fygo.io>
drivers/md/md.c
drivers/md/md.h