| 3257 | } |
| 3258 | |
| 3259 | int |
| 3260 | vdev_load(vdev_t *vd) |
| 3261 | { |
| 3262 | int error = 0; |
| 3263 | |
| 3264 | /* |
| 3265 | * Recursively load all children. |
| 3266 | */ |
| 3267 | for (int c = 0; c < vd->vdev_children; c++) { |
| 3268 | error = vdev_load(vd->vdev_child[c]); |
| 3269 | if (error != 0) { |
| 3270 | return (error); |
| 3271 | } |
| 3272 | } |
| 3273 | |
| 3274 | vdev_set_deflate_ratio(vd); |
| 3275 | |
| 3276 | /* |
| 3277 | * On spa_load path, grab the allocation bias from our zap |
| 3278 | */ |
| 3279 | if (vd == vd->vdev_top && vd->vdev_top_zap != 0) { |
| 3280 | spa_t *spa = vd->vdev_spa; |
| 3281 | char bias_str[64]; |
| 3282 | |
| 3283 | error = zap_lookup(spa->spa_meta_objset, vd->vdev_top_zap, |
| 3284 | VDEV_TOP_ZAP_ALLOCATION_BIAS, 1, sizeof (bias_str), |
| 3285 | bias_str); |
| 3286 | if (error == 0) { |
| 3287 | ASSERT(vd->vdev_alloc_bias == VDEV_BIAS_NONE); |
| 3288 | vd->vdev_alloc_bias = vdev_derive_alloc_bias(bias_str); |
| 3289 | } else if (error != ENOENT) { |
| 3290 | vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, |
| 3291 | VDEV_AUX_CORRUPT_DATA); |
| 3292 | vdev_dbgmsg(vd, "vdev_load: zap_lookup(top_zap=%llu) " |
| 3293 | "failed [error=%d]", vd->vdev_top_zap, error); |
| 3294 | return (error); |
| 3295 | } |
| 3296 | } |
| 3297 | |
| 3298 | /* |
| 3299 | * Load any rebuild state from the top-level vdev zap. |
| 3300 | */ |
| 3301 | if (vd == vd->vdev_top && vd->vdev_top_zap != 0) { |
| 3302 | error = vdev_rebuild_load(vd); |
| 3303 | if (error && error != ENOTSUP) { |
| 3304 | vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, |
| 3305 | VDEV_AUX_CORRUPT_DATA); |
| 3306 | vdev_dbgmsg(vd, "vdev_load: vdev_rebuild_load " |
| 3307 | "failed [error=%d]", error); |
| 3308 | return (error); |
| 3309 | } |
| 3310 | } |
| 3311 | |
| 3312 | /* |
| 3313 | * If this is a top-level vdev, initialize its metaslabs. |
| 3314 | */ |
| 3315 | if (vd == vd->vdev_top && vdev_is_concrete(vd)) { |
| 3316 | vdev_metaslab_group_create(vd); |
no test coverage detected