NFSv4/pNFS: Fix a race to wake on NFS_LAYOUT_DRAIN
[ Upstream commit c01776287414ca43412d1319d2877cbad65444ac ]
We found a few different systems hung up in writeback waiting on the same
page lock, and one task waiting on the NFS_LAYOUT_DRAIN bit in
pnfs_update_layout(), however the pnfs_layout_hdr's plh_outstanding count
was zero.
It seems most likely that this is another race between the waiter and waker
similar to commit ed0172af5d6f ("SUNRPC: Fix a race to wake a sync task").
Fix it up by applying the advised barrier.
Fixes: 880265c77a
("pNFS: Avoid a live lock condition in pnfs_update_layout()")
Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d0877c479f
commit
8ca65fa710
@@ -1930,8 +1930,10 @@ static void nfs_layoutget_begin(struct pnfs_layout_hdr *lo)
|
|||||||
static void nfs_layoutget_end(struct pnfs_layout_hdr *lo)
|
static void nfs_layoutget_end(struct pnfs_layout_hdr *lo)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&lo->plh_outstanding) &&
|
if (atomic_dec_and_test(&lo->plh_outstanding) &&
|
||||||
test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags))
|
test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags)) {
|
||||||
|
smp_mb__after_atomic();
|
||||||
wake_up_bit(&lo->plh_flags, NFS_LAYOUT_DRAIN);
|
wake_up_bit(&lo->plh_flags, NFS_LAYOUT_DRAIN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pnfs_is_first_layoutget(struct pnfs_layout_hdr *lo)
|
static bool pnfs_is_first_layoutget(struct pnfs_layout_hdr *lo)
|
||||||
|
Reference in New Issue
Block a user