mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 00:06:36 +00:00
md: disable WRITE SAME if it fails in underlayer disks
This makes md do the same thing as dm for write same IO failure. Please see 7eee4ae(dm: disable WRITE SAME if it fails) for details why we need this. We did a little bit different than dm. Instead of disabling writesame in the first IO error, we disable it till next writesame IO coming after the first IO error. This way we don't need to clone a bio. Also reported here: https://bugzilla.kernel.org/show_bug.cgi?id=118581 Suggested-by: NeilBrown <neilb@suse.com> Acked-by: NeilBrown <neilb@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
This commit is contained in:
parent
e33fbb9cc7
commit
26483819f8
4 changed files with 10 additions and 0 deletions
|
@ -291,6 +291,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio)
|
|||
trace_block_bio_remap(bdev_get_queue(split->bi_bdev),
|
||||
split, disk_devt(mddev->gendisk),
|
||||
bio_sector);
|
||||
mddev_check_writesame(mddev, split);
|
||||
generic_make_request(split);
|
||||
}
|
||||
} while (split != bio);
|
||||
|
|
|
@ -710,4 +710,11 @@ static inline void mddev_clear_unsupported_flags(struct mddev *mddev,
|
|||
{
|
||||
mddev->flags &= ~unsupported_flags;
|
||||
}
|
||||
|
||||
static inline void mddev_check_writesame(struct mddev *mddev, struct bio *bio)
|
||||
{
|
||||
if (bio_op(bio) == REQ_OP_WRITE_SAME &&
|
||||
!bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)
|
||||
mddev->queue->limits.max_write_same_sectors = 0;
|
||||
}
|
||||
#endif /* _MD_MD_H */
|
||||
|
|
|
@ -138,6 +138,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio)
|
|||
mp_bh->bio.bi_opf |= REQ_FAILFAST_TRANSPORT;
|
||||
mp_bh->bio.bi_end_io = multipath_end_request;
|
||||
mp_bh->bio.bi_private = mp_bh;
|
||||
mddev_check_writesame(mddev, &mp_bh->bio);
|
||||
generic_make_request(&mp_bh->bio);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -503,6 +503,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio)
|
|||
trace_block_bio_remap(bdev_get_queue(split->bi_bdev),
|
||||
split, disk_devt(mddev->gendisk),
|
||||
bio_sector);
|
||||
mddev_check_writesame(mddev, split);
|
||||
generic_make_request(split);
|
||||
}
|
||||
} while (split != bio);
|
||||
|
|
Loading…
Add table
Reference in a new issue