* Return an empty bpobj, preferably the empty dummy one (dp_empty_bpobj). */
| 35 | * Return an empty bpobj, preferably the empty dummy one (dp_empty_bpobj). |
| 36 | */ |
| 37 | uint64_t |
| 38 | bpobj_alloc_empty(objset_t *os, int blocksize, dmu_tx_t *tx) |
| 39 | { |
| 40 | spa_t *spa = dmu_objset_spa(os); |
| 41 | dsl_pool_t *dp = dmu_objset_pool(os); |
| 42 | |
| 43 | if (spa_feature_is_enabled(spa, SPA_FEATURE_EMPTY_BPOBJ)) { |
| 44 | if (!spa_feature_is_active(spa, SPA_FEATURE_EMPTY_BPOBJ)) { |
| 45 | ASSERT0(dp->dp_empty_bpobj); |
| 46 | dp->dp_empty_bpobj = |
| 47 | bpobj_alloc(os, SPA_OLD_MAXBLOCKSIZE, tx); |
| 48 | VERIFY(zap_add(os, |
| 49 | DMU_POOL_DIRECTORY_OBJECT, |
| 50 | DMU_POOL_EMPTY_BPOBJ, sizeof (uint64_t), 1, |
| 51 | &dp->dp_empty_bpobj, tx) == 0); |
| 52 | } |
| 53 | spa_feature_incr(spa, SPA_FEATURE_EMPTY_BPOBJ, tx); |
| 54 | ASSERT(dp->dp_empty_bpobj != 0); |
| 55 | return (dp->dp_empty_bpobj); |
| 56 | } else { |
| 57 | return (bpobj_alloc(os, blocksize, tx)); |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | void |
| 62 | bpobj_decr_empty(objset_t *os, dmu_tx_t *tx) |
no test coverage detected