|
@@ -742,9 +742,14 @@ static void flush_pending_writes(struct r1conf *conf)
|
|
|
|
|
|
while (bio) { /* submit pending writes */
|
|
|
struct bio *next = bio->bi_next;
|
|
|
+ struct md_rdev *rdev = (void*)bio->bi_bdev;
|
|
|
bio->bi_next = NULL;
|
|
|
- if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
|
|
|
- !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
|
|
|
+ bio->bi_bdev = rdev->bdev;
|
|
|
+ if (test_bit(Faulty, &rdev->flags)) {
|
|
|
+ bio->bi_error = -EIO;
|
|
|
+ bio_endio(bio);
|
|
|
+ } else if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
|
|
|
+ !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
|
|
|
/* Just ignore it */
|
|
|
bio_endio(bio);
|
|
|
else
|
|
@@ -1016,9 +1021,14 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule)
|
|
|
|
|
|
while (bio) { /* submit pending writes */
|
|
|
struct bio *next = bio->bi_next;
|
|
|
+ struct md_rdev *rdev = (void*)bio->bi_bdev;
|
|
|
bio->bi_next = NULL;
|
|
|
- if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
|
|
|
- !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
|
|
|
+ bio->bi_bdev = rdev->bdev;
|
|
|
+ if (test_bit(Faulty, &rdev->flags)) {
|
|
|
+ bio->bi_error = -EIO;
|
|
|
+ bio_endio(bio);
|
|
|
+ } else if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
|
|
|
+ !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
|
|
|
/* Just ignore it */
|
|
|
bio_endio(bio);
|
|
|
else
|
|
@@ -1357,7 +1367,7 @@ read_again:
|
|
|
|
|
|
mbio->bi_iter.bi_sector = (r1_bio->sector +
|
|
|
conf->mirrors[i].rdev->data_offset);
|
|
|
- mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
|
|
|
+ mbio->bi_bdev = (void*)conf->mirrors[i].rdev;
|
|
|
mbio->bi_end_io = raid1_end_write_request;
|
|
|
bio_set_op_attrs(mbio, op, do_flush_fua | do_sync);
|
|
|
mbio->bi_private = r1_bio;
|