HomeFreeBSD

Fix zrele race in zrele_async that can cause hang

Description

Fix zrele race in zrele_async that can cause hang

There is a race condition in zfs_zrele_async when we are checking if
we would be the one to evict an inode. This can lead to a txg sync
deadlock.

Instead of calling into iput directly, we attempt to perform the atomic
decrement ourselves, unless that would set the i_count value to zero.
In that case, we dispatch a call to iput to run later, to prevent a
deadlock from occurring.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Paul Dagnelie <pcd@delphix.com>
Closes #11527
Closes #11530

Details

Provenance
pcd_delphix.comAuthored on Jan 28 2021, 5:29 AM
GitHub <noreply@github.com>Committed on Jan 28 2021, 5:29 AM
Parents
rGb8e6401b794b: ZTS: pool_state test check for pool existence in cleanup
Branches
Unknown
Tags
Unknown