/*
* If we can tell the caller to execute this parent next, do
- * so. Otherwise dispatch the parent zio as its own task.
+ * so. We only do this if the parent's zio type matches the
+ * child's type. Otherwise dispatch the parent zio in its
+ * own taskq.
*
* Having the caller execute the parent when possible reduces
* locking on the zio taskq's, reduces context switch
* parent-child relationships, as we do with the "mega zio"
* of writes for spa_sync(), and the chain of ZIL blocks.
*/
- if (next_to_executep != NULL && *next_to_executep == NULL) {
+ if (next_to_executep != NULL && *next_to_executep == NULL &&
+ pio->io_type == zio->io_type) {
*next_to_executep = pio;
} else {
zio_taskq_dispatch(pio, type, B_FALSE);