Skip to content

Commit 2648381

Browse files
committed
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>
1 parent e33fbb9 commit 2648381

File tree

4 files changed

+10
-0
lines changed

4 files changed

+10
-0
lines changed

drivers/md/linear.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio)
291291
trace_block_bio_remap(bdev_get_queue(split->bi_bdev),
292292
split, disk_devt(mddev->gendisk),
293293
bio_sector);
294+
mddev_check_writesame(mddev, split);
294295
generic_make_request(split);
295296
}
296297
} while (split != bio);

drivers/md/md.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,4 +710,11 @@ static inline void mddev_clear_unsupported_flags(struct mddev *mddev,
710710
{
711711
mddev->flags &= ~unsupported_flags;
712712
}
713+
714+
static inline void mddev_check_writesame(struct mddev *mddev, struct bio *bio)
715+
{
716+
if (bio_op(bio) == REQ_OP_WRITE_SAME &&
717+
!bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)
718+
mddev->queue->limits.max_write_same_sectors = 0;
719+
}
713720
#endif /* _MD_MD_H */

drivers/md/multipath.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio)
138138
mp_bh->bio.bi_opf |= REQ_FAILFAST_TRANSPORT;
139139
mp_bh->bio.bi_end_io = multipath_end_request;
140140
mp_bh->bio.bi_private = mp_bh;
141+
mddev_check_writesame(mddev, &mp_bh->bio);
141142
generic_make_request(&mp_bh->bio);
142143
return;
143144
}

drivers/md/raid0.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio)
503503
trace_block_bio_remap(bdev_get_queue(split->bi_bdev),
504504
split, disk_devt(mddev->gendisk),
505505
bio_sector);
506+
mddev_check_writesame(mddev, split);
506507
generic_make_request(split);
507508
}
508509
} while (split != bio);

0 commit comments

Comments
 (0)