mirror_zfs/module/os/linux/zfs
Ameer Hamza 4ce030e025
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-08 13:49:11 -08:00
..
abd_os.c Linux 6.18: replace nth_page() 2025-10-20 16:01:04 -07:00
arc_os.c SPDX: license tags: CDDL-1.0 2025-03-13 17:56:27 -07: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 09:12:24 -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-10-29 11:17:51 -07:00
zfs_ctldir.c Fix snapshot automount race causing duplicate mounts and AVL tree panic 2025-12-08 13:49:11 -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-01 14:43:42 -08:00
zfs_file_os.c Enable zhack to work properly with 4k sector size disks 2025-09-10 11:13:55 -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 linux/uio: remove "skip" offset for UIO_ITER 2025-05-11 12:46:40 -04:00
zfs_vfsops.c linux/super: add tunable to request immediate reclaim of unused dentries 2025-09-17 08:16:32 -07:00
zfs_vnops_os.c Pass flags to more DMU write/hold functions 2025-10-29 11:17:51 -07: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 13:44:43 -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-05 16:22:03 -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-20 16:01:04 -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-10 14:23:39 -08:00