mirror_zfs/module/os/linux/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 Linux 5.9 compat: NR_SLAB_RECLAIMABLE 2020-08-30 14:18:50 -07:00
Makefile.in Restore FreeBSD resource usage accounting 2021-03-05 12:50:32 -08:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Linux 5.12 compat: idmapped mounts 2021-06-23 13:22:15 -07:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c Linux 5.12 update: bio_max_segs() replaces BIO_MAX_PAGES 2021-06-23 13:22:15 -07:00
vdev_file.c vdev_ashift should only be set once 2020-09-18 12:40:20 -07:00
zfs_acl.c Intentionally allow ZFS_READONLY in zfs_write 2021-03-08 09:07:29 -08:00
zfs_ctldir.c Linux: always check or verify return of igrab() 2021-06-23 13:22:15 -07:00
zfs_debug.c FreeBSD: Add support for procfs_list 2020-10-01 12:18:56 -07:00
zfs_dir.c Throw const on some strings 2020-10-16 12:55:56 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-09-22 15:19:08 -07:00
zfs_ioctl_os.c Simple change to fix building in recent environments 2021-06-23 13:22:15 -07:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-03-05 12:50:32 -08:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_uio.c Linux 5.10 compat: restore custom uio_prefaultpages() 2021-01-22 09:58:49 -08:00
zfs_vfsops.c Linux: always check or verify return of igrab() 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 Do not hash unlinked inodes 2021-06-23 13:22:15 -07:00
zio_crypt.c Initialize ZIL buffers 2021-03-08 09:07:21 -08:00
zpl_ctldir.c Linux 5.12 compat: idmapped mounts 2021-06-23 13:22:15 -07:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Consolidate zfs_holey and zfs_access 2021-06-23 13:22:15 -07:00
zpl_inode.c Linux: always check or verify return of igrab() 2021-06-23 13:22:15 -07:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:51:27 -08:00
zpl_xattr.c Bend zpl_set_acl to permit the new userns* parameter 2021-06-23 13:22:15 -07:00
zvol_os.c linux 5.13 compat: bdevops->revalidate_disk() removed (#12122) 2021-06-23 13:22:15 -07:00