[dm-devel] [PATCH for-4.2 2/3] block, dm: don't copy bios for request clones
Christoph Hellwig
hch at lst.de
Fri May 29 16:55:45 UTC 2015
On Wed, May 27, 2015 at 09:50:18AM +0000, Junichi Nomura wrote:
> Can you test this scenario with your patch?
> 1. Set up a multipath device with fail-over mode
> 2. Write something to the multipath device.
> After the clone request is sent to the primary path
> and before the data goes to the disk,
> down the primary path
> (e.g. echo offline > /sys/block/sdXX/device/state)
> 3. (dm-mpath will retry from the secondary path and
> the write will eventually succeed)
> 4. Verify if the written data is really on the disk
Verified as not working correctly. The patch below fixes it,
but it needs more testing and some comments:
diff --git a/block/blk-core.c b/block/blk-core.c
index aa819a5..54feaae 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -117,7 +117,13 @@ EXPORT_SYMBOL(blk_rq_init);
static void req_bio_endio(struct request *rq, struct bio *bio,
unsigned int nbytes, int error)
{
- if (error && !(rq->cmd_flags & REQ_CLONE))
+ if (rq->cmd_flags & REQ_CLONE) {
+ if (!error && test_bit(BIO_UPTODATE, &bio->bi_flags))
+ bio_advance(bio, nbytes);
+ return;
+ }
+
+ if (error)
clear_bit(BIO_UPTODATE, &bio->bi_flags);
else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
error = -EIO;
@@ -128,8 +134,7 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
bio_advance(bio, nbytes);
/* don't actually finish bio if it's part of flush sequence */
- if (bio->bi_iter.bi_size == 0 &&
- !(rq->cmd_flags & (REQ_FLUSH_SEQ|REQ_CLONE)))
+ if (bio->bi_iter.bi_size == 0 && !(rq->cmd_flags & REQ_FLUSH_SEQ))
bio_endio(bio, error);
}
More information about the dm-devel
mailing list