----- Original Message ----- From: "George Wilson" <george.wil...@delphix.com>


On 5/7/14, 11:46 AM, Steven Hartland wrote:
----- Original Message ----- From: "George Wilson" <george.wil...@delphix.com>

There are a couple of cases where it can work but I'm going to make it such that requires you to always return back ZIO_PIPELINE_STOP. Otherwise it's makes it too easy to introduce a programming error. For example, vdev_mirror_io_start() could return ZIO_PIPELINE_CONTINUE but vdev_disk_io_start() shouldn't.

I'll try to have a diff ready soon. I will be interested in your test results.

I'm going to give this a go but requeuing the request in the task handler
instead of processing it directly sounds like quite a waste.

Whats the objection to continuing directly with the updated zio?

It's a safety issue. If you need to change the zio then you effectively need to execute a new pipeline for that zio. If you don't want to hand this off to a different taskq then call zio_execute() instead of zio_interrupt(). For the lower layers it makes sense to call zio_interrupt() since we typically call the completion routines from the interrupt taskqs anyways.

Hi George did you get chance to have a look that this yet?

I've attached a patch, based on FreeBSD HEAD, which ensures that all paths
from zio_vdev_io_start use:
zio_interrupt(zio);
return (ZIO_PIPELINE_STOP);

instead of:
return (ZIO_PIPELINE_CONTINUE);

Along with asserting that the return from vdev_op_io_start is ZIO_PIPELINE_STOP.

Is this what you had in mind?

   Regards
   Steve

Attachment: zio-continue.patch
Description: Binary data

_______________________________________________
developer mailing list
developer@open-zfs.org
http://lists.open-zfs.org/mailman/listinfo/developer

Reply via email to