]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
file reference counts can get corrupted
authorGeorge Wilson <george.wilson@delphix.com>
Sun, 11 Jul 2021 01:00:37 +0000 (20:00 -0500)
committerTony Hutter <hutter2@llnl.gov>
Tue, 14 Sep 2021 19:37:38 +0000 (12:37 -0700)
commit8415c3c1705ec64ea34a2e90d6810e6fe5232cce
treeff2cd96eb21a4c13a4d95e5987a615beee255aae
parent04ebe29188032c9d2b0fd80b2571a82aa3013134
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
include/sys/fm/util.h
include/sys/zfs_file.h
include/sys/zfs_ioctl.h
include/sys/zfs_onexit.h
lib/libzpool/kernel.c
module/os/freebsd/zfs/zfs_file_os.c
module/os/linux/zfs/zfs_file_os.c
module/zfs/fm.c
module/zfs/zfs_ioctl.c
module/zfs/zfs_onexit.c