HomeFreeBSD

Fix deadlock in 'zfs rollback'

Description

Fix deadlock in 'zfs rollback'

Currently, the 'zfs rollback' code can end up deadlocked due to
the way the kernel handles unreferenced inodes on a suspended fs.
Essentially, the zfs_resume_fs() code path may cause zfs to spawn
new threads as it reinstantiates the suspended fs's zil. When a
new thread is spawned, the kernel may attempt to free memory for
that thread by freeing some unreferenced inodes. If it happens to
select inodes that are a a part of the suspended fs a deadlock
will occur because freeing inodes requires holding the fs's
z_teardown_inactive_lock which is still held from the suspend.

This patch corrects this issue by adding an additional reference
to all inodes that are still present when a suspend is initiated.
This prevents them from being freed by the kernel for any reason.

Reviewed-by: Alek Pinchuk <apinchuk@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #9203

Details

Provenance
Tom Caputi <tcaputi@datto.com>Authored on Aug 27 2019, 4:55 PM
Brian Behlendorf <behlendorf1@llnl.gov>Committed on Aug 27 2019, 4:55 PM
Parents
rG142f84dd19f2: Restore :: in Makefile.am
Branches
Unknown
Tags
Unknown

Event Timeline

Brian Behlendorf <behlendorf1@llnl.gov> committed rGe7a2fa70c3b0: Fix deadlock in 'zfs rollback' (authored by Tom Caputi <tcaputi@datto.com>).Aug 27 2019, 4:55 PM