| 1597 | } |
| 1598 | |
| 1599 | static int |
| 1600 | vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, |
| 1601 | uint64_t *logical_ashift, uint64_t *physical_ashift) |
| 1602 | { |
| 1603 | vdev_raidz_t *vdrz = vd->vdev_tsd; |
| 1604 | uint64_t nparity = vdrz->vd_nparity; |
| 1605 | int c; |
| 1606 | int lasterror = 0; |
| 1607 | int numerrors = 0; |
| 1608 | |
| 1609 | ASSERT(nparity > 0); |
| 1610 | |
| 1611 | if (nparity > VDEV_RAIDZ_MAXPARITY || |
| 1612 | vd->vdev_children < nparity + 1) { |
| 1613 | vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL; |
| 1614 | return (SET_ERROR(EINVAL)); |
| 1615 | } |
| 1616 | |
| 1617 | vdev_open_children(vd); |
| 1618 | |
| 1619 | for (c = 0; c < vd->vdev_children; c++) { |
| 1620 | vdev_t *cvd = vd->vdev_child[c]; |
| 1621 | |
| 1622 | if (cvd->vdev_open_error != 0) { |
| 1623 | lasterror = cvd->vdev_open_error; |
| 1624 | numerrors++; |
| 1625 | continue; |
| 1626 | } |
| 1627 | |
| 1628 | *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1; |
| 1629 | *max_asize = MIN(*max_asize - 1, cvd->vdev_max_asize - 1) + 1; |
| 1630 | *logical_ashift = MAX(*logical_ashift, cvd->vdev_ashift); |
| 1631 | *physical_ashift = MAX(*physical_ashift, |
| 1632 | cvd->vdev_physical_ashift); |
| 1633 | } |
| 1634 | |
| 1635 | *asize *= vd->vdev_children; |
| 1636 | *max_asize *= vd->vdev_children; |
| 1637 | |
| 1638 | if (numerrors > nparity) { |
| 1639 | vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; |
| 1640 | return (lasterror); |
| 1641 | } |
| 1642 | |
| 1643 | return (0); |
| 1644 | } |
| 1645 | |
| 1646 | static void |
| 1647 | vdev_raidz_close(vdev_t *vd) |
nothing calls this directly
no test coverage detected