Merge branch 'for-linus-4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / volumes.c
index 644e070b3bd24657e676556a68f042becead03bb..6fc735869c186c35fb79fa66decc7d3519ed2e93 100644 (file)
@@ -5737,23 +5737,23 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
        return 0;
 }
 
-static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio, int err)
+static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio)
 {
        bio->bi_private = bbio->private;
        bio->bi_end_io = bbio->end_io;
-       bio_endio(bio, err);
+       bio_endio(bio);
 
        btrfs_put_bbio(bbio);
 }
 
-static void btrfs_end_bio(struct bio *bio, int err)
+static void btrfs_end_bio(struct bio *bio)
 {
        struct btrfs_bio *bbio = bio->bi_private;
        int is_orig_bio = 0;
 
-       if (err) {
+       if (bio->bi_error) {
                atomic_inc(&bbio->error);
-               if (err == -EIO || err == -EREMOTEIO) {
+               if (bio->bi_error == -EIO || bio->bi_error == -EREMOTEIO) {
                        unsigned int stripe_index =
                                btrfs_io_bio(bio)->stripe_index;
                        struct btrfs_device *dev;
@@ -5791,17 +5791,16 @@ static void btrfs_end_bio(struct bio *bio, int err)
                 * beyond the tolerance of the btrfs bio
                 */
                if (atomic_read(&bbio->error) > bbio->max_errors) {
-                       err = -EIO;
+                       bio->bi_error = -EIO;
                } else {
                        /*
                         * this bio is actually up to date, we didn't
                         * go over the max number of errors
                         */
-                       set_bit(BIO_UPTODATE, &bio->bi_flags);
-                       err = 0;
+                       bio->bi_error = 0;
                }
 
-               btrfs_end_bbio(bbio, bio, err);
+               btrfs_end_bbio(bbio, bio);
        } else if (!is_orig_bio) {
                bio_put(bio);
        }
@@ -5822,7 +5821,7 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root,
        struct btrfs_pending_bios *pending_bios;
 
        if (device->missing || !device->bdev) {
-               bio_endio(bio, -EIO);
+               bio_io_error(bio);
                return;
        }
 
@@ -5867,34 +5866,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_root *root,
                                 &device->work);
 }
 
-static int bio_size_ok(struct block_device *bdev, struct bio *bio,
-                      sector_t sector)
-{
-       struct bio_vec *prev;
-       struct request_queue *q = bdev_get_queue(bdev);
-       unsigned int max_sectors = queue_max_sectors(q);
-       struct bvec_merge_data bvm = {
-               .bi_bdev = bdev,
-               .bi_sector = sector,
-               .bi_rw = bio->bi_rw,
-       };
-
-       if (WARN_ON(bio->bi_vcnt == 0))
-               return 1;
-
-       prev = &bio->bi_io_vec[bio->bi_vcnt - 1];
-       if (bio_sectors(bio) > max_sectors)
-               return 0;
-
-       if (!q->merge_bvec_fn)
-               return 1;
-
-       bvm.bi_size = bio->bi_iter.bi_size - prev->bv_len;
-       if (q->merge_bvec_fn(q, &bvm, prev) < prev->bv_len)
-               return 0;
-       return 1;
-}
-
 static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio,
                              struct bio *bio, u64 physical, int dev_nr,
                              int rw, int async)
@@ -5928,48 +5899,6 @@ static void submit_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio,
                btrfsic_submit_bio(rw, bio);
 }
 
-static int breakup_stripe_bio(struct btrfs_root *root, struct btrfs_bio *bbio,
-                             struct bio *first_bio, struct btrfs_device *dev,
-                             int dev_nr, int rw, int async)
-{
-       struct bio_vec *bvec = first_bio->bi_io_vec;
-       struct bio *bio;
-       int nr_vecs = bio_get_nr_vecs(dev->bdev);
-       u64 physical = bbio->stripes[dev_nr].physical;
-
-again:
-       bio = btrfs_bio_alloc(dev->bdev, physical >> 9, nr_vecs, GFP_NOFS);
-       if (!bio)
-               return -ENOMEM;
-
-#ifdef CONFIG_BLK_CGROUP
-       if (first_bio->bi_ioc) {
-               get_io_context_active(first_bio->bi_ioc);
-               bio->bi_ioc = first_bio->bi_ioc;
-       }
-       if (first_bio->bi_css) {
-               css_get(first_bio->bi_css);
-               bio->bi_css = first_bio->bi_css;
-       }
-#endif
-       while (bvec <= (first_bio->bi_io_vec + first_bio->bi_vcnt - 1)) {
-               if (bio_add_page(bio, bvec->bv_page, bvec->bv_len,
-                                bvec->bv_offset) < bvec->bv_len) {
-                       u64 len = bio->bi_iter.bi_size;
-
-                       atomic_inc(&bbio->stripes_pending);
-                       submit_stripe_bio(root, bbio, bio, physical, dev_nr,
-                                         rw, async);
-                       physical += len;
-                       goto again;
-               }
-               bvec++;
-       }
-
-       submit_stripe_bio(root, bbio, bio, physical, dev_nr, rw, async);
-       return 0;
-}
-
 static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical)
 {
        atomic_inc(&bbio->error);
@@ -5979,8 +5908,8 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical)
 
                btrfs_io_bio(bio)->mirror_num = bbio->mirror_num;
                bio->bi_iter.bi_sector = logical >> 9;
-
-               btrfs_end_bbio(bbio, bio, -EIO);
+               bio->bi_error = -EIO;
+               btrfs_end_bbio(bbio, bio);
        }
 }
 
@@ -6042,18 +5971,6 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio,
                        continue;
                }
 
-               /*
-                * Check and see if we're ok with this bio based on it's size
-                * and offset with the given device.
-                */
-               if (!bio_size_ok(dev->bdev, first_bio,
-                                bbio->stripes[dev_nr].physical >> 9)) {
-                       ret = breakup_stripe_bio(root, bbio, first_bio, dev,
-                                                dev_nr, rw, async_submit);
-                       BUG_ON(ret);
-                       continue;
-               }
-
                if (dev_nr < total_devs - 1) {
                        bio = btrfs_bio_clone(first_bio, GFP_NOFS);
                        BUG_ON(!bio); /* -ENOMEM */