| 2970 | } |
| 2971 | |
| 2972 | int |
| 2973 | vdev_dtl_load(vdev_t *vd) |
| 2974 | { |
| 2975 | spa_t *spa = vd->vdev_spa; |
| 2976 | objset_t *mos = spa->spa_meta_objset; |
| 2977 | range_tree_t *rt; |
| 2978 | int error = 0; |
| 2979 | |
| 2980 | if (vd->vdev_ops->vdev_op_leaf && vd->vdev_dtl_object != 0) { |
| 2981 | ASSERT(vdev_is_concrete(vd)); |
| 2982 | |
| 2983 | error = space_map_open(&vd->vdev_dtl_sm, mos, |
| 2984 | vd->vdev_dtl_object, 0, -1ULL, 0); |
| 2985 | if (error) |
| 2986 | return (error); |
| 2987 | ASSERT(vd->vdev_dtl_sm != NULL); |
| 2988 | |
| 2989 | rt = range_tree_create(NULL, RANGE_SEG64, NULL, 0, 0); |
| 2990 | error = space_map_load(vd->vdev_dtl_sm, rt, SM_ALLOC); |
| 2991 | if (error == 0) { |
| 2992 | mutex_enter(&vd->vdev_dtl_lock); |
| 2993 | range_tree_walk(rt, range_tree_add, |
| 2994 | vd->vdev_dtl[DTL_MISSING]); |
| 2995 | mutex_exit(&vd->vdev_dtl_lock); |
| 2996 | } |
| 2997 | |
| 2998 | range_tree_vacate(rt, NULL, NULL); |
| 2999 | range_tree_destroy(rt); |
| 3000 | |
| 3001 | return (error); |
| 3002 | } |
| 3003 | |
| 3004 | for (int c = 0; c < vd->vdev_children; c++) { |
| 3005 | error = vdev_dtl_load(vd->vdev_child[c]); |
| 3006 | if (error != 0) |
| 3007 | break; |
| 3008 | } |
| 3009 | |
| 3010 | return (error); |
| 3011 | } |
| 3012 | |
| 3013 | static void |
| 3014 | vdev_zap_allocation_data(vdev_t *vd, dmu_tx_t *tx) |
no test coverage detected