Files
mirror_zfs/module/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
..
2019-07-26 10:54:14 -07:00
2019-06-19 09:48:12 -07:00
2019-06-19 09:48:12 -07:00
2020-02-27 17:12:44 -08:00
2019-10-09 10:36:03 -07:00
2019-12-03 09:51:44 -08:00
2020-02-24 15:38:22 -08:00
2019-09-02 17:56:41 -07:00
2017-10-11 16:54:48 -04:00
2019-10-01 13:17:32 -07:00
2015-01-16 14:41:26 -08:00
2019-06-19 09:48:12 -07:00
2019-10-11 10:13:21 -07:00
2010-08-31 13:41:58 -07:00
2019-09-02 17:56:41 -07:00
2020-03-04 15:07:11 -08:00
2019-10-09 10:36:03 -07:00
2020-02-27 09:31:02 -08:00
2019-06-20 18:29:02 -07:00
2020-01-23 11:01:24 -08:00
2019-06-20 18:29:02 -07:00
2020-03-04 15:07:11 -08:00
2019-09-05 14:49:49 -07:00
2019-09-02 17:56:41 -07:00
2019-09-02 17:56:41 -07:00
2019-10-02 09:15:12 -07:00
2019-11-11 09:27:59 -08:00
2019-12-05 13:10:29 -08:00
2018-02-09 10:08:05 -08:00
2019-07-26 10:54:14 -07:00