On Wed, Jun 10, 2015 at 11:26:49AM -0400, Mike Snitzer wrote: > Unfortunately by dropping the original error (e.g. -EREMOTEIO) on the > floor (in the 'if (endio) {' branch) you're breaking the REQ_WRITE_SAME > check. I think this also happens in the old code before my patch, e.g.: static void clone_endio(struct bio *bio, int error) { int r = error; ... if (endio) { r = endio(tio->ti, bio, error); ... } if (unlikely(r == -EREMOTEIO && (bio->bi_rw & REQ_WRITE_SAME) && so we already check the return value that comes from the endio handler, not any different from my patch. In the original code r and error are basically always the same, execept after this: if (!bio_flagged(bio, BIO_UPTODATE) && !error) error = -EIO; error might be -EIO and r might be 0. Now if we take the endio branch we replace both error and r with the return value of endio for all branches that don't immediately return or BUG(). For the non endio branch we might check in REQ_WRITE_SAME branch, but r can only be -EREMOTEIO if it got that value from error, so it doesn't matter which one we test there. Based on that I'm pretty sure my prep patch is transformation that does not change behavior. -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel