md/raid5: Ensure batch_last is released before sleeping for quiesce
authorLogan Gunthorpe <logang@deltatee.com>
Wed, 27 Jul 2022 21:06:00 +0000 (15:06 -0600)
committerSong Liu <song@kernel.org>
Thu, 28 Jul 2022 05:50:47 +0000 (22:50 -0700)
commit99f5e740d961433dd7c59c65850151afc10694ad
treeb307506bdcc8f1daca8de719b13a2d570214e164
parentaf98ca0348d44df3f6c4b77fea0bbf3e2dac171b
md/raid5: Ensure batch_last is released before sleeping for quiesce

A race condition exists where if raid5_quiesce() is called in the
middle of a request that has set batch_last, it will deadlock.

batch_last will hold a reference to a stripe when raid5_quiesce() is
called. This will cause the next raid5_get_active_stripe() call to
sleep waiting for the quiesce to finish, but the raid5_quiesce() thread
will wait for active_stripes to go to zero which will never happen
because request thread is waiting for the quiesce to stop.

Fix this by creating a special __raid5_get_active_stripe() function
which takes the request context and clears the last_batch before
sleeping.

While we're at it, change the arguments of raid5_get_active_stripe()
to bools.

Fixes: 4fcbd9abb6f2 ("md/raid5: Keep a reference to last stripe_head for batch")
Reported-by: David Sloan <David.Sloan@eideticom.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/raid5.c
drivers/md/raid5.h