Skip to content

Commit 4223a5b

Browse files
committed
Merge branch 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into block-5.10
Pull MD fixes from Song: "This is to fix raid10 data corruption [1] in 5.10-rc7." * 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md: Revert "md: add md_submit_discard_bio() for submitting discard bio" Revert "md/raid10: extend r10bio devs to raid disks" Revert "md/raid10: pull codes that wait for blocked dev into one function" Revert "md/raid10: improve raid10 discard request" Revert "md/raid10: improve discard request for far layout" Revert "dm raid: remove unnecessary discard limits for raid10"
2 parents 7e7986f + 57a0f3a commit 4223a5b

File tree

6 files changed

+80
-391
lines changed

6 files changed

+80
-391
lines changed

drivers/md/dm-raid.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3728,6 +3728,17 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)
37283728

37293729
blk_limits_io_min(limits, chunk_size_bytes);
37303730
blk_limits_io_opt(limits, chunk_size_bytes * mddev_data_stripes(rs));
3731+
3732+
/*
3733+
* RAID10 personality requires bio splitting,
3734+
* RAID0/1/4/5/6 don't and process large discard bios properly.
3735+
*/
3736+
if (rs_is_raid10(rs)) {
3737+
limits->discard_granularity = max(chunk_size_bytes,
3738+
limits->discard_granularity);
3739+
limits->max_discard_sectors = min_not_zero(rs->md.chunk_sectors,
3740+
limits->max_discard_sectors);
3741+
}
37313742
}
37323743

37333744
static void raid_postsuspend(struct dm_target *ti)

drivers/md/md.c

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8582,26 +8582,6 @@ void md_write_end(struct mddev *mddev)
85828582

85838583
EXPORT_SYMBOL(md_write_end);
85848584

8585-
/* This is used by raid0 and raid10 */
8586-
void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
8587-
struct bio *bio, sector_t start, sector_t size)
8588-
{
8589-
struct bio *discard_bio = NULL;
8590-
8591-
if (__blkdev_issue_discard(rdev->bdev, start, size,
8592-
GFP_NOIO, 0, &discard_bio) || !discard_bio)
8593-
return;
8594-
8595-
bio_chain(discard_bio, bio);
8596-
bio_clone_blkg_association(discard_bio, bio);
8597-
if (mddev->gendisk)
8598-
trace_block_bio_remap(bdev_get_queue(rdev->bdev),
8599-
discard_bio, disk_devt(mddev->gendisk),
8600-
bio->bi_iter.bi_sector);
8601-
submit_bio_noacct(discard_bio);
8602-
}
8603-
EXPORT_SYMBOL(md_submit_discard_bio);
8604-
86058585
/* md_allow_write(mddev)
86068586
* Calling this ensures that the array is marked 'active' so that writes
86078587
* may proceed without blocking. It is important to call this before

drivers/md/md.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,8 +713,6 @@ extern void md_write_end(struct mddev *mddev);
713713
extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
714714
extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
715715
extern void md_finish_reshape(struct mddev *mddev);
716-
extern void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
717-
struct bio *bio, sector_t start, sector_t size);
718716

719717
extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
720718
extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,

drivers/md/raid0.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
477477

478478
for (disk = 0; disk < zone->nb_dev; disk++) {
479479
sector_t dev_start, dev_end;
480+
struct bio *discard_bio = NULL;
480481
struct md_rdev *rdev;
481482

482483
if (disk < start_disk_index)
@@ -499,9 +500,18 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
499500

500501
rdev = conf->devlist[(zone - conf->strip_zone) *
501502
conf->strip_zone[0].nb_dev + disk];
502-
md_submit_discard_bio(mddev, rdev, bio,
503+
if (__blkdev_issue_discard(rdev->bdev,
503504
dev_start + zone->dev_start + rdev->data_offset,
504-
dev_end - dev_start);
505+
dev_end - dev_start, GFP_NOIO, 0, &discard_bio) ||
506+
!discard_bio)
507+
continue;
508+
bio_chain(discard_bio, bio);
509+
bio_clone_blkg_association(discard_bio, bio);
510+
if (mddev->gendisk)
511+
trace_block_bio_remap(bdev_get_queue(rdev->bdev),
512+
discard_bio, disk_devt(mddev->gendisk),
513+
bio->bi_iter.bi_sector);
514+
submit_bio_noacct(discard_bio);
505515
}
506516
bio_endio(bio);
507517
}

0 commit comments

Comments
 (0)