Skip to content

Commit d2360a3

Browse files
committed
Merge tag 'block-5.10-2020-12-12' of git://git.kernel.dk/linux-block
Pull block fixes from Jens Axboe: "This should be it for 5.10. Mike and Song looked into the warning case, and thankfully it appears the fix was pretty trivial - we can just change the md device chunk type to unsigned int to get rid of it. They cannot currently be < 0, and nobody is checking for that either. We're reverting the discard changes as the corruption reports came in very late, and there's just no time to attempt to deal with it at this point. Reverting the changes in question is the right call for 5.10" * tag 'block-5.10-2020-12-12' of git://git.kernel.dk/linux-block: md: change mddev 'chunk_sectors' from int to unsigned 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 6bff9bb + 6ffeb1c commit d2360a3

File tree

6 files changed

+82
-393
lines changed

6 files changed

+82
-393
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: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ struct mddev {
311311
int external; /* metadata is
312312
* managed externally */
313313
char metadata_type[17]; /* externally set*/
314-
int chunk_sectors;
314+
unsigned int chunk_sectors;
315315
time64_t ctime, utime;
316316
int level, layout;
317317
char clevel[16];
@@ -339,7 +339,7 @@ struct mddev {
339339
*/
340340
sector_t reshape_position;
341341
int delta_disks, new_level, new_layout;
342-
int new_chunk_sectors;
342+
unsigned int new_chunk_sectors;
343343
int reshape_backwards;
344344

345345
struct md_thread *thread; /* management thread */
@@ -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)