X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmd%2Fmultipath.c;h=a9df710daa524fb99de4ebc55bf13c7e53edd910;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=3d8790135a058a90e9a5a4357d75adc9e5debc42;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 3d8790135..a9df710da 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -120,7 +120,7 @@ int multipath_end_request(struct bio *bio, unsigned int bytes_done, int error) if (uptodate) multipath_end_bh_io(mp_bh, uptodate); - else { + else if ((bio->bi_rw & (1 << BIO_RW_AHEAD)) == 0) { /* * oops, IO error: */ @@ -130,7 +130,8 @@ int multipath_end_request(struct bio *bio, unsigned int bytes_done, int error) bdevname(rdev->bdev,b), (unsigned long long)bio->bi_sector); multipath_reschedule_retry(mp_bh); - } + } else + multipath_end_bh_io(mp_bh, 0); rdev_dec_pending(rdev, conf->mddev); return 0; } @@ -382,7 +383,11 @@ static void multipathd (mddev_t *mddev) " to another IO path\n", bdevname(bio->bi_bdev,b), (unsigned long long)bio->bi_sector); + *bio = *(mp_bh->master_bio); bio->bi_bdev = conf->multipaths[mp_bh->path].rdev->bdev; + bio->bi_rw |= (1 << BIO_RW_FAILFAST); + bio->bi_end_io = multipath_end_request; + bio->bi_private = mp_bh; generic_make_request(bio); } }