summaryrefslogtreecommitdiffstats
path: root/module/zfs/dsl_pool.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2014-12-19 12:57:54 -0800
committerBrian Behlendorf <[email protected]>2014-12-22 09:31:56 -0800
commit74328ee18f94d27f9c802d29fdd311018dab2adf (patch)
treee1c45efc24bf65c579832175d193d5c4c18df2d8 /module/zfs/dsl_pool.c
parent2d9d57b0fbe17b56a1bdd09505400144778cb189 (diff)
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 <[email protected]> Signed-off-by: Tim Chase <[email protected]> Signed-off-by: Richard Yao <[email protected]> Issue #2976
Diffstat (limited to 'module/zfs/dsl_pool.c')
0 files changed, 0 insertions, 0 deletions