mirror_zfs/module/os/linux/zfs
Ameer Hamza 74bbdda1ef Fix snapshot automount expiry cancellation deadlock
A deadlock occurs when snapshot expiry tasks are cancelled while holding
locks. The snapshot expiry task (snapentry_expire) spawns an umount
process and waits for it to complete. Concurrently, ARC memory pressure
triggers arc_prune which calls zfs_exit_fs(), attempting to cancel the
expiry task while holding locks. The umount process spawned by the
expiry task blocks trying to acquire locks held by arc_prune, which is
blocked waiting for the expiry task to complete. This creates a circular
dependency: expiry task waits for umount, umount waits for arc_prune,
arc_prune waits for expiry task.

Fix by adding non-blocking cancellation support to taskq_cancel_id().
The zfs_exit_fs() path calls zfsctl_snapshot_unmount_delay() to
reschedule the unmount, which needs to cancel any existing expiry task.
It now uses non-blocking cancellation to avoid waiting while holding
locks, breaking the deadlock by returning immediately when the task is
already running.

The per-entry se_taskqid_lock has been removed, with all taskqid
operations now protected by the global zfs_snapshot_lock held as
WRITER. Additionally, an se_in_umount flag prevents recursive waits when
zfsctl_destroy() is called during unmount. The taskqid is now only
cleared by the caller on successful cancellation; running tasks clear
their own taskqid upon completion.

Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ameer Hamza <ahamza@ixsystems.com>
Closes #17941
2025-12-10 10:21:29 -08:00
..
abd_os.c Fix a declaration position of the nth_page. 2025-12-10 10:21:29 -08:00
arc_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
kasan_compat.c Linux: work around use of GPL-only symbol kasan_flag_enabled 2025-12-10 10:21:29 -08:00
mmp_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
policy.c cred: properly pass and test creds on other threads (#17273) 2025-04-29 16:27:48 -07:00
qat_compress.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
qat_crypt.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
qat.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
spa_misc_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
trace.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
vdev_disk.c vdev_disk_close: take disk write lock before destroying it 2025-09-15 12:43:44 -07:00
vdev_label_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
vdev_raidz.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
zfs_acl.c Pass flags to more DMU write/hold functions 2025-11-12 13:04:58 -08:00
zfs_ctldir.c Fix snapshot automount expiry cancellation deadlock 2025-12-10 10:21:29 -08:00
zfs_debug.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
zfs_dir.c Fix snapshot automount expiry cancellation deadlock 2025-12-10 10:21:29 -08:00
zfs_file_os.c Enable zhack to work properly with 4k sector size disks 2025-09-10 15:01:32 -07:00
zfs_ioctl_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
zfs_racct.c Wire O_DIRECT also to Uncached I/O (#17218) 2025-05-13 14:26:55 -07:00
zfs_sysfs.c Prefer VERIFY0P(n) over VERIFY(n == NULL) 2025-08-07 11:41:37 -07:00
zfs_uio.c Fix HIGHMEM/kmap API violation in zfs_uiomove_bvec_impl() 2025-12-10 10:21:29 -08:00
zfs_vfsops.c linux/super: add tunable to request immediate reclaim of unused dentries 2025-09-17 16:34:14 -07:00
zfs_vnops_os.c Linux: work around use of GPL-only symbol kasan_flag_enabled 2025-12-10 10:21:29 -08:00
zfs_znode_os.c Prefer VERIFY0P(n) over VERIFY3P(n, ==, NULL) 2025-08-07 11:41:42 -07:00
zio_crypt.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
zpl_ctldir.c Linux 6.17: d_set_d_op() is no longer available 2025-09-09 17:06:55 -07:00
zpl_export.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07:00
zpl_file_range.c ioctl: remove FICLONE/FICLONERANGE/FIDEDUPERANGE compat 2025-05-08 10:32:52 -04:00
zpl_file.c Linux 6.17 compat: Fix broken projectquota on 6.17 2025-11-12 13:06:01 -08:00
zpl_inode.c Prefer VERIFY0(n) over VERIFY(n == 0) 2025-08-07 11:40:59 -07:00
zpl_super.c Linux 6.18: generic_drop_inode() and generic_delete_inode() renamed 2025-10-21 09:50:43 -07:00
zpl_xattr.c Prefer VERIFY0P(n) over VERIFY3P(n, ==, NULL) 2025-08-07 11:41:42 -07:00
zvol_os.c spa_misc: add an API for spa_namespace_lock 2025-11-12 13:06:54 -08:00