mirror_zfs/module
Mark Johnston cdf74673bc zfs: Fix a deadlock between page busy and the teardown lock
When rolling back a dataset, ZFS has to purge file data resident in the
system page cache.  To do this, it loops over all vnodes for the
mountpoint and calls vn_pages_remove() to purge pages associated with
the vnode's VM object.  Each page is thus exclusively busied while the
dataset's teardown write lock is held.

When handling a page fault on a mapped ZFS file, FreeBSD's page fault
handler busies newly allocated pages and then uses VOP_GETPAGES to fill
them.  The ZFS getpages VOP acquires the teardown read lock with vnode
pages already busied.  This represents a lock order reversal which can
lead to deadlock.

To break the deadlock, observe that zfs_rezget() need only purge those
pages marked valid, and that pages busied by the page fault handler are,
by definition, invalid.  Furthermore, ZFS pages always transition from
invalid to valid with the teardown lock held, and ZFS never creates
partially valid pages.  Thus, zfs_rezget() can use the new
vn_pages_remove_valid() to skip over pages busied by the fault handler.

PR:		258208
Tested by:	pho
Reviewed by:	avg, sef, kib
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D32931

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Ryan Moeller <freqlabs@FreeBSD.org>
Closes #12828
2021-12-12 11:13:18 -08:00
..
avl Remove avl_size field from struct avl_tree 2021-07-01 09:32:31 -06:00
icp Use fallthrough macro 2021-09-14 10:17:54 -06:00
lua Use fallthrough macro 2021-09-14 10:17:54 -06:00
nvpair Add const to nvlist functions to properly expose their real behavior 2021-12-06 18:19:13 -07:00
os zfs: Fix a deadlock between page busy and the teardown lock 2021-12-12 11:13:18 -08:00
spl Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
unicode Update checkstyle workflow env to ubuntu-20.04 2021-11-02 14:02:57 -06:00
zcommon FreeBSD supports edonr follow up 2021-12-08 17:01:36 -08:00
zfs ZFS send/recv with ashift 9->12 leads to data corruption 2021-12-07 11:27:59 -07:00
zstd Linux 5.16: Resolve ZSTD_isError symbol collision in Linux kernel 2021-12-07 12:28:22 -08:00
.gitignore Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
Kbuild.in Add zstd support to zfs 2020-08-20 10:30:06 -07:00
Makefile.bsd Code cleanups 2021-11-30 10:32:38 -08:00
Makefile.in Update checkstyle workflow env to ubuntu-20.04 2021-11-02 14:02:57 -06:00