mirror_zfs/module/os/linux/zfs
Ameer Hamza 0bcbee6040 Fix snapshot automount race causing duplicate mounts and AVL tree panic
Multiple threads racing to automount the same snapshot can both spawn
mount helper processes that successfully complete, causing both parent
threads to attempt AVL tree registration and triggering a VERIFY()
panic in avl_add(). This occurs because the fsconfig/fsmount API lacks
the serialization provided by traditional mount() via lock_mount().

The fix adds a per-entry mutex (se_mtx) to zfs_snapentry_t that
serializes mount and unmount operations on the same snapshot. The first
mount thread creates a pending entry with se_spa=NULL and holds se_mtx
during the helper execution. Concurrent mounts find the pending entry
and return success without spawning duplicate helpers. Unmount waits on
se_mtx if a mount is pending, ensuring proper serialization. This allows
different snapshots to mount in parallel while preventing the AVL panic.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com>
Signed-off-by: Ameer Hamza <ahamza@ixsystems.com>
Closes #17943
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 race causing duplicate mounts and AVL tree panic 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