Skip to content

Commit

Permalink
Revert "dmu_objset_userquota_get_ids uses dn_bonus unsafely"
Browse files Browse the repository at this point in the history
This reverts commit 5f8e1e8.  It
was determined that this patch introduced the quota regression
described in #3789.

Signed-off-by: Tim Chase <[email protected]>
Signed-off-by: Ned Bass <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #3443
Issue #3789
  • Loading branch information
behlendorf committed Sep 25, 2015
1 parent 5592404 commit a3000f9
Showing 1 changed file with 3 additions and 17 deletions.
20 changes: 3 additions & 17 deletions module/zfs/dmu_objset.c
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,6 @@ dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx)
int flags = dn->dn_id_flags;
int error;
boolean_t have_spill = B_FALSE;
boolean_t have_bonus = B_FALSE;

if (!dmu_objset_userused_enabled(dn->dn_objset))
return;
Expand All @@ -1354,21 +1353,8 @@ dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx)
if (before && dn->dn_bonuslen != 0)
data = DN_BONUS(dn->dn_phys);
else if (!before && dn->dn_bonuslen != 0) {
db = dn->dn_bonus;
if (db != NULL) {
if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
have_bonus = dbuf_try_add_ref((dmu_buf_t *)db,
dn->dn_objset, dn->dn_object,
DMU_BONUS_BLKID, FTAG);

/*
* The hold will fail if the buffer is
* being evicted due to unlink, in which
* case nothing needs to be done.
*/
if (!have_bonus)
return;
}
if (dn->dn_bonus) {
db = dn->dn_bonus;
mutex_enter(&db->db_mtx);
data = dmu_objset_userquota_find_data(db, tx);
} else {
Expand Down Expand Up @@ -1443,7 +1429,7 @@ dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx)
dn->dn_id_flags |= DN_ID_CHKED_BONUS;
}
mutex_exit(&dn->dn_mtx);
if (have_spill || have_bonus)
if (have_spill)
dmu_buf_rele((dmu_buf_t *)db, FTAG);
}

Expand Down

0 comments on commit a3000f9

Please sign in to comment.