mirror_zfs/module/os/linux/zfs
Matthew Ahrens 0fdd6106bb
dmu_objset_from_ds must be called with dp_config_rwlock held
The normal lock order is that the dp_config_rwlock must be held before
the ds_opening_lock.  For example, dmu_objset_hold() does this.
However, dmu_objset_open_impl() is called with the ds_opening_lock held,
and if the dp_config_rwlock is not already held, it will attempt to
acquire it.  This may lead to deadlock, since the lock order is
reversed.

Looking at all the callers of dmu_objset_open_impl() (which is
principally the callers of dmu_objset_from_ds()), almost all callers
already have the dp_config_rwlock.  However, there are a few places in
the send and receive code paths that do not.  For example:
dsl_crypto_populate_key_nvlist, send_cb, dmu_recv_stream,
receive_write_byref, redact_traverse_thread.

This commit resolves the problem by requiring all callers ot
dmu_objset_from_ds() to hold the dp_config_rwlock.  In most cases, the
code has been restructured such that we call dmu_objset_from_ds()
earlier on in the send and receive processes, when we already have the
dp_config_rwlock, and save the objset_t until we need it in the middle
of the send or receive (similar to what we already do with the
dsl_dataset_t).  Thus we do not need to acquire the dp_config_rwlock in
many new places.

I also cleaned up code in dmu_redact_snap() and send_traverse_thread().

Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Paul Zuchowski <pzuchowski@datto.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #9662
Closes #10115
2020-03-12 10:55:02 -07:00
..
abd.c Prepare ks_data before calling kstat_install() 2020-02-04 08:49:12 -08:00
arc_os.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
Makefile.in Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
mmp_os.c Add zfs_file_* interface, remove vnodes 2019-11-21 09:32:57 -08:00
policy.c Add zfs_file_* interface, remove vnodes 2019-11-21 09:32:57 -08: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
spa_stats.c Fix strdup conflict on other platforms 2019-10-10 09:47:06 -07: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.5 compat: blkg_tryget() 2020-02-28 08:58:39 -08:00
vdev_file.c Mark Linux fallocate extensions as specific to Linux 2019-11-30 15:40:22 -08:00
zfs_acl.c Relocate common quota functions to shared code 2019-12-11 12:12:08 -08:00
zfs_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zfs_debug.c Linux 5.6 compat: time_t 2020-02-27 09:31:02 -08:00
zfs_dir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zfs_file_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_ioctl_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_sysfs.c OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
zfs_vfsops.c dmu_objset_from_ds must be called with dp_config_rwlock held 2020-03-12 10:55:02 -07:00
zfs_vnops.c Remove zfs_getattr and convoff dead code 2020-02-24 15:38:22 -08:00
zfs_znode.c Make zfs_replay.c work on FreeBSD 2019-12-13 07:54:10 -08:00
zio_crypt.c Linux 4.14, 4.19, 5.0+ compat: SIMD save/restore 2019-10-24 10:17:33 -07:00
zpl_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_inode.c Linux 5.6 compat: timestamp_truncate() 2020-02-07 11:04:32 -08:00
zpl_super.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_xattr.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zvol_os.c async zvol minor node creation interferes with receive 2020-02-03 09:33:14 -08:00