MFV r353551: 10452 ZoL: merge in large dnode feature fixes
illumos/illumos-gate@946342a260
946342a260
https://www.illumos.org/issues/10452
illumos is missing a few small follow up ZoL bug fixes for the large dnode
feature. We should pull those in.
Those commits are in the ZoL tree as (newest to oldest):
PR 8435 - 75d6b7ddca269542279975f716a343bb40a79baf - Add missing copyright
notice to large_dnode tests
PR 7433 - e14a32b1c844d924b9f093375c0badcf10f61741 - Fix object reclaim when
using large dnodes
PR 6616 - 48fbb9ddbf2281911560dfbc2821aa8b74127315 - Free objects when
receiving full stream as clone
PR 6695 - 39f56627ae988d09b4e3803c01c22b2026b2310e - receive_freeobjects()
skips freeing some object
Portions contributed by: Ned Bass <bass6@llnl.gov>
Portions contributed by: Tom Caputi <tcaputi@datto.com>
Author: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Obtained from: illumos, ZoL
MFC after: 2 weeks
X-MFC with: r353176
This commit is contained in:
commit
4368589338
@ -267,7 +267,7 @@ dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot,
|
|||||||
int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
|
int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
return (dmu_object_reclaim_dnsize(os, object, ot, blocksize, bonustype,
|
return (dmu_object_reclaim_dnsize(os, object, ot, blocksize, bonustype,
|
||||||
bonuslen, 0, tx));
|
bonuslen, DNODE_MIN_SIZE, tx));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -2268,11 +2268,13 @@ receive_object(struct receive_writer_arg *rwa, struct drr_object *drro,
|
|||||||
} else if (drro->drr_type != doi.doi_type ||
|
} else if (drro->drr_type != doi.doi_type ||
|
||||||
drro->drr_blksz != doi.doi_data_block_size ||
|
drro->drr_blksz != doi.doi_data_block_size ||
|
||||||
drro->drr_bonustype != doi.doi_bonus_type ||
|
drro->drr_bonustype != doi.doi_bonus_type ||
|
||||||
drro->drr_bonuslen != doi.doi_bonus_size) {
|
drro->drr_bonuslen != doi.doi_bonus_size ||
|
||||||
|
drro->drr_dn_slots != (doi.doi_dnodesize >> DNODE_SHIFT)) {
|
||||||
/* currently allocated, but with different properties */
|
/* currently allocated, but with different properties */
|
||||||
err = dmu_object_reclaim(rwa->os, drro->drr_object,
|
err = dmu_object_reclaim_dnsize(rwa->os, drro->drr_object,
|
||||||
drro->drr_type, drro->drr_blksz,
|
drro->drr_type, drro->drr_blksz,
|
||||||
drro->drr_bonustype, drro->drr_bonuslen, tx);
|
drro->drr_bonustype, drro->drr_bonuslen,
|
||||||
|
drro->drr_dn_slots << DNODE_SHIFT, tx);
|
||||||
}
|
}
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
@ -2323,12 +2325,10 @@ receive_freeobjects(struct receive_writer_arg *rwa,
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = dmu_object_info(rwa->os, obj, NULL);
|
err = dmu_object_info(rwa->os, obj, NULL);
|
||||||
if (err == ENOENT) {
|
if (err == ENOENT)
|
||||||
obj++;
|
|
||||||
continue;
|
continue;
|
||||||
} else if (err != 0) {
|
else if (err != 0)
|
||||||
return (err);
|
return (err);
|
||||||
}
|
|
||||||
|
|
||||||
err = dmu_free_long_object(rwa->os, obj);
|
err = dmu_free_long_object(rwa->os, obj);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
|
@ -680,8 +680,7 @@ dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
|
|||||||
ASSERT(DMU_OT_IS_VALID(bonustype));
|
ASSERT(DMU_OT_IS_VALID(bonustype));
|
||||||
ASSERT3U(bonuslen, <=,
|
ASSERT3U(bonuslen, <=,
|
||||||
DN_BONUS_SIZE(spa_maxdnodesize(dmu_objset_spa(dn->dn_objset))));
|
DN_BONUS_SIZE(spa_maxdnodesize(dmu_objset_spa(dn->dn_objset))));
|
||||||
|
ASSERT3U(bonuslen, <=, DN_BONUS_SIZE(dn_slots << DNODE_SHIFT));
|
||||||
dn_slots = dn_slots > 0 ? dn_slots : DNODE_MIN_SLOTS;
|
|
||||||
|
|
||||||
dnode_free_interior_slots(dn);
|
dnode_free_interior_slots(dn);
|
||||||
DNODE_STAT_BUMP(dnode_reallocate);
|
DNODE_STAT_BUMP(dnode_reallocate);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user