mirror_zfs/module/os/freebsd/zfs
George Wilson 958826be7a
file reference counts can get corrupted
Callers of zfs_file_get and zfs_file_put can corrupt the reference
counts for the file structure resulting in a panic or a soft lockup.
When zfs send/recv runs, it will add a reference count to the
open file, and begin to send or recv the stream. If the file descriptor
is closed, then when dmu_recv_stream() or dmu_send() return we will
call zfs_file_put to remove the reference we placed on the file
structure. Unfortunately, because zfs_file_put() uses the file
descriptor to lookup the file structure, it may end up finding that
the file descriptor table no longer contains the file struct, thus
leaking the file structure. Or it might end up finding a file
descriptor for a different file and blindly updating its reference
counts. Other failure modes probably exists.

This change reworks the zfs_file_[get|put] interface to not rely
on the file descriptor but instead pass the zfs_file_t pointer around.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Co-authored-by: Allan Jude <allan@klarasystems.com>
Signed-off-by: George Wilson <gwilson@delphix.com>
External-issue: DLPX-76119
Closes #12299
2021-07-10 19:00:37 -06:00
..
abd_os.c FreeBSD: Hardcode abd_chunk_size to PAGE_SIZE 2021-07-06 17:39:23 -07:00
arc_os.c FreeBSD: avoid memory allocation in arc_prune_async 2021-05-25 19:38:34 -06:00
crypto_os.c FreeBSD: Retry OCF ENOMEM errors. 2021-05-24 14:42:45 -06:00
dmu_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
hkdf.c Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
kmod_core.c Move zfsdev_state_{init,destroy} to common code 2021-04-08 21:17:43 -07:00
spa_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
sysctl_os.c Reference_tracking_enable should be a module param 2021-03-16 14:56:17 -07:00
vdev_file.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
vdev_geom.c FreeBSD: Use unmapped I/O for scattered/gang ABD buffers 2021-07-07 16:39:00 -07:00
vdev_label_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
zfs_acl.c FreeBSD: Remove !FreeBSD ifdef'd code 2021-05-07 15:13:44 -07:00
zfs_ctldir.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
zfs_debug.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zfs_dir.c Clean up use of zfs_log_create in zfs_dir 2021-05-07 15:13:10 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-07-10 19:00:37 -06:00
zfs_ioctl_compat.c FreeBSD: Fix legacy compat for platform IOCs 2020-09-30 13:25:50 -07:00
zfs_ioctl_os.c libzfs: On FreeBSD, use MNT_NOWAIT with getfsstat 2021-06-08 07:36:43 -06:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
zfs_vfsops.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zfs_vnops_os.c FreeBSD: Implement xattr=sa 2021-05-13 15:14:12 -07:00
zfs_znode.c FreeBSD: Implement xattr=sa 2021-05-13 15:14:12 -07:00
zio_crypt.c Revert "Fix raw sends on encrypted datasets when copying back snapshots" 2021-05-13 10:00:17 -07:00
zvol_os.c FreeBSD: Update dataset_kstats for zvols in dev mode 2021-05-26 12:14:26 -06:00