Fix a deadlock in the FreeBSD getpages VOP
commitcd32b4f5b79c97b293f7be3fe9ddfc9024f7d734
authorMark Johnston <markj@freebsd.org>
Tue, 30 Jun 2020 19:54:42 +0000 (30 15:54 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 6 Jul 2020 18:53:57 +0000 (6 11:53 -0700)
tree3b2eb31b6c5b0dc21d3848a194e50fe277d4f493
parent6e0056171234b84450af2afbb6594bd3b09422b5
Fix a deadlock in the FreeBSD getpages VOP

FreeBSD has a per-page "busy" lock which is held when handling a page
fault on a mapped file.  This lock is also acquired when copying data
from the DMU to the page cache in zfs_write().  File range locks are
also acquired in both of these paths, in the opposite order with respect
to the busy lock.

In the getpages VOP, the range lock is only used to determine the extent
of optional read-ahead and read-behind operations.  To resolve the lock
order reversal, modify the getpages VOP to avoid blocking on the range
lock.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@ixsystems.com>
Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Closes #10519
module/os/freebsd/zfs/zfs_vnops.c