Merge tag 'net-5.12-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / md / md.c
index 0438445..21da0c4 100644 (file)
@@ -340,24 +340,6 @@ static int start_readonly;
  */
 static bool create_on_open = true;
 
-struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
-                           struct mddev *mddev)
-{
-       if (!mddev || !bioset_initialized(&mddev->bio_set))
-               return bio_alloc(gfp_mask, nr_iovecs);
-
-       return bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set);
-}
-EXPORT_SYMBOL_GPL(bio_alloc_mddev);
-
-static struct bio *md_bio_alloc_sync(struct mddev *mddev)
-{
-       if (!mddev || !bioset_initialized(&mddev->sync_set))
-               return bio_alloc(GFP_NOIO, 1);
-
-       return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set);
-}
-
 /*
  * We have a system wide 'event count' that is incremented
  * on any 'interesting' event, and readers of /proc/mdstat
@@ -463,8 +445,8 @@ struct md_io {
        struct mddev *mddev;
        bio_end_io_t *orig_bi_end_io;
        void *orig_bi_private;
+       struct block_device *orig_bi_bdev;
        unsigned long start_time;
-       struct block_device *part;
 };
 
 static void md_end_io(struct bio *bio)
@@ -472,7 +454,7 @@ static void md_end_io(struct bio *bio)
        struct md_io *md_io = bio->bi_private;
        struct mddev *mddev = md_io->mddev;
 
-       part_end_io_acct(md_io->part, bio, md_io->start_time);
+       bio_end_io_acct_remapped(bio, md_io->start_time, md_io->orig_bi_bdev);
 
        bio->bi_end_io = md_io->orig_bi_end_io;
        bio->bi_private = md_io->orig_bi_private;
@@ -486,7 +468,7 @@ static void md_end_io(struct bio *bio)
 static blk_qc_t md_submit_bio(struct bio *bio)
 {
        const int rw = bio_data_dir(bio);
-       struct mddev *mddev = bio->bi_disk->private_data;
+       struct mddev *mddev = bio->bi_bdev->bd_disk->private_data;
 
        if (mddev == NULL || mddev->pers == NULL) {
                bio_io_error(bio);
@@ -514,12 +496,12 @@ static blk_qc_t md_submit_bio(struct bio *bio)
                md_io->mddev = mddev;
                md_io->orig_bi_end_io = bio->bi_end_io;
                md_io->orig_bi_private = bio->bi_private;
+               md_io->orig_bi_bdev = bio->bi_bdev;
 
                bio->bi_end_io = md_end_io;
                bio->bi_private = md_io;
 
-               md_io->start_time = part_start_io_acct(mddev->gendisk,
-                                                      &md_io->part, bio);
+               md_io->start_time = bio_start_io_acct(bio);
        }
 
        /* bio could be mergeable after passing to underlayer */
@@ -613,7 +595,7 @@ static void submit_flushes(struct work_struct *ws)
                        atomic_inc(&rdev->nr_pending);
                        atomic_inc(&rdev->nr_pending);
                        rcu_read_unlock();
-                       bi = bio_alloc_mddev(GFP_NOIO, 0, mddev);
+                       bi = bio_alloc_bioset(GFP_NOIO, 0, &mddev->bio_set);
                        bi->bi_end_io = md_end_flush;
                        bi->bi_private = rdev;
                        bio_set_dev(bi, rdev->bdev);
@@ -999,7 +981,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
        if (test_bit(Faulty, &rdev->flags))
                return;
 
-       bio = md_bio_alloc_sync(mddev);
+       bio = bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set);
 
        atomic_inc(&rdev->nr_pending);
 
@@ -1031,29 +1013,29 @@ int md_super_wait(struct mddev *mddev)
 int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
                 struct page *page, int op, int op_flags, bool metadata_op)
 {
-       struct bio *bio = md_bio_alloc_sync(rdev->mddev);
-       int ret;
+       struct bio bio;
+       struct bio_vec bvec;
+
+       bio_init(&bio, &bvec, 1);
 
        if (metadata_op && rdev->meta_bdev)
-               bio_set_dev(bio, rdev->meta_bdev);
+               bio_set_dev(&bio, rdev->meta_bdev);
        else
-               bio_set_dev(bio, rdev->bdev);
-       bio_set_op_attrs(bio, op, op_flags);
+               bio_set_dev(&bio, rdev->bdev);
+       bio.bi_opf = op | op_flags;
        if (metadata_op)
-               bio->bi_iter.bi_sector = sector + rdev->sb_start;
+               bio.bi_iter.bi_sector = sector + rdev->sb_start;
        else if (rdev->mddev->reshape_position != MaxSector &&
                 (rdev->mddev->reshape_backwards ==
                  (sector >= rdev->mddev->reshape_position)))
-               bio->bi_iter.bi_sector = sector + rdev->new_data_offset;
+               bio.bi_iter.bi_sector = sector + rdev->new_data_offset;
        else
-               bio->bi_iter.bi_sector = sector + rdev->data_offset;
-       bio_add_page(bio, page, size, 0);
+               bio.bi_iter.bi_sector = sector + rdev->data_offset;
+       bio_add_page(&bio, page, size, 0);
 
-       submit_bio_wait(bio);
+       submit_bio_wait(&bio);
 
-       ret = !bio->bi_status;
-       bio_put(bio);
-       return ret;
+       return !bio.bi_status;
 }
 EXPORT_SYMBOL_GPL(sync_page_io);
 
@@ -2417,6 +2399,12 @@ int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
 }
 EXPORT_SYMBOL(md_integrity_add_rdev);
 
+static bool rdev_read_only(struct md_rdev *rdev)
+{
+       return bdev_read_only(rdev->bdev) ||
+               (rdev->meta_bdev && bdev_read_only(rdev->meta_bdev));
+}
+
 static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
 {
        char b[BDEVNAME_SIZE];
@@ -2426,8 +2414,7 @@ static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
        if (find_rdev(mddev, rdev->bdev->bd_dev))
                return -EEXIST;
 
-       if ((bdev_read_only(rdev->bdev) || bdev_read_only(rdev->meta_bdev)) &&
-           mddev->pers)
+       if (rdev_read_only(rdev) && mddev->pers)
                return -EROFS;
 
        /* make sure rdev->sectors exceeds mddev->dev_sectors */
@@ -5861,9 +5848,7 @@ int md_run(struct mddev *mddev)
                        continue;
                sync_blockdev(rdev->bdev);
                invalidate_bdev(rdev->bdev);
-               if (mddev->ro != 1 &&
-                   (bdev_read_only(rdev->bdev) ||
-                    bdev_read_only(rdev->meta_bdev))) {
+               if (mddev->ro != 1 && rdev_read_only(rdev)) {
                        mddev->ro = 1;
                        if (mddev->gendisk)
                                set_disk_ro(mddev->gendisk, 1);
@@ -6158,7 +6143,7 @@ static int restart_array(struct mddev *mddev)
                if (test_bit(Journal, &rdev->flags) &&
                    !test_bit(Faulty, &rdev->flags))
                        has_journal = true;
-               if (bdev_read_only(rdev->bdev))
+               if (rdev_read_only(rdev))
                        has_readonly = true;
        }
        rcu_read_unlock();