a stop gap fix for a race between dnode_hold and dnode_sync_free
The race was introduced in r337669, the large dnode feature import from
ZoL. The problem was debugged by ZoL developers and then,
independently, on FreeBSD.
The fix is an early proposal by Brian Behlendorf:
50f32ed74e
This fix never went into ZoL. A larger change that was committed later
included a different solution because of the re-worked code.
Ideally, we want to revert this fix and re-synchronize FreeBSD large
dnode code with that in illumos (or newer ZoL). illumos has a later
import of the feature from ZoL that does not have the bug.
PR: 236480
Obtained from: Brian Behlendorf <behlendorf1@llnl.gov>
Submitted by: ncrogers@gmail.com (patch adaptation)
Reported by: ncrogers@gmail.com
Tested by: ncrogers@gmail.com,
Dennis Noordsij <dennis.noordsij@alumni.helsinki.fi>,
Julien Cigar <julien@perdition.city>
MFC after: 10 days
This commit is contained in:
parent
f62615062e
commit
cfe94339f2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=350894
@ -1324,7 +1324,9 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag, int slots,
|
||||
mutex_enter(&dn->dn_mtx);
|
||||
type = dn->dn_type;
|
||||
if (dn->dn_free_txg ||
|
||||
((flag & DNODE_MUST_BE_FREE) && !refcount_is_zero(&dn->dn_holds))) {
|
||||
((flag & DNODE_MUST_BE_ALLOCATED) && type == DMU_OT_NONE) ||
|
||||
((flag & DNODE_MUST_BE_FREE) &&
|
||||
(type != DMU_OT_NONE || !refcount_is_zero(&dn->dn_holds)))) {
|
||||
mutex_exit(&dn->dn_mtx);
|
||||
zrl_remove(&dnh->dnh_zrlock);
|
||||
dbuf_rele(db, FTAG);
|
||||
|
Loading…
Reference in New Issue
Block a user