| 105 | } |
| 106 | |
| 107 | static int |
| 108 | ddt_object_load(ddt_t *ddt, enum ddt_type type, enum ddt_class class) |
| 109 | { |
| 110 | ddt_object_t *ddo = &ddt->ddt_object_stats[type][class]; |
| 111 | dmu_object_info_t doi; |
| 112 | uint64_t count; |
| 113 | char name[DDT_NAMELEN]; |
| 114 | int error; |
| 115 | |
| 116 | ddt_object_name(ddt, type, class, name); |
| 117 | |
| 118 | error = zap_lookup(ddt->ddt_os, DMU_POOL_DIRECTORY_OBJECT, name, |
| 119 | sizeof (uint64_t), 1, &ddt->ddt_object[type][class]); |
| 120 | if (error != 0) |
| 121 | return (error); |
| 122 | |
| 123 | error = zap_lookup(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name, |
| 124 | sizeof (uint64_t), sizeof (ddt_histogram_t) / sizeof (uint64_t), |
| 125 | &ddt->ddt_histogram[type][class]); |
| 126 | if (error != 0) |
| 127 | return (error); |
| 128 | |
| 129 | /* |
| 130 | * Seed the cached statistics. |
| 131 | */ |
| 132 | error = ddt_object_info(ddt, type, class, &doi); |
| 133 | if (error) |
| 134 | return (error); |
| 135 | |
| 136 | error = ddt_object_count(ddt, type, class, &count); |
| 137 | if (error) |
| 138 | return (error); |
| 139 | |
| 140 | ddo->ddo_count = count; |
| 141 | ddo->ddo_dspace = doi.doi_physical_blocks_512 << 9; |
| 142 | ddo->ddo_mspace = doi.doi_fill_count * doi.doi_data_block_size; |
| 143 | |
| 144 | return (0); |
| 145 | } |
| 146 | |
| 147 | static void |
| 148 | ddt_object_sync(ddt_t *ddt, enum ddt_type type, enum ddt_class class, |
no test coverage detected