HomeFreeBSD

Fix zfs_putpage() lock inversion

Description

Fix zfs_putpage() lock inversion

There exists a lock inversions involving the zfs range lock and the
individual page writeback bits which can result in a deadlock. To
prevent this we must always manipulate the writeback bit while
holding the range lock. The exact deadlock is as follows:

  • Process A ------ ------ Process B ------

zpl_writepages zpl_fallocate
write_cache_pages zpl_fallocate_common
zpl_putpage zfs_space
zfs_putpage (set bit) zfs_freesp
zfs_range_lock (wait on lock) zfs_free_range (take lock)
[has not yet initiated I/O, truncate_inode_pages_range
the bit will not be cleared] wait_on_page_writeback (wait on bit)

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Richard Yao <richard.yao@clusterhq.com>
Issue #2976

Details

Provenance
Brian Behlendorf <behlendorf1@llnl.gov>Authored on Dec 19 2014, 8:57 PM
Parents
rG2d9d57b0fbe1: vdev_id: use mawk-compatible regular expression
Branches
Unknown
Tags
Unknown