Revert "md: add md_submit_discard_bio() for submitting discard bio"
authorSong Liu <songliubraving@fb.com>
Wed, 9 Dec 2020 19:44:42 +0000 (11:44 -0800)
committerSong Liu <songliubraving@fb.com>
Thu, 10 Dec 2020 04:46:01 +0000 (20:46 -0800)
This reverts commit 2628089b74d5a64bd0bcb5d247a18f78d7b6f4d0.

Matthew Ruffell reported data corruption in raid10 due to the changes
in discard handling [1]. Revert these changes before we find a proper fix.

[1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
Cc: Matthew Ruffell <matthew.ruffell@canonical.com>
Cc: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
drivers/md/md.c
drivers/md/md.h
drivers/md/raid0.c

index 98bac4f..0037c6e 100644 (file)
@@ -8582,26 +8582,6 @@ void md_write_end(struct mddev *mddev)
 
 EXPORT_SYMBOL(md_write_end);
 
-/* This is used by raid0 and raid10 */
-void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
-                       struct bio *bio, sector_t start, sector_t size)
-{
-       struct bio *discard_bio = NULL;
-
-       if (__blkdev_issue_discard(rdev->bdev, start, size,
-               GFP_NOIO, 0, &discard_bio) || !discard_bio)
-               return;
-
-       bio_chain(discard_bio, bio);
-       bio_clone_blkg_association(discard_bio, bio);
-       if (mddev->gendisk)
-               trace_block_bio_remap(bdev_get_queue(rdev->bdev),
-                       discard_bio, disk_devt(mddev->gendisk),
-                       bio->bi_iter.bi_sector);
-       submit_bio_noacct(discard_bio);
-}
-EXPORT_SYMBOL(md_submit_discard_bio);
-
 /* md_allow_write(mddev)
  * Calling this ensures that the array is marked 'active' so that writes
  * may proceed without blocking.  It is important to call this before
index ccfb698..2175a5a 100644 (file)
@@ -713,8 +713,6 @@ extern void md_write_end(struct mddev *mddev);
 extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
 extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
 extern void md_finish_reshape(struct mddev *mddev);
-extern void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
-                       struct bio *bio, sector_t start, sector_t size);
 
 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
index 6f44177..35843df 100644 (file)
@@ -477,6 +477,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
 
        for (disk = 0; disk < zone->nb_dev; disk++) {
                sector_t dev_start, dev_end;
+               struct bio *discard_bio = NULL;
                struct md_rdev *rdev;
 
                if (disk < start_disk_index)
@@ -499,9 +500,18 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
 
                rdev = conf->devlist[(zone - conf->strip_zone) *
                        conf->strip_zone[0].nb_dev + disk];
-               md_submit_discard_bio(mddev, rdev, bio,
+               if (__blkdev_issue_discard(rdev->bdev,
                        dev_start + zone->dev_start + rdev->data_offset,
-                       dev_end - dev_start);
+                       dev_end - dev_start, GFP_NOIO, 0, &discard_bio) ||
+                   !discard_bio)
+                       continue;
+               bio_chain(discard_bio, bio);
+               bio_clone_blkg_association(discard_bio, bio);
+               if (mddev->gendisk)
+                       trace_block_bio_remap(bdev_get_queue(rdev->bdev),
+                               discard_bio, disk_devt(mddev->gendisk),
+                               bio->bi_iter.bi_sector);
+               submit_bio_noacct(discard_bio);
        }
        bio_endio(bio);
 }