Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: add md_submit_discard_bio() for submitting discard bio

Move these logic from raid0.c to md.c, so that we can also use it in
raid10.c.

Reviewed-by: Coly Li <colyli@suse.de>
Reviewed-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Tested-by: Adrian Huang <ahuang12@lenovo.com>
Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <songliubraving@fb.com>

authored by

Xiao Ni and committed by
Song Liu
cf78408f 14d97622

+24 -12
+20
drivers/md/md.c
··· 8575 8575 8576 8576 EXPORT_SYMBOL(md_write_end); 8577 8577 8578 + /* This is used by raid0 and raid10 */ 8579 + void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, 8580 + struct bio *bio, sector_t start, sector_t size) 8581 + { 8582 + struct bio *discard_bio = NULL; 8583 + 8584 + if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, 0, 8585 + &discard_bio) || !discard_bio) 8586 + return; 8587 + 8588 + bio_chain(discard_bio, bio); 8589 + bio_clone_blkg_association(discard_bio, bio); 8590 + if (mddev->gendisk) 8591 + trace_block_bio_remap(discard_bio, 8592 + disk_devt(mddev->gendisk), 8593 + bio->bi_iter.bi_sector); 8594 + submit_bio_noacct(discard_bio); 8595 + } 8596 + EXPORT_SYMBOL_GPL(md_submit_discard_bio); 8597 + 8578 8598 /* md_allow_write(mddev) 8579 8599 * Calling this ensures that the array is marked 'active' so that writes 8580 8600 * may proceed without blocking. It is important to call this before
+2
drivers/md/md.h
··· 713 713 extern void md_done_sync(struct mddev *mddev, int blocks, int ok); 714 714 extern void md_error(struct mddev *mddev, struct md_rdev *rdev); 715 715 extern void md_finish_reshape(struct mddev *mddev); 716 + void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, 717 + struct bio *bio, sector_t start, sector_t size); 716 718 717 719 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio); 718 720 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
+2 -12
drivers/md/raid0.c
··· 477 477 478 478 for (disk = 0; disk < zone->nb_dev; disk++) { 479 479 sector_t dev_start, dev_end; 480 - struct bio *discard_bio = NULL; 481 480 struct md_rdev *rdev; 482 481 483 482 if (disk < start_disk_index) ··· 499 500 500 501 rdev = conf->devlist[(zone - conf->strip_zone) * 501 502 conf->strip_zone[0].nb_dev + disk]; 502 - if (__blkdev_issue_discard(rdev->bdev, 503 + md_submit_discard_bio(mddev, rdev, bio, 503 504 dev_start + zone->dev_start + rdev->data_offset, 504 - dev_end - dev_start, GFP_NOIO, 0, &discard_bio) || 505 - !discard_bio) 506 - continue; 507 - bio_chain(discard_bio, bio); 508 - bio_clone_blkg_association(discard_bio, bio); 509 - if (mddev->gendisk) 510 - trace_block_bio_remap(discard_bio, 511 - disk_devt(mddev->gendisk), 512 - bio->bi_iter.bi_sector); 513 - submit_bio_noacct(discard_bio); 505 + dev_end - dev_start); 514 506 } 515 507 bio_endio(bio); 516 508 }