824 zio_read_bp_init(zio_t *zio) |
825 zio_read_bp_init(zio_t *zio) |
825 { |
826 { |
826 blkptr_t *bp = zio->io_bp; |
827 blkptr_t *bp = zio->io_bp; |
827 |
828 |
828 if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF && |
829 if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF && |
829 zio->io_logical == zio && !(zio->io_flags & ZIO_FLAG_RAW)) { |
830 zio->io_child_type == ZIO_CHILD_LOGICAL && |
|
831 !(zio->io_flags & ZIO_FLAG_RAW)) { |
830 uint64_t csize = BP_GET_PSIZE(bp); |
832 uint64_t csize = BP_GET_PSIZE(bp); |
831 void *cbuf = zio_buf_alloc(csize); |
833 void *cbuf = zio_buf_alloc(csize); |
832 |
834 |
833 zio_push_transform(zio, cbuf, csize, csize, zio_decompress); |
835 zio_push_transform(zio, cbuf, csize, csize, zio_decompress); |
834 } |
836 } |
1305 * exception is the gang leader: the pipeline already computed |
1309 * exception is the gang leader: the pipeline already computed |
1306 * its data checksum because that stage precedes gang assembly. |
1310 * its data checksum because that stage precedes gang assembly. |
1307 * (Presently, nothing actually uses interior data checksums; |
1311 * (Presently, nothing actually uses interior data checksums; |
1308 * this is just good hygiene.) |
1312 * this is just good hygiene.) |
1309 */ |
1313 */ |
1310 if (gn != pio->io_logical->io_gang_tree) { |
1314 if (gn != pio->io_gang_leader->io_gang_tree) { |
1311 zio_checksum_compute(zio, BP_GET_CHECKSUM(bp), |
1315 zio_checksum_compute(zio, BP_GET_CHECKSUM(bp), |
1312 data, BP_GET_PSIZE(bp)); |
1316 data, BP_GET_PSIZE(bp)); |
1313 } |
1317 } |
1314 } else { |
1318 } else { |
1315 zio = zio_rewrite(pio, pio->io_spa, pio->io_txg, bp, |
1319 zio = zio_rewrite(pio, pio->io_spa, pio->io_txg, bp, |
1387 |
1391 |
1388 zio_gang_node_free(gnpp); |
1392 zio_gang_node_free(gnpp); |
1389 } |
1393 } |
1390 |
1394 |
1391 static void |
1395 static void |
1392 zio_gang_tree_assemble(zio_t *lio, blkptr_t *bp, zio_gang_node_t **gnpp) |
1396 zio_gang_tree_assemble(zio_t *gio, blkptr_t *bp, zio_gang_node_t **gnpp) |
1393 { |
1397 { |
1394 zio_gang_node_t *gn = zio_gang_node_alloc(gnpp); |
1398 zio_gang_node_t *gn = zio_gang_node_alloc(gnpp); |
1395 |
1399 |
1396 ASSERT(lio->io_logical == lio); |
1400 ASSERT(gio->io_gang_leader == gio); |
1397 ASSERT(BP_IS_GANG(bp)); |
1401 ASSERT(BP_IS_GANG(bp)); |
1398 |
1402 |
1399 zio_nowait(zio_read(lio, lio->io_spa, bp, gn->gn_gbh, |
1403 zio_nowait(zio_read(gio, gio->io_spa, bp, gn->gn_gbh, |
1400 SPA_GANGBLOCKSIZE, zio_gang_tree_assemble_done, gn, |
1404 SPA_GANGBLOCKSIZE, zio_gang_tree_assemble_done, gn, |
1401 lio->io_priority, ZIO_GANG_CHILD_FLAGS(lio), &lio->io_bookmark)); |
1405 gio->io_priority, ZIO_GANG_CHILD_FLAGS(gio), &gio->io_bookmark)); |
1402 } |
1406 } |
1403 |
1407 |
1404 static void |
1408 static void |
1405 zio_gang_tree_assemble_done(zio_t *zio) |
1409 zio_gang_tree_assemble_done(zio_t *zio) |
1406 { |
1410 { |
1407 zio_t *lio = zio->io_logical; |
1411 zio_t *gio = zio->io_gang_leader; |
1408 zio_gang_node_t *gn = zio->io_private; |
1412 zio_gang_node_t *gn = zio->io_private; |
1409 blkptr_t *bp = zio->io_bp; |
1413 blkptr_t *bp = zio->io_bp; |
1410 zio_t *pio = zio_unique_parent(zio); |
1414 |
1411 |
1415 ASSERT(gio == zio_unique_parent(zio)); |
1412 ASSERT(pio == lio); |
|
1413 ASSERT(zio_walk_children(zio) == NULL); |
1416 ASSERT(zio_walk_children(zio) == NULL); |
1414 |
1417 |
1415 if (zio->io_error) |
1418 if (zio->io_error) |
1416 return; |
1419 return; |
1417 |
1420 |
1424 |
1427 |
1425 for (int g = 0; g < SPA_GBH_NBLKPTRS; g++) { |
1428 for (int g = 0; g < SPA_GBH_NBLKPTRS; g++) { |
1426 blkptr_t *gbp = &gn->gn_gbh->zg_blkptr[g]; |
1429 blkptr_t *gbp = &gn->gn_gbh->zg_blkptr[g]; |
1427 if (!BP_IS_GANG(gbp)) |
1430 if (!BP_IS_GANG(gbp)) |
1428 continue; |
1431 continue; |
1429 zio_gang_tree_assemble(lio, gbp, &gn->gn_child[g]); |
1432 zio_gang_tree_assemble(gio, gbp, &gn->gn_child[g]); |
1430 } |
1433 } |
1431 } |
1434 } |
1432 |
1435 |
1433 static void |
1436 static void |
1434 zio_gang_tree_issue(zio_t *pio, zio_gang_node_t *gn, blkptr_t *bp, void *data) |
1437 zio_gang_tree_issue(zio_t *pio, zio_gang_node_t *gn, blkptr_t *bp, void *data) |
1435 { |
1438 { |
1436 zio_t *lio = pio->io_logical; |
1439 zio_t *gio = pio->io_gang_leader; |
1437 zio_t *zio; |
1440 zio_t *zio; |
1438 |
1441 |
1439 ASSERT(BP_IS_GANG(bp) == !!gn); |
1442 ASSERT(BP_IS_GANG(bp) == !!gn); |
1440 ASSERT(BP_GET_CHECKSUM(bp) == BP_GET_CHECKSUM(lio->io_bp)); |
1443 ASSERT(BP_GET_CHECKSUM(bp) == BP_GET_CHECKSUM(gio->io_bp)); |
1441 ASSERT(BP_GET_LSIZE(bp) == BP_GET_PSIZE(bp) || gn == lio->io_gang_tree); |
1444 ASSERT(BP_GET_LSIZE(bp) == BP_GET_PSIZE(bp) || gn == gio->io_gang_tree); |
1442 |
1445 |
1443 /* |
1446 /* |
1444 * If you're a gang header, your data is in gn->gn_gbh. |
1447 * If you're a gang header, your data is in gn->gn_gbh. |
1445 * If you're a gang member, your data is in 'data' and gn == NULL. |
1448 * If you're a gang member, your data is in 'data' and gn == NULL. |
1446 */ |
1449 */ |
1447 zio = zio_gang_issue_func[lio->io_type](pio, bp, gn, data); |
1450 zio = zio_gang_issue_func[gio->io_type](pio, bp, gn, data); |
1448 |
1451 |
1449 if (gn != NULL) { |
1452 if (gn != NULL) { |
1450 ASSERT(gn->gn_gbh->zg_tail.zbt_magic == ZBT_MAGIC); |
1453 ASSERT(gn->gn_gbh->zg_tail.zbt_magic == ZBT_MAGIC); |
1451 |
1454 |
1452 for (int g = 0; g < SPA_GBH_NBLKPTRS; g++) { |
1455 for (int g = 0; g < SPA_GBH_NBLKPTRS; g++) { |
1456 zio_gang_tree_issue(zio, gn->gn_child[g], gbp, data); |
1459 zio_gang_tree_issue(zio, gn->gn_child[g], gbp, data); |
1457 data = (char *)data + BP_GET_PSIZE(gbp); |
1460 data = (char *)data + BP_GET_PSIZE(gbp); |
1458 } |
1461 } |
1459 } |
1462 } |
1460 |
1463 |
1461 if (gn == lio->io_gang_tree) |
1464 if (gn == gio->io_gang_tree) |
1462 ASSERT3P((char *)lio->io_data + lio->io_size, ==, data); |
1465 ASSERT3P((char *)gio->io_data + gio->io_size, ==, data); |
1463 |
1466 |
1464 if (zio != pio) |
1467 if (zio != pio) |
1465 zio_nowait(zio); |
1468 zio_nowait(zio); |
1466 } |
1469 } |
1467 |
1470 |
1468 static int |
1471 static int |
1469 zio_gang_assemble(zio_t *zio) |
1472 zio_gang_assemble(zio_t *zio) |
1470 { |
1473 { |
1471 blkptr_t *bp = zio->io_bp; |
1474 blkptr_t *bp = zio->io_bp; |
1472 |
1475 |
1473 ASSERT(BP_IS_GANG(bp) && zio == zio->io_logical); |
1476 ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == NULL); |
|
1477 ASSERT(zio->io_child_type > ZIO_CHILD_GANG); |
|
1478 |
|
1479 zio->io_gang_leader = zio; |
1474 |
1480 |
1475 zio_gang_tree_assemble(zio, bp, &zio->io_gang_tree); |
1481 zio_gang_tree_assemble(zio, bp, &zio->io_gang_tree); |
1476 |
1482 |
1477 return (ZIO_PIPELINE_CONTINUE); |
1483 return (ZIO_PIPELINE_CONTINUE); |
1478 } |
1484 } |
1479 |
1485 |
1480 static int |
1486 static int |
1481 zio_gang_issue(zio_t *zio) |
1487 zio_gang_issue(zio_t *zio) |
1482 { |
1488 { |
1483 zio_t *lio = zio->io_logical; |
|
1484 blkptr_t *bp = zio->io_bp; |
1489 blkptr_t *bp = zio->io_bp; |
1485 |
1490 |
1486 if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE)) |
1491 if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE)) |
1487 return (ZIO_PIPELINE_STOP); |
1492 return (ZIO_PIPELINE_STOP); |
1488 |
1493 |
1489 ASSERT(BP_IS_GANG(bp) && zio == lio); |
1494 ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == zio); |
|
1495 ASSERT(zio->io_child_type > ZIO_CHILD_GANG); |
1490 |
1496 |
1491 if (zio->io_child_error[ZIO_CHILD_GANG] == 0) |
1497 if (zio->io_child_error[ZIO_CHILD_GANG] == 0) |
1492 zio_gang_tree_issue(lio, lio->io_gang_tree, bp, lio->io_data); |
1498 zio_gang_tree_issue(zio, zio->io_gang_tree, bp, zio->io_data); |
1493 else |
1499 else |
1494 zio_gang_tree_free(&lio->io_gang_tree); |
1500 zio_gang_tree_free(&zio->io_gang_tree); |
1495 |
1501 |
1496 zio->io_pipeline = ZIO_INTERLOCK_PIPELINE; |
1502 zio->io_pipeline = ZIO_INTERLOCK_PIPELINE; |
1497 |
1503 |
1498 return (ZIO_PIPELINE_CONTINUE); |
1504 return (ZIO_PIPELINE_CONTINUE); |
1499 } |
1505 } |
1500 |
1506 |
1501 static void |
1507 static void |
1502 zio_write_gang_member_ready(zio_t *zio) |
1508 zio_write_gang_member_ready(zio_t *zio) |
1503 { |
1509 { |
1504 zio_t *pio = zio_unique_parent(zio); |
1510 zio_t *pio = zio_unique_parent(zio); |
1505 zio_t *lio = zio->io_logical; |
1511 zio_t *gio = zio->io_gang_leader; |
1506 dva_t *cdva = zio->io_bp->blk_dva; |
1512 dva_t *cdva = zio->io_bp->blk_dva; |
1507 dva_t *pdva = pio->io_bp->blk_dva; |
1513 dva_t *pdva = pio->io_bp->blk_dva; |
1508 uint64_t asize; |
1514 uint64_t asize; |
1509 |
1515 |
1510 if (BP_IS_HOLE(zio->io_bp)) |
1516 if (BP_IS_HOLE(zio->io_bp)) |
1511 return; |
1517 return; |
1512 |
1518 |
1513 ASSERT(BP_IS_HOLE(&zio->io_bp_orig)); |
1519 ASSERT(BP_IS_HOLE(&zio->io_bp_orig)); |
1514 |
1520 |
1515 ASSERT(zio->io_child_type == ZIO_CHILD_GANG); |
1521 ASSERT(zio->io_child_type == ZIO_CHILD_GANG); |
1516 ASSERT3U(zio->io_prop.zp_ndvas, ==, lio->io_prop.zp_ndvas); |
1522 ASSERT3U(zio->io_prop.zp_ndvas, ==, gio->io_prop.zp_ndvas); |
1517 ASSERT3U(zio->io_prop.zp_ndvas, <=, BP_GET_NDVAS(zio->io_bp)); |
1523 ASSERT3U(zio->io_prop.zp_ndvas, <=, BP_GET_NDVAS(zio->io_bp)); |
1518 ASSERT3U(pio->io_prop.zp_ndvas, <=, BP_GET_NDVAS(pio->io_bp)); |
1524 ASSERT3U(pio->io_prop.zp_ndvas, <=, BP_GET_NDVAS(pio->io_bp)); |
1519 ASSERT3U(BP_GET_NDVAS(zio->io_bp), <=, BP_GET_NDVAS(pio->io_bp)); |
1525 ASSERT3U(BP_GET_NDVAS(zio->io_bp), <=, BP_GET_NDVAS(pio->io_bp)); |
1520 |
1526 |
1521 mutex_enter(&pio->io_lock); |
1527 mutex_enter(&pio->io_lock); |
1531 static int |
1537 static int |
1532 zio_write_gang_block(zio_t *pio) |
1538 zio_write_gang_block(zio_t *pio) |
1533 { |
1539 { |
1534 spa_t *spa = pio->io_spa; |
1540 spa_t *spa = pio->io_spa; |
1535 blkptr_t *bp = pio->io_bp; |
1541 blkptr_t *bp = pio->io_bp; |
1536 zio_t *lio = pio->io_logical; |
1542 zio_t *gio = pio->io_gang_leader; |
1537 zio_t *zio; |
1543 zio_t *zio; |
1538 zio_gang_node_t *gn, **gnpp; |
1544 zio_gang_node_t *gn, **gnpp; |
1539 zio_gbh_phys_t *gbh; |
1545 zio_gbh_phys_t *gbh; |
1540 uint64_t txg = pio->io_txg; |
1546 uint64_t txg = pio->io_txg; |
1541 uint64_t resid = pio->io_size; |
1547 uint64_t resid = pio->io_size; |
1542 uint64_t lsize; |
1548 uint64_t lsize; |
1543 int ndvas = lio->io_prop.zp_ndvas; |
1549 int ndvas = gio->io_prop.zp_ndvas; |
1544 int gbh_ndvas = MIN(ndvas + 1, spa_max_replication(spa)); |
1550 int gbh_ndvas = MIN(ndvas + 1, spa_max_replication(spa)); |
1545 zio_prop_t zp; |
1551 zio_prop_t zp; |
1546 int error; |
1552 int error; |
1547 |
1553 |
1548 error = metaslab_alloc(spa, spa->spa_normal_class, SPA_GANGBLOCKSIZE, |
1554 error = metaslab_alloc(spa, spa->spa_normal_class, SPA_GANGBLOCKSIZE, |
1549 bp, gbh_ndvas, txg, pio == lio ? NULL : lio->io_bp, |
1555 bp, gbh_ndvas, txg, pio == gio ? NULL : gio->io_bp, |
1550 METASLAB_HINTBP_FAVOR | METASLAB_GANG_HEADER); |
1556 METASLAB_HINTBP_FAVOR | METASLAB_GANG_HEADER); |
1551 if (error) { |
1557 if (error) { |
1552 pio->io_error = error; |
1558 pio->io_error = error; |
1553 return (ZIO_PIPELINE_CONTINUE); |
1559 return (ZIO_PIPELINE_CONTINUE); |
1554 } |
1560 } |
1555 |
1561 |
1556 if (pio == lio) { |
1562 if (pio == gio) { |
1557 gnpp = &lio->io_gang_tree; |
1563 gnpp = &gio->io_gang_tree; |
1558 } else { |
1564 } else { |
1559 gnpp = pio->io_private; |
1565 gnpp = pio->io_private; |
1560 ASSERT(pio->io_ready == zio_write_gang_member_ready); |
1566 ASSERT(pio->io_ready == zio_write_gang_member_ready); |
1561 } |
1567 } |
1562 |
1568 |
1576 for (int g = 0; resid != 0; resid -= lsize, g++) { |
1582 for (int g = 0; resid != 0; resid -= lsize, g++) { |
1577 lsize = P2ROUNDUP(resid / (SPA_GBH_NBLKPTRS - g), |
1583 lsize = P2ROUNDUP(resid / (SPA_GBH_NBLKPTRS - g), |
1578 SPA_MINBLOCKSIZE); |
1584 SPA_MINBLOCKSIZE); |
1579 ASSERT(lsize >= SPA_MINBLOCKSIZE && lsize <= resid); |
1585 ASSERT(lsize >= SPA_MINBLOCKSIZE && lsize <= resid); |
1580 |
1586 |
1581 zp.zp_checksum = lio->io_prop.zp_checksum; |
1587 zp.zp_checksum = gio->io_prop.zp_checksum; |
1582 zp.zp_compress = ZIO_COMPRESS_OFF; |
1588 zp.zp_compress = ZIO_COMPRESS_OFF; |
1583 zp.zp_type = DMU_OT_NONE; |
1589 zp.zp_type = DMU_OT_NONE; |
1584 zp.zp_level = 0; |
1590 zp.zp_level = 0; |
1585 zp.zp_ndvas = lio->io_prop.zp_ndvas; |
1591 zp.zp_ndvas = gio->io_prop.zp_ndvas; |
1586 |
1592 |
1587 zio_nowait(zio_write(zio, spa, txg, &gbh->zg_blkptr[g], |
1593 zio_nowait(zio_write(zio, spa, txg, &gbh->zg_blkptr[g], |
1588 (char *)pio->io_data + (pio->io_size - resid), lsize, &zp, |
1594 (char *)pio->io_data + (pio->io_size - resid), lsize, &zp, |
1589 zio_write_gang_member_ready, NULL, &gn->gn_child[g], |
1595 zio_write_gang_member_ready, NULL, &gn->gn_child[g], |
1590 pio->io_priority, ZIO_GANG_CHILD_FLAGS(pio), |
1596 pio->io_priority, ZIO_GANG_CHILD_FLAGS(pio), |
1612 { |
1618 { |
1613 spa_t *spa = zio->io_spa; |
1619 spa_t *spa = zio->io_spa; |
1614 metaslab_class_t *mc = spa->spa_normal_class; |
1620 metaslab_class_t *mc = spa->spa_normal_class; |
1615 blkptr_t *bp = zio->io_bp; |
1621 blkptr_t *bp = zio->io_bp; |
1616 int error; |
1622 int error; |
|
1623 |
|
1624 if (zio->io_gang_leader == NULL) { |
|
1625 ASSERT(zio->io_child_type > ZIO_CHILD_GANG); |
|
1626 zio->io_gang_leader = zio; |
|
1627 } |
1617 |
1628 |
1618 ASSERT(BP_IS_HOLE(bp)); |
1629 ASSERT(BP_IS_HOLE(bp)); |
1619 ASSERT3U(BP_GET_NDVAS(bp), ==, 0); |
1630 ASSERT3U(BP_GET_NDVAS(bp), ==, 0); |
1620 ASSERT3U(zio->io_prop.zp_ndvas, >, 0); |
1631 ASSERT3U(zio->io_prop.zp_ndvas, >, 0); |
1621 ASSERT3U(zio->io_prop.zp_ndvas, <=, spa_max_replication(spa)); |
1632 ASSERT3U(zio->io_prop.zp_ndvas, <=, spa_max_replication(spa)); |
2057 zio_ready(zio_t *zio) |
2068 zio_ready(zio_t *zio) |
2058 { |
2069 { |
2059 blkptr_t *bp = zio->io_bp; |
2070 blkptr_t *bp = zio->io_bp; |
2060 zio_t *pio, *pio_next; |
2071 zio_t *pio, *pio_next; |
2061 |
2072 |
|
2073 if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY)) |
|
2074 return (ZIO_PIPELINE_STOP); |
|
2075 |
2062 if (zio->io_ready) { |
2076 if (zio->io_ready) { |
2063 if (BP_IS_GANG(bp) && |
|
2064 zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY)) |
|
2065 return (ZIO_PIPELINE_STOP); |
|
2066 |
|
2067 ASSERT(IO_IS_ALLOCATING(zio)); |
2077 ASSERT(IO_IS_ALLOCATING(zio)); |
2068 ASSERT(bp->blk_birth == zio->io_txg || BP_IS_HOLE(bp)); |
2078 ASSERT(bp->blk_birth == zio->io_txg || BP_IS_HOLE(bp)); |
2069 ASSERT(zio->io_children[ZIO_CHILD_GANG][ZIO_WAIT_READY] == 0); |
2079 ASSERT(zio->io_children[ZIO_CHILD_GANG][ZIO_WAIT_READY] == 0); |
2070 |
2080 |
2071 zio->io_ready(zio); |
2081 zio->io_ready(zio); |
2106 vdev_t *vd = zio->io_vd; |
2116 vdev_t *vd = zio->io_vd; |
2107 uint64_t psize = zio->io_size; |
2117 uint64_t psize = zio->io_size; |
2108 zio_t *pio, *pio_next; |
2118 zio_t *pio, *pio_next; |
2109 |
2119 |
2110 /* |
2120 /* |
2111 * If our of children haven't all completed, |
2121 * If our children haven't all completed, |
2112 * wait for them and then repeat this pipeline stage. |
2122 * wait for them and then repeat this pipeline stage. |
2113 */ |
2123 */ |
2114 if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE) || |
2124 if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE) || |
2115 zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE) || |
2125 zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE) || |
2116 zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_DONE)) |
2126 zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_DONE)) |
2196 * We defer this until now to avoid conflating logical child |
2206 * We defer this until now to avoid conflating logical child |
2197 * errors with errors that happened to the zio itself when |
2207 * errors with errors that happened to the zio itself when |
2198 * updating vdev stats and reporting FMA events above. |
2208 * updating vdev stats and reporting FMA events above. |
2199 */ |
2209 */ |
2200 zio_inherit_child_errors(zio, ZIO_CHILD_LOGICAL); |
2210 zio_inherit_child_errors(zio, ZIO_CHILD_LOGICAL); |
|
2211 |
|
2212 if ((zio->io_error || zio->io_reexecute) && IO_IS_ALLOCATING(zio) && |
|
2213 zio->io_child_type == ZIO_CHILD_LOGICAL) { |
|
2214 ASSERT(zio->io_child_type != ZIO_CHILD_GANG); |
|
2215 zio_dva_unallocate(zio, zio->io_gang_tree, bp); |
|
2216 } |
|
2217 |
|
2218 zio_gang_tree_free(&zio->io_gang_tree); |
2201 |
2219 |
2202 if (zio->io_reexecute && !(zio->io_flags & ZIO_FLAG_GODFATHER)) { |
2220 if (zio->io_reexecute && !(zio->io_flags & ZIO_FLAG_GODFATHER)) { |
2203 /* |
2221 /* |
2204 * This is a logical I/O that wants to reexecute. |
2222 * This is a logical I/O that wants to reexecute. |
2205 * |
2223 * |
2213 * all the original i/o dependency relationships, e.g. |
2231 * all the original i/o dependency relationships, e.g. |
2214 * parents not executing until children are ready. |
2232 * parents not executing until children are ready. |
2215 */ |
2233 */ |
2216 ASSERT(zio->io_child_type == ZIO_CHILD_LOGICAL); |
2234 ASSERT(zio->io_child_type == ZIO_CHILD_LOGICAL); |
2217 |
2235 |
2218 if (IO_IS_ALLOCATING(zio)) |
2236 zio->io_gang_leader = NULL; |
2219 zio_dva_unallocate(zio, zio->io_gang_tree, bp); |
|
2220 |
|
2221 zio_gang_tree_free(&zio->io_gang_tree); |
|
2222 |
2237 |
2223 mutex_enter(&zio->io_lock); |
2238 mutex_enter(&zio->io_lock); |
2224 zio->io_state[ZIO_WAIT_DONE] = 1; |
2239 zio->io_state[ZIO_WAIT_DONE] = 1; |
2225 mutex_exit(&zio->io_lock); |
2240 mutex_exit(&zio->io_lock); |
2226 |
2241 |