svn commit: r269407 - in head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys

Andriy Gapon avg at FreeBSD.org
Mon Oct 20 22:55:18 UTC 2014


On 02/08/2014 02:16, Steven Hartland wrote:
> Author: smh
> Date: Fri Aug  1 23:16:48 2014
> New Revision: 269407
> URL: http://svnweb.freebsd.org/changeset/base/269407
> 
> Log:
>   Don't return ZIO_PIPELINE_CONTINUE from vdev_op_io_start methods
>   
>   This prevents recursion of vdev_queue_io_done as per r265321 but
>   using a different method as recommended on the openzfs list.
>   
>   We now use zio_interrupt(zio) and return ZIO_PIPELINE_STOP instead
>   of returning ZIO_PIPELINE_CONTINUE from vdev_*_io_start methods.
>   
>   zio_vdev_io_start now ASSERTS the that vdev_op_io_start returns
>   ZIO_PIPELINE_STOP to ensure future changes don't reintroduce
>   ZIO_PIPELINE_CONTINUE returns.


Steve,

it seems that the issue is applicable to OpenZFS in general, but unfortunately,
as far as I can see, it's been applied only to FreeBSD.

Now, I see the following bug report and a proposed fix:
https://www.illumos.org/projects/illumos-gate//issues/5244
https://reviews.csiden.org/r/119/

I am not 100% sure, but it seems that those upstream changes could fix the
problem that you've found.

What do you think?
Thanks!

>   Cleanup flow in vdev_geom_io_start while I'm here.
>   
>   Also fix some cases not using SET_ERROR(..)
>   
>   MFC after:	2 weeks
>   X-MFC-With:	r265321
> 
> Modified:
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -208,7 +208,6 @@ enum zio_flag {
>  	ZIO_FLAG_NOPWRITE	= 1 << 26,
>  	ZIO_FLAG_REEXECUTED	= 1 << 27,
>  	ZIO_FLAG_DELEGATED	= 1 << 28,
> -	ZIO_FLAG_QUEUE_IO_DONE	= 1 << 29,
>  };
>  
>  #define	ZIO_FLAG_MUSTSUCCEED		0
> @@ -363,7 +362,7 @@ typedef struct zio_transform {
>  	struct zio_transform	*zt_next;
>  } zio_transform_t;
>  
> -typedef int zio_pipe_stage_t(zio_t **ziop);
> +typedef int zio_pipe_stage_t(zio_t *zio);
>  
>  /*
>   * The io_reexecute flags are distinct from io_flags because the child must
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -684,7 +684,7 @@ vdev_disk_io_intr(buf_t *bp)
>  	 * Rather than teach the rest of the stack about other error
>  	 * possibilities (EFAULT, etc), we normalize the error value here.
>  	 */
> -	zio->io_error = (geterror(bp) != 0 ? EIO : 0);
> +	zio->io_error = (geterror(bp) != 0 ? SET_ERROR(EIO) : 0);
>  
>  	if (zio->io_error == 0 && bp->b_resid != 0)
>  		zio->io_error = SET_ERROR(EIO);
> @@ -730,15 +730,17 @@ vdev_disk_io_start(zio_t *zio)
>  	 * Nothing to be done here but return failure.
>  	 */
>  	if (dvd == NULL || (dvd->vd_ldi_offline && dvd->vd_lh == NULL)) {
> -		zio->io_error = ENXIO;
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio->io_error = SET_ERROR(ENXIO);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	if (zio->io_type == ZIO_TYPE_IOCTL) {
>  		/* XXPOLICY */
>  		if (!vdev_readable(vd)) {
>  			zio->io_error = SET_ERROR(ENXIO);
> -			return (ZIO_PIPELINE_CONTINUE);
> +			zio_interrupt(zio);
> +			return (ZIO_PIPELINE_STOP);
>  		}
>  
>  		switch (zio->io_cmd) {
> @@ -790,7 +792,8 @@ vdev_disk_io_start(zio_t *zio)
>  			zio->io_error = SET_ERROR(ENOTSUP);
>  		}
>  
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	vb = kmem_alloc(sizeof (vdev_buf_t), KM_SLEEP);
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -164,7 +164,8 @@ vdev_file_io_start(zio_t *zio)
>  
>  	if (!vdev_readable(vd)) {
>  		zio->io_error = SET_ERROR(ENXIO);
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	vf = vd->vdev_tsd;
> @@ -180,7 +181,8 @@ vdev_file_io_start(zio_t *zio)
>  			zio->io_error = SET_ERROR(ENOTSUP);
>  		}
>  
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -749,7 +749,7 @@ vdev_geom_io_intr(struct bio *bp)
>  	vd = zio->io_vd;
>  	zio->io_error = bp->bio_error;
>  	if (zio->io_error == 0 && bp->bio_resid != 0)
> -		zio->io_error = EIO;
> +		zio->io_error = SET_ERROR(EIO);
>  
>  	switch(zio->io_error) {
>  	case ENOTSUP:
> @@ -803,37 +803,38 @@ vdev_geom_io_start(zio_t *zio)
>  		/* XXPOLICY */
>  		if (!vdev_readable(vd)) {
>  			zio->io_error = SET_ERROR(ENXIO);
> -			return (ZIO_PIPELINE_CONTINUE);
> -		}
> -
> -		switch (zio->io_cmd) {
> -		case DKIOCFLUSHWRITECACHE:
> -			if (zfs_nocacheflush || vdev_geom_bio_flush_disable)
> -				break;
> -			if (vd->vdev_nowritecache) {
> +		} else {
> +			switch (zio->io_cmd) {
> +			case DKIOCFLUSHWRITECACHE:
> +				if (zfs_nocacheflush || vdev_geom_bio_flush_disable)
> +					break;
> +				if (vd->vdev_nowritecache) {
> +					zio->io_error = SET_ERROR(ENOTSUP);
> +					break;
> +				}
> +				goto sendreq;
> +			default:
>  				zio->io_error = SET_ERROR(ENOTSUP);
> -				break;
>  			}
> -			goto sendreq;
> -		default:
> -			zio->io_error = SET_ERROR(ENOTSUP);
>  		}
>  
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	case ZIO_TYPE_FREE:
> -		if (vdev_geom_bio_delete_disable)
> -			return (ZIO_PIPELINE_CONTINUE);
> -
>  		if (vd->vdev_notrim) {
>  			zio->io_error = SET_ERROR(ENOTSUP);
> -			return (ZIO_PIPELINE_CONTINUE);
> +		} else if (!vdev_geom_bio_delete_disable) {
> +			goto sendreq;
>  		}
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  sendreq:
>  	cp = vd->vdev_tsd;
>  	if (cp == NULL) {
>  		zio->io_error = SET_ERROR(ENXIO);
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  	bp = g_alloc_bio();
>  	bp->bio_caller1 = zio;
> @@ -852,14 +853,11 @@ sendreq:
>  		bp->bio_length = zio->io_size;
>  		break;
>  	case ZIO_TYPE_IOCTL:
> -		if (zio->io_cmd == DKIOCFLUSHWRITECACHE) {
> -			bp->bio_cmd = BIO_FLUSH;
> -			bp->bio_flags |= BIO_ORDERED;
> -			bp->bio_data = NULL;
> -			bp->bio_offset = cp->provider->mediasize;
> -			bp->bio_length = 0;
> -			break;
> -		}
> +		bp->bio_cmd = BIO_FLUSH;
> +		bp->bio_flags |= BIO_ORDERED;
> +		bp->bio_data = NULL;
> +		bp->bio_offset = cp->provider->mediasize;
> +		bp->bio_length = 0;
>  		break;
>  	}
>  	bp->bio_done = vdev_geom_io_intr;
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -450,7 +450,8 @@ vdev_mirror_io_start(zio_t *zio)
>  				    zio->io_type, zio->io_priority, 0,
>  				    vdev_mirror_scrub_done, mc));
>  			}
> -			return (ZIO_PIPELINE_CONTINUE);
> +			zio_interrupt(zio);
> +			return (ZIO_PIPELINE_STOP);
>  		}
>  		/*
>  		 * For normal reads just pick one child.
> @@ -477,7 +478,8 @@ vdev_mirror_io_start(zio_t *zio)
>  		c++;
>  	}
>  
> -	return (ZIO_PIPELINE_CONTINUE);
> +	zio_interrupt(zio);
> +	return (ZIO_PIPELINE_STOP);
>  }
>  
>  static int
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -71,7 +71,8 @@ static int
>  vdev_missing_io_start(zio_t *zio)
>  {
>  	zio->io_error = SET_ERROR(ENOTSUP);
> -	return (ZIO_PIPELINE_CONTINUE);
> +	zio_interrupt(zio);
> +	return (ZIO_PIPELINE_STOP);
>  }
>  
>  /* ARGSUSED */
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -796,25 +796,14 @@ vdev_queue_io_done(zio_t *zio)
>  
>  	vq->vq_io_complete_ts = gethrtime();
>  
> -	if (zio->io_flags & ZIO_FLAG_QUEUE_IO_DONE) {
> -		/*
> -		 * Executing from a previous vdev_queue_io_done so
> -		 * to avoid recursion we just unlock and return.
> -		 */
> -		mutex_exit(&vq->vq_lock);
> -		return;
> -	}
> -
>  	while ((nio = vdev_queue_io_to_issue(vq)) != NULL) {
>  		mutex_exit(&vq->vq_lock);
> -		nio->io_flags |= ZIO_FLAG_QUEUE_IO_DONE;
>  		if (nio->io_done == vdev_queue_agg_io_done) {
>  			zio_nowait(nio);
>  		} else {
>  			zio_vdev_io_reissue(nio);
>  			zio_execute(nio);
>  		}
> -		nio->io_flags &= ~ZIO_FLAG_QUEUE_IO_DONE;
>  		mutex_enter(&vq->vq_lock);
>  	}
>  
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -1755,7 +1755,9 @@ vdev_raidz_io_start(zio_t *zio)
>  			    zio->io_type, zio->io_priority, 0,
>  			    vdev_raidz_child_done, rc));
>  		}
> -		return (ZIO_PIPELINE_CONTINUE);
> +
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	if (zio->io_type == ZIO_TYPE_WRITE) {
> @@ -1787,7 +1789,8 @@ vdev_raidz_io_start(zio_t *zio)
>  			    ZIO_FLAG_NODATA | ZIO_FLAG_OPTIONAL, NULL, NULL));
>  		}
>  
> -		return (ZIO_PIPELINE_CONTINUE);
> +		zio_interrupt(zio);
> +		return (ZIO_PIPELINE_STOP);
>  	}
>  
>  	ASSERT(zio->io_type == ZIO_TYPE_READ);
> @@ -1827,7 +1830,8 @@ vdev_raidz_io_start(zio_t *zio)
>  		}
>  	}
>  
> -	return (ZIO_PIPELINE_CONTINUE);
> +	zio_interrupt(zio);
> +	return (ZIO_PIPELINE_STOP);
>  }
>  
>  
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c	Fri Aug  1 23:06:38 2014	(r269406)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c	Fri Aug  1 23:16:48 2014	(r269407)
> @@ -1038,9 +1038,8 @@ zio_shrink(zio_t *zio, uint64_t size)
>   */
>  
>  static int
> -zio_read_bp_init(zio_t **ziop)
> +zio_read_bp_init(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF &&
> @@ -1073,9 +1072,8 @@ zio_read_bp_init(zio_t **ziop)
>  }
>  
>  static int
> -zio_write_bp_init(zio_t **ziop)
> +zio_write_bp_init(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	spa_t *spa = zio->io_spa;
>  	zio_prop_t *zp = &zio->io_prop;
>  	enum zio_compress compress = zp->zp_compress;
> @@ -1255,9 +1253,8 @@ zio_write_bp_init(zio_t **ziop)
>  }
>  
>  static int
> -zio_free_bp_init(zio_t **ziop)
> +zio_free_bp_init(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	if (zio->io_child_type == ZIO_CHILD_LOGICAL) {
> @@ -1340,10 +1337,8 @@ zio_taskq_member(zio_t *zio, zio_taskq_t
>  }
>  
>  static int
> -zio_issue_async(zio_t **ziop)
> +zio_issue_async(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
> -
>  	zio_taskq_dispatch(zio, ZIO_TASKQ_ISSUE, B_FALSE);
>  
>  	return (ZIO_PIPELINE_STOP);
> @@ -1411,7 +1406,7 @@ zio_execute(zio_t *zio)
>  		}
>  
>  		zio->io_stage = stage;
> -		rv = zio_pipeline[highbit64(stage) - 1](&zio);
> +		rv = zio_pipeline[highbit64(stage) - 1](zio);
>  
>  		if (rv == ZIO_PIPELINE_STOP)
>  			return;
> @@ -1845,9 +1840,8 @@ zio_gang_tree_issue(zio_t *pio, zio_gang
>  }
>  
>  static int
> -zio_gang_assemble(zio_t **ziop)
> +zio_gang_assemble(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == NULL);
> @@ -1861,9 +1855,8 @@ zio_gang_assemble(zio_t **ziop)
>  }
>  
>  static int
> -zio_gang_issue(zio_t **ziop)
> +zio_gang_issue(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE))
> @@ -1997,9 +1990,8 @@ zio_write_gang_block(zio_t *pio)
>   * writes) and as a result is mutually exclusive with dedup.
>   */
>  static int
> -zio_nop_write(zio_t **ziop)
> +zio_nop_write(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  	blkptr_t *bp_orig = &zio->io_bp_orig;
>  	zio_prop_t *zp = &zio->io_prop;
> @@ -2070,9 +2062,8 @@ zio_ddt_child_read_done(zio_t *zio)
>  }
>  
>  static int
> -zio_ddt_read_start(zio_t **ziop)
> +zio_ddt_read_start(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	ASSERT(BP_GET_DEDUP(bp));
> @@ -2114,9 +2105,8 @@ zio_ddt_read_start(zio_t **ziop)
>  }
>  
>  static int
> -zio_ddt_read_done(zio_t **ziop)
> +zio_ddt_read_done(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  
>  	if (zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE))
> @@ -2284,9 +2274,8 @@ zio_ddt_ditto_write_done(zio_t *zio)
>  }
>  
>  static int
> -zio_ddt_write(zio_t **ziop)
> +zio_ddt_write(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	spa_t *spa = zio->io_spa;
>  	blkptr_t *bp = zio->io_bp;
>  	uint64_t txg = zio->io_txg;
> @@ -2397,9 +2386,8 @@ zio_ddt_write(zio_t **ziop)
>  ddt_entry_t *freedde; /* for debugging */
>  
>  static int
> -zio_ddt_free(zio_t **ziop)
> +zio_ddt_free(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	spa_t *spa = zio->io_spa;
>  	blkptr_t *bp = zio->io_bp;
>  	ddt_t *ddt = ddt_select(spa, bp);
> @@ -2424,9 +2412,8 @@ zio_ddt_free(zio_t **ziop)
>   * ==========================================================================
>   */
>  static int
> -zio_dva_allocate(zio_t **ziop)
> +zio_dva_allocate(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	spa_t *spa = zio->io_spa;
>  	metaslab_class_t *mc = spa_normal_class(spa);
>  	blkptr_t *bp = zio->io_bp;
> @@ -2468,19 +2455,16 @@ zio_dva_allocate(zio_t **ziop)
>  }
>  
>  static int
> -zio_dva_free(zio_t **ziop)
> +zio_dva_free(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
> -
>  	metaslab_free(zio->io_spa, zio->io_bp, zio->io_txg, B_FALSE);
>  
>  	return (ZIO_PIPELINE_CONTINUE);
>  }
>  
>  static int
> -zio_dva_claim(zio_t **ziop)
> +zio_dva_claim(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	int error;
>  
>  	error = metaslab_claim(zio->io_spa, zio->io_bp, zio->io_txg);
> @@ -2574,12 +2558,12 @@ zio_free_zil(spa_t *spa, uint64_t txg, b
>   * ==========================================================================
>   */
>  static int
> -zio_vdev_io_start(zio_t **ziop)
> +zio_vdev_io_start(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	vdev_t *vd = zio->io_vd;
>  	uint64_t align;
>  	spa_t *spa = zio->io_spa;
> +	int ret;
>  
>  	ASSERT(zio->io_error == 0);
>  	ASSERT(zio->io_child_error[ZIO_CHILD_VDEV] == 0);
> @@ -2690,7 +2674,6 @@ zio_vdev_io_start(zio_t **ziop)
>  		case ZIO_TYPE_FREE:
>  			if ((zio = vdev_queue_io(zio)) == NULL)
>  				return (ZIO_PIPELINE_STOP);
> -			*ziop = zio;
>  
>  			if (!vdev_accessible(vd, zio)) {
>  				zio->io_error = SET_ERROR(ENXIO);
> @@ -2710,13 +2693,15 @@ zio_vdev_io_start(zio_t **ziop)
>  			return (ZIO_PIPELINE_STOP);
>  	}
>  
> -	return (vd->vdev_ops->vdev_op_io_start(zio));
> +	ret = vd->vdev_ops->vdev_op_io_start(zio);
> +	ASSERT(ret == ZIO_PIPELINE_STOP);
> +
> +	return (ret);
>  }
>  
>  static int
> -zio_vdev_io_done(zio_t **ziop)
> +zio_vdev_io_done(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	vdev_t *vd = zio->io_vd;
>  	vdev_ops_t *ops = vd ? vd->vdev_ops : &vdev_mirror_ops;
>  	boolean_t unexpected_error = B_FALSE;
> @@ -2794,9 +2779,8 @@ zio_vsd_default_cksum_report(zio_t *zio,
>  }
>  
>  static int
> -zio_vdev_io_assess(zio_t **ziop)
> +zio_vdev_io_assess(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	vdev_t *vd = zio->io_vd;
>  
>  	if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE))
> @@ -2911,9 +2895,8 @@ zio_vdev_io_bypass(zio_t *zio)
>   * ==========================================================================
>   */
>  static int
> -zio_checksum_generate(zio_t **ziop)
> +zio_checksum_generate(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  	enum zio_checksum checksum;
>  
> @@ -2943,9 +2926,8 @@ zio_checksum_generate(zio_t **ziop)
>  }
>  
>  static int
> -zio_checksum_verify(zio_t **ziop)
> +zio_checksum_verify(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	zio_bad_cksum_t info;
>  	blkptr_t *bp = zio->io_bp;
>  	int error;
> @@ -3016,9 +2998,8 @@ zio_worst_error(int e1, int e2)
>   * ==========================================================================
>   */
>  static int
> -zio_ready(zio_t **ziop)
> +zio_ready(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	blkptr_t *bp = zio->io_bp;
>  	zio_t *pio, *pio_next;
>  
> @@ -3075,9 +3056,8 @@ zio_ready(zio_t **ziop)
>  }
>  
>  static int
> -zio_done(zio_t **ziop)
> +zio_done(zio_t *zio)
>  {
> -	zio_t *zio = *ziop;
>  	spa_t *spa = zio->io_spa;
>  	zio_t *lio = zio->io_logical;
>  	blkptr_t *bp = zio->io_bp;
> 


-- 
Andriy Gapon


More information about the svn-src-head mailing list