mirror_zfs/module/os/freebsd/zfs
George Wilson 1885e5ebab 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-09-22 15:19:08 -07:00
..
abd_os.c Include scatter_chunk_waste in arc_size 2020-08-17 20:04:04 -07:00
arc_os.c FreeBSD: use vnlru_free_vfsops if available 2021-06-23 13:22:15 -07:00
crypto_os.c FreeBSD: disable the use of hardware crypto offload drivers for now 2021-03-05 12:49:41 -08:00
dmu_os.c Fix assert in FreeBSD-specific dmu_read_pages 2021-03-05 12:58:08 -08:00
hkdf.c Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
kmod_core.c Avoid taking global lock to destroy zfsdev state 2021-06-23 13:22:14 -07:00
spa_os.c FreeBSD: Add option to rewind checkpoint while importing root pool 2020-08-19 17:19:42 -07:00
sysctl_os.c Share zfs_fsync, zfs_read, zfs_write, et al between Linux and FreeBSD 2020-12-23 14:34:59 -08:00
vdev_file.c vdev_ashift should only be set once 2020-09-18 12:40:20 -07:00
vdev_geom.c FreeBSD: Remove BIO_ORDERED flag from BIO_FLUSH 2020-10-30 16:04:32 -07:00
vdev_label_os.c Add support for boot environment data to be stored in the label 2020-05-07 09:36:33 -07:00
zfs_acl.c FreeBSD: make seqc asserts conditional on replay 2021-06-23 13:22:14 -07:00
zfs_ctldir.c FreeBSD: add missing fplookup_vexec handler to special vop vectors 2020-10-16 13:05:43 -07:00
zfs_debug.c Convert Linux-isms to FreeBSD-isms in platform zfs_debug.c 2020-07-31 21:25:35 -07:00
zfs_dir.c FreeBSD: rework asserts in zfs_dd_lookup 2021-06-23 13:22:14 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-09-22 15:19:08 -07:00
zfs_ioctl_compat.c FreeBSD: Fix legacy compat for platform IOCs 2020-10-01 12:23:00 -07:00
zfs_ioctl_os.c Make zc_nvlist_src_size limit tunable 2020-08-18 09:33:55 -07:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-03-05 12:50:32 -08:00
zfs_vfsops.c FreeBSD: incorporate changes to the VFS_QUOTACTL(9) KPI 2021-06-23 13:22:15 -07:00
zfs_vnops_os.c zfs_vnops: make zfs_get_data OS-independent 2021-06-23 13:22:15 -07:00
zfs_znode.c FreeBSD: Initialize/destroy zp->z_lock 2021-06-23 13:22:15 -07:00
zio_crypt.c FreeBSD: Code cleanup in zio_crypt 2020-10-01 12:20:39 -07:00
zvol_os.c zvol: call zil_replaying() during replay 2021-06-23 13:22:14 -07:00