usr/src/uts/common/fs/zfs/zio.c
changeset 9443 2a96d8478e95
parent 9396 f41cf682d0d3
child 9470 6d827468d7b5
equal deleted inserted replaced
9442:8cd92af489a6 9443:2a96d8478e95
   488 		zio->io_bp = bp;
   488 		zio->io_bp = bp;
   489 		zio->io_bp_copy = *bp;
   489 		zio->io_bp_copy = *bp;
   490 		zio->io_bp_orig = *bp;
   490 		zio->io_bp_orig = *bp;
   491 		if (type != ZIO_TYPE_WRITE)
   491 		if (type != ZIO_TYPE_WRITE)
   492 			zio->io_bp = &zio->io_bp_copy;	/* so caller can free */
   492 			zio->io_bp = &zio->io_bp_copy;	/* so caller can free */
   493 		if (zio->io_child_type == ZIO_CHILD_LOGICAL) {
   493 		if (zio->io_child_type == ZIO_CHILD_LOGICAL)
   494 			if (BP_IS_GANG(bp))
       
   495 				pipeline |= ZIO_GANG_STAGES;
       
   496 			zio->io_logical = zio;
   494 			zio->io_logical = zio;
   497 		}
   495 		if (zio->io_child_type > ZIO_CHILD_GANG && BP_IS_GANG(bp))
       
   496 			pipeline |= ZIO_GANG_STAGES;
   498 	}
   497 	}
   499 
   498 
   500 	zio->io_spa = spa;
   499 	zio->io_spa = spa;
   501 	zio->io_txg = txg;
   500 	zio->io_txg = txg;
   502 	zio->io_data = data;
   501 	zio->io_data = data;
   518 		zio->io_bookmark = *zb;
   517 		zio->io_bookmark = *zb;
   519 
   518 
   520 	if (pio != NULL) {
   519 	if (pio != NULL) {
   521 		if (zio->io_logical == NULL)
   520 		if (zio->io_logical == NULL)
   522 			zio->io_logical = pio->io_logical;
   521 			zio->io_logical = pio->io_logical;
       
   522 		if (zio->io_child_type == ZIO_CHILD_GANG)
       
   523 			zio->io_gang_leader = pio->io_gang_leader;
   523 		zio_add_child(pio, zio);
   524 		zio_add_child(pio, zio);
   524 	}
   525 	}
   525 
   526 
   526 	return (zio);
   527 	return (zio);
   527 }
   528 }
   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 	}
  1098 {
  1100 {
  1099 	zio_t *cio, *cio_next;
  1101 	zio_t *cio, *cio_next;
  1100 
  1102 
  1101 	ASSERT(pio->io_child_type == ZIO_CHILD_LOGICAL);
  1103 	ASSERT(pio->io_child_type == ZIO_CHILD_LOGICAL);
  1102 	ASSERT(pio->io_orig_stage == ZIO_STAGE_OPEN);
  1104 	ASSERT(pio->io_orig_stage == ZIO_STAGE_OPEN);
       
  1105 	ASSERT(pio->io_gang_leader == NULL);
       
  1106 	ASSERT(pio->io_gang_tree == NULL);
  1103 
  1107 
  1104 	pio->io_flags = pio->io_orig_flags;
  1108 	pio->io_flags = pio->io_orig_flags;
  1105 	pio->io_stage = pio->io_orig_stage;
  1109 	pio->io_stage = pio->io_orig_stage;
  1106 	pio->io_pipeline = pio->io_orig_pipeline;
  1110 	pio->io_pipeline = pio->io_orig_pipeline;
  1107 	pio->io_reexecute = 0;
  1111 	pio->io_reexecute = 0;
  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 
  2278 	 * such, cannot acquire any new parents.
  2293 	 * such, cannot acquire any new parents.
  2279 	 */
  2294 	 */
  2280 	if (zio->io_done)
  2295 	if (zio->io_done)
  2281 		zio->io_done(zio);
  2296 		zio->io_done(zio);
  2282 
  2297 
  2283 	zio_gang_tree_free(&zio->io_gang_tree);
       
  2284 
       
  2285 	mutex_enter(&zio->io_lock);
  2298 	mutex_enter(&zio->io_lock);
  2286 	zio->io_state[ZIO_WAIT_DONE] = 1;
  2299 	zio->io_state[ZIO_WAIT_DONE] = 1;
  2287 	mutex_exit(&zio->io_lock);
  2300 	mutex_exit(&zio->io_lock);
  2288 
  2301 
  2289 	for (pio = zio_walk_parents(zio); pio != NULL; pio = pio_next) {
  2302 	for (pio = zio_walk_parents(zio); pio != NULL; pio = pio_next) {