Files
mirror_zfs/include/sys
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
..
2020-03-04 15:07:11 -08:00
2019-08-30 09:53:15 -07:00
2019-03-29 09:13:20 -07:00
2019-10-09 10:36:03 -07:00
2019-10-09 10:36:03 -07:00
2019-07-26 10:54:14 -07:00
2019-07-26 10:54:14 -07:00
2019-06-19 09:48:12 -07:00
2019-10-11 10:13:21 -07:00
2020-02-05 11:08:44 -08:00
2019-06-19 14:54:02 -07:00
2019-07-26 10:54:14 -07:00
2019-06-19 09:48:12 -07:00
2020-01-10 10:16:58 -08:00
2019-06-19 09:48:12 -07:00
2019-07-25 11:57:58 -07:00
2020-02-24 15:38:22 -08:00
2020-02-11 13:19:17 -08:00
2019-06-19 09:48:12 -07:00
2019-06-24 16:44:01 -07:00
2019-07-26 10:54:14 -07:00
2019-07-26 10:54:14 -07:00
2013-11-04 11:17:48 -08:00
2019-08-30 09:53:15 -07:00
2017-12-07 10:28:50 -08:00
2017-10-11 16:54:48 -04:00
2019-11-01 10:41:03 -07:00
2018-05-29 16:00:33 -07:00
2018-10-03 15:30:55 -07:00
2019-06-19 09:48:12 -07:00
2019-09-12 13:33:44 -07:00
2019-10-31 10:38:03 -07:00
2019-09-27 10:46:28 -07:00
2019-08-30 09:53:15 -07:00
2019-07-16 10:11:49 -07:00
2019-07-16 10:11:49 -07:00
2019-08-30 09:53:15 -07:00
2017-07-13 13:54:00 -04:00
2013-11-04 10:55:25 -08:00
2020-02-27 09:31:02 -08:00
2019-03-29 09:13:20 -07:00
2020-01-23 11:01:24 -08:00
2019-03-29 09:13:20 -07:00
2019-11-27 10:15:01 -08:00
2019-06-12 13:13:09 -07:00
2018-02-08 15:28:18 -08:00
2018-02-08 15:28:18 -08:00
2019-10-25 13:38:37 -07:00
2018-05-29 16:00:33 -07:00
2019-11-01 10:37:33 -07:00
2018-02-13 14:54:54 -08:00
2018-09-06 21:44:52 -07:00
2019-06-10 11:48:42 -07:00
2019-11-21 09:32:57 -08:00
2017-03-29 12:24:51 -07:00
2019-08-30 09:53:15 -07:00
2019-03-29 09:13:20 -07:00
2020-02-10 14:00:05 -08:00
2019-07-26 10:54:14 -07:00
2019-11-01 10:37:33 -07:00