Lines Matching full:vdev

58  * The indirect_child_t represents the vdev that we will read from, when we
71 * indirect vdev. For non-split (contiguously-mapped) blocks, there will be
84 vdev_t *is_vdev; /* top-level vdev */
99 * The indirect_vsd_t is associated with each i/o to the indirect vdev.
100 * It is the "Vdev-Specific Data" in the zio_t's io_vsd.
233 vdev_read_phys(vdev_t *vdev, const blkptr_t *bp, void *buf, in vdev_read_phys() argument
239 if (vdev->v_phys_read == NULL) in vdev_read_phys()
248 rc = vdev->v_phys_read(vdev, vdev->v_priv, offset, buf, psize); in vdev_read_phys()
251 rc = zio_checksum_verify(vdev->v_spa, bp, buf); in vdev_read_phys()
258 vdev_write_phys(vdev_t *vdev, void *buf, off_t offset, size_t size) in vdev_write_phys() argument
260 if (vdev->v_phys_write == NULL) in vdev_write_phys()
263 return (vdev->v_phys_write(vdev, offset, buf, size)); in vdev_write_phys()
494 * Given an indirect vdev and an extent on that vdev, it duplicates the
539 vdev_lookup_top(spa_t *spa, uint64_t vdev) in vdev_lookup_top() argument
546 if (rvd->v_id == vdev) in vdev_lookup_top()
698 vdev_indirect_read(vdev_t *vdev, const blkptr_t *bp, void *buf, in vdev_indirect_read() argument
702 spa_t *spa = vdev->v_spa; in vdev_indirect_read()
720 zio.io_vd = vdev; in vdev_indirect_read()
723 if (vdev->v_mapping == NULL) { in vdev_indirect_read()
726 vic = &vdev->vdev_indirect_config; in vdev_indirect_read()
727 vdev->v_mapping = vdev_indirect_mapping_open(spa, in vdev_indirect_read()
731 vdev_indirect_remap(vdev, offset, bytes, &zio); in vdev_indirect_read()
757 * top-level vdev. Since we don't know the in vdev_indirect_read()
761 * random (healthy) leaf vdev. We have to verify in vdev_indirect_read()
786 vdev_disk_read(vdev_t *vdev, const blkptr_t *bp, void *buf, in vdev_disk_read() argument
790 return (vdev_read_phys(vdev, bp, buf, in vdev_disk_read()
795 vdev_missing_read(vdev_t *vdev __unused, const blkptr_t *bp __unused, in vdev_missing_read()
803 vdev_mirror_read(vdev_t *vdev, const blkptr_t *bp, void *buf, in vdev_mirror_read() argument
810 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_mirror_read()
822 vdev_replacing_read(vdev_t *vdev, const blkptr_t *bp, void *buf, in vdev_replacing_read() argument
834 kid = STAILQ_FIRST(&vdev->v_children); in vdev_replacing_read()
845 vdev_t *vdev; in vdev_find() local
847 STAILQ_FOREACH(vdev, &zfs_vdevs, v_alllink) in vdev_find()
848 if (vdev->v_guid == guid) in vdev_find()
849 return (vdev); in vdev_find()
857 vdev_t *vdev; in vdev_create() local
860 vdev = calloc(1, sizeof(vdev_t)); in vdev_create()
861 if (vdev != NULL) { in vdev_create()
862 STAILQ_INIT(&vdev->v_children); in vdev_create()
863 vdev->v_guid = guid; in vdev_create()
864 vdev->v_read = _read; in vdev_create()
867 * root vdev has no read function, we use this fact to in vdev_create()
868 * skip setting up data we do not need for root vdev. in vdev_create()
869 * We only point root vdev from spa. in vdev_create()
872 vic = &vdev->vdev_indirect_config; in vdev_create()
874 STAILQ_INSERT_TAIL(&zfs_vdevs, vdev, v_alllink); in vdev_create()
878 return (vdev); in vdev_create()
882 vdev_set_initial_state(vdev_t *vdev, const nvlist_t *nvlist) in vdev_set_initial_state() argument
903 vdev->v_state = VDEV_STATE_OFFLINE; in vdev_set_initial_state()
905 vdev->v_state = VDEV_STATE_REMOVED; in vdev_set_initial_state()
907 vdev->v_state = VDEV_STATE_FAULTED; in vdev_set_initial_state()
909 vdev->v_state = VDEV_STATE_DEGRADED; in vdev_set_initial_state()
911 vdev->v_state = VDEV_STATE_CANT_OPEN; in vdev_set_initial_state()
913 vdev->v_islog = is_log != 0; in vdev_set_initial_state()
924 vdev_t *vdev; in vdev_init() local
948 vdev = vdev_create(guid, vdev_mirror_read); in vdev_init()
950 vdev = vdev_create(guid, vdev_raidz_read); in vdev_init()
952 vdev = vdev_create(guid, vdev_replacing_read); in vdev_init()
956 vdev = vdev_create(guid, vdev_indirect_read); in vdev_init()
957 if (vdev != NULL) { in vdev_init()
958 vdev->v_state = VDEV_STATE_HEALTHY; in vdev_init()
959 vic = &vdev->vdev_indirect_config; in vdev_init()
975 vdev = vdev_create(guid, vdev_missing_read); in vdev_init()
977 vdev = vdev_create(guid, vdev_disk_read); in vdev_init()
980 if (vdev == NULL) in vdev_init()
983 vdev_set_initial_state(vdev, nvlist); in vdev_init()
984 vdev->v_id = id; in vdev_init()
987 vdev->v_ashift = ashift; in vdev_init()
991 vdev->v_psize = asize + in vdev_init()
997 vdev->v_nparity = nparity; in vdev_init()
1011 vdev->v_name = name; in vdev_init()
1015 if (vdev->v_nparity < 1 || in vdev_init()
1016 vdev->v_nparity > 3) { in vdev_init()
1018 vdev->v_nparity); in vdev_init()
1022 vdev->v_nparity, id); in vdev_init()
1026 vdev->v_name = name; in vdev_init()
1028 *vdevp = vdev; in vdev_init()
1033 * Find slot for vdev. We return either NULL to signal to use
1038 vdev_find_previous(vdev_t *top_vdev, vdev_t *vdev) in vdev_find_previous() argument
1047 if (v->v_id > vdev->v_id) in vdev_find_previous()
1050 if (v->v_id == vdev->v_id) in vdev_find_previous()
1053 if (v->v_id < vdev->v_id) in vdev_find_previous()
1060 vdev_child_count(vdev_t *vdev) in vdev_child_count() argument
1066 STAILQ_FOREACH(v, &vdev->v_children, v_childlink) { in vdev_child_count()
1073 * Insert vdev into top_vdev children list. List is ordered by v_id.
1076 vdev_insert(vdev_t *top_vdev, vdev_t *vdev) in vdev_insert() argument
1082 * The top level vdev can appear in random order, depending how in vdev_insert()
1084 * However, we will insert vdev to create list ordered by v_id, in vdev_insert()
1088 previous = vdev_find_previous(top_vdev, vdev); in vdev_insert()
1091 STAILQ_INSERT_HEAD(&top_vdev->v_children, vdev, v_childlink); in vdev_insert()
1092 } else if (previous->v_id == vdev->v_id) { in vdev_insert()
1094 * This vdev was configured from label config, in vdev_insert()
1099 STAILQ_INSERT_AFTER(&top_vdev->v_children, previous, vdev, in vdev_insert()
1112 vdev_t *top_vdev, *vdev; in vdev_from_nvlist() local
1116 /* Get top vdev. */ in vdev_from_nvlist()
1140 rc = vdev_init(guid, kids[i], &vdev); in vdev_from_nvlist()
1144 vdev->v_spa = spa; in vdev_from_nvlist()
1145 vdev->v_top = top_vdev; in vdev_from_nvlist()
1146 vdev_insert(top_vdev, vdev); in vdev_from_nvlist()
1180 printf("ZFS: can't find vdev details\n"); in vdev_init_from_label()
1190 vdev_set_state(vdev_t *vdev) in vdev_set_state() argument
1196 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_set_state()
1205 if (STAILQ_FIRST(&vdev->v_children)) { in vdev_set_state()
1208 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_set_state()
1215 vdev->v_state = VDEV_STATE_HEALTHY; in vdev_set_state()
1217 if (vdev->v_read == vdev_mirror_read) { in vdev_set_state()
1219 vdev->v_state = VDEV_STATE_DEGRADED; in vdev_set_state()
1221 vdev->v_state = VDEV_STATE_OFFLINE; in vdev_set_state()
1223 } else if (vdev->v_read == vdev_raidz_read) { in vdev_set_state()
1224 if (bad_kids > vdev->v_nparity) { in vdev_set_state()
1225 vdev->v_state = VDEV_STATE_OFFLINE; in vdev_set_state()
1227 vdev->v_state = VDEV_STATE_DEGRADED; in vdev_set_state()
1237 vdev_t *vdev; in vdev_update_from_nvlist() local
1241 /* Update top vdev. */ in vdev_update_from_nvlist()
1242 vdev = vdev_find(top_guid); in vdev_update_from_nvlist()
1243 if (vdev != NULL) in vdev_update_from_nvlist()
1244 vdev_set_initial_state(vdev, nvlist); in vdev_update_from_nvlist()
1258 vdev = vdev_find(guid); in vdev_update_from_nvlist()
1259 if (vdev != NULL) in vdev_update_from_nvlist()
1260 vdev_set_initial_state(vdev, kids[i]); in vdev_update_from_nvlist()
1275 * Shall not be called on root vdev, that is not linked into zfs_vdevs.
1279 vdev_free(struct vdev *vdev) in vdev_free() argument
1281 struct vdev *kid, *safe; in vdev_free()
1283 STAILQ_FOREACH_SAFE(kid, &vdev->v_children, v_childlink, safe) in vdev_free()
1285 STAILQ_REMOVE(&zfs_vdevs, vdev, vdev, v_alllink); in vdev_free()
1286 free(vdev); in vdev_free()
1302 printf("ZFS: can't find vdev details\n"); in vdev_init_from_nvlist()
1319 * MOS config has at least one child for root vdev. in vdev_init_from_nvlist()
1326 vdev_t *vdev; in vdev_init_from_nvlist() local
1332 vdev = vdev_find(guid); in vdev_init_from_nvlist()
1334 * Top level vdev is missing, create it. in vdev_init_from_nvlist()
1337 if (vdev == NULL) in vdev_init_from_nvlist()
1351 * Re-evaluate top-level vdev state. in vdev_init_from_nvlist()
1460 vdev_status(vdev_t *vdev, int indent) in vdev_status() argument
1465 if (vdev->v_islog) { in vdev_status()
1470 ret = print_state(indent, vdev->v_name, vdev->v_state); in vdev_status()
1474 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_status()
1488 vdev_t *vdev; in spa_status() local
1517 STAILQ_FOREACH(vdev, vlist, v_childlink) { in spa_status()
1518 if (vdev->v_state == VDEV_STATE_HEALTHY) in spa_status()
1520 else if (vdev->v_state == VDEV_STATE_DEGRADED) in spa_status()
1536 STAILQ_FOREACH(vdev, vlist, v_childlink) { in spa_status()
1537 ret = vdev_status(vdev, 1); in spa_status()
1636 * Our vdev label does consist of 4 fields:
1701 vdev_write_bootenv_impl(vdev_t *vdev, vdev_boot_envblock_t *be) in vdev_write_bootenv_impl() argument
1706 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_write_bootenv_impl()
1717 if (vdev->v_phys_write == NULL) in vdev_write_bootenv_impl()
1721 err = vdev_label_write(vdev, l, be, in vdev_write_bootenv_impl()
1725 vdev->v_name ? vdev->v_name : "unknown", l, err); in vdev_write_bootenv_impl()
1733 vdev_write_bootenv(vdev_t *vdev, nvlist_t *nvl) in vdev_write_bootenv() argument
1744 nvp = vdev_read_bootenv(vdev); in vdev_write_bootenv()
1784 rv = vdev_write_bootenv_impl(vdev, be); in vdev_write_bootenv()
1795 vdev_read_bootenv(vdev_t *vdev) in vdev_read_bootenv() argument
1804 STAILQ_FOREACH(kid, &vdev->v_children, v_childlink) { in vdev_read_bootenv()
1819 rv = vdev_label_read(vdev, l, be, in vdev_read_bootenv()
1891 /* Get vdev tree */ in vdev_get_label_asize()
1897 * Get vdev type. We will calculate asize for raidz, mirror and disk. in vdev_get_label_asize()
2026 vdev_t *vdev; in vdev_probe() local
2034 * Load the vdev label and figure out which in vdev_probe()
2123 struct vdev *kid; in vdev_probe()
2128 printf("ZFS: pool %s vdev %s ignoring stale " in vdev_probe()
2133 kid, vdev, v_childlink); in vdev_probe()
2140 * Get the vdev tree and create our in-core copy of it. in vdev_probe()
2141 * If we already have a vdev with this guid, this must in vdev_probe()
2145 vdev = vdev_find(guid); in vdev_probe()
2146 /* Has this vdev already been inited? */ in vdev_probe()
2147 if (vdev && vdev->v_phys_read) { in vdev_probe()
2158 * We should already have created an incomplete vdev for this in vdev_probe()
2159 * vdev. Find it and initialise it with our read proc. in vdev_probe()
2161 vdev = vdev_find(guid); in vdev_probe()
2162 if (vdev != NULL) { in vdev_probe()
2163 vdev->v_phys_read = _read; in vdev_probe()
2164 vdev->v_phys_write = _write; in vdev_probe()
2165 vdev->v_priv = priv; in vdev_probe()
2166 vdev->v_psize = vtmp.v_psize; in vdev_probe()
2168 * If no other state is set, mark vdev healthy. in vdev_probe()
2170 if (vdev->v_state == VDEV_STATE_UNKNOWN) in vdev_probe()
2171 vdev->v_state = VDEV_STATE_HEALTHY; in vdev_probe()
2177 if (vdev->v_islog) in vdev_probe()
2178 spa->spa_with_log = vdev->v_islog; in vdev_probe()
2181 * Re-evaluate top-level vdev state. in vdev_probe()
2183 vdev_set_state(vdev->v_top); in vdev_probe()
2190 vdev_uberblock_load(vdev, spa->spa_uberblock); in vdev_probe()
2288 vdev_t *vdev; in zio_read() local
2299 STAILQ_FOREACH(vdev, vlist, v_childlink) { in zio_read()
2300 if (vdev->v_id == vdevid) in zio_read()
2303 if (!vdev || !vdev->v_read) in zio_read()
2307 if (vdev->v_read == vdev_raidz_read) { in zio_read()
2308 align = 1ULL << vdev->v_ashift; in zio_read()
2325 error = vdev->v_read(vdev, bp, pbuf, offset, size); in zio_read()
3880 * Return either a cached copy of the bootenv, or read each of the vdev children