buf->resid = bio->bi_iter.bi_size;
        buf->sector = bio->bi_iter.bi_sector;
        bio_pageinc(bio);
-       buf->bv = bio_iovec(bio);
+       buf->bv = __bio_iovec(bio);
        buf->bv_resid = buf->bv->bv_len;
        WARN_ON(buf->bv_resid == 0);
 }
 
 static void bch_generic_make_request_hack(struct bio *bio)
 {
        if (bio->bi_iter.bi_idx) {
+               int i;
+               struct bio_vec *bv;
                struct bio *clone = bio_alloc(GFP_NOIO, bio_segments(bio));
 
-               memcpy(clone->bi_io_vec,
-                      bio_iovec(bio),
-                      bio_segments(bio) * sizeof(struct bio_vec));
+               bio_for_each_segment(bv, bio, i)
+                       clone->bi_io_vec[clone->bi_vcnt++] = *bv;
 
                clone->bi_iter.bi_sector = bio->bi_iter.bi_sector;
                clone->bi_bdev          = bio->bi_bdev;
                        if (!ret)
                                return NULL;
 
-                       memcpy(ret->bi_io_vec, bio_iovec(bio),
+                       memcpy(ret->bi_io_vec, __bio_iovec(bio),
                               sizeof(struct bio_vec) * vcnt);
 
                        break;
                        if (!ret)
                                return NULL;
 
-                       memcpy(ret->bi_io_vec, bio_iovec(bio),
+                       memcpy(ret->bi_io_vec, __bio_iovec(bio),
                               sizeof(struct bio_vec) * vcnt);
 
                        ret->bi_io_vec[vcnt - 1].bv_len = nbytes;
        ret = min(ret, queue_max_sectors(q));
 
        WARN_ON(!ret);
-       ret = max_t(int, ret, bio_iovec(bio)->bv_len >> 9);
+       ret = max_t(int, ret, bio_iovec(bio).bv_len >> 9);
 
        return ret;
 }
 
                io->io_vec = io->io_vec_inline;
        else
                io->io_vec = mempool_alloc(v->vec_mempool, GFP_NOIO);
-       memcpy(io->io_vec, bio_iovec(bio),
+       memcpy(io->io_vec, __bio_iovec(bio),
               io->io_vec_size * sizeof(struct bio_vec));
 
        verity_submit_prefetch(v, io);
 
        if (sdkp->device->no_write_same)
                return BLKPREP_KILL;
 
-       BUG_ON(bio_offset(bio) || bio_iovec(bio)->bv_len != sdp->sector_size);
+       BUG_ON(bio_offset(bio) || bio_iovec(bio).bv_len != sdp->sector_size);
 
        sector >>= ilog2(sdp->sector_size) - 9;
        nr_sectors >>= ilog2(sdp->sector_size) - 9;
 
                        break;
                }
 
-               if (bytes >= bio_iovec(bio)->bv_len) {
-                       bytes -= bio_iovec(bio)->bv_len;
+               if (bytes >= bio_iovec(bio).bv_len) {
+                       bytes -= bio_iovec(bio).bv_len;
                        bio->bi_iter.bi_idx++;
                } else {
-                       bio_iovec(bio)->bv_len -= bytes;
-                       bio_iovec(bio)->bv_offset += bytes;
+                       bio_iovec(bio).bv_len -= bytes;
+                       bio_iovec(bio).bv_offset += bytes;
                        bytes = 0;
                }
        }
        unsigned src_offset, dst_offset, bytes;
        void *src_p, *dst_p;
 
-       src_bv = bio_iovec(src);
-       dst_bv = bio_iovec(dst);
+       src_bv = __bio_iovec(src);
+       dst_bv = __bio_iovec(dst);
 
        src_offset = src_bv->bv_offset;
        dst_offset = dst_bv->bv_offset;
                                if (!src)
                                        break;
 
-                               src_bv = bio_iovec(src);
+                               src_bv = __bio_iovec(src);
                        }
 
                        src_offset = src_bv->bv_offset;
                                if (!dst)
                                        break;
 
-                               dst_bv = bio_iovec(dst);
+                               dst_bv = __bio_iovec(dst);
                        }
 
                        dst_offset = dst_bv->bv_offset;
        bp->bio1.bi_iter.bi_size = first_sectors << 9;
 
        if (bi->bi_vcnt != 0) {
-               bp->bv1 = *bio_iovec(bi);
-               bp->bv2 = *bio_iovec(bi);
+               bp->bv1 = bio_iovec(bi);
+               bp->bv2 = bio_iovec(bi);
 
                if (bio_is_rw(bi)) {
                        bp->bv2.bv_offset += first_sectors << 9;
 
  * on highmem page vectors
  */
 #define bio_iovec_idx(bio, idx)        (&((bio)->bi_io_vec[(idx)]))
-#define bio_iovec(bio)         bio_iovec_idx((bio), (bio)->bi_iter.bi_idx)
-#define bio_page(bio)          bio_iovec((bio))->bv_page
-#define bio_offset(bio)                bio_iovec((bio))->bv_offset
+#define __bio_iovec(bio)       bio_iovec_idx((bio), (bio)->bi_iter.bi_idx)
+#define bio_iovec(bio)         (*__bio_iovec(bio))
+
+#define bio_page(bio)          (bio_iovec((bio)).bv_page)
+#define bio_offset(bio)                (bio_iovec((bio)).bv_offset)
 #define bio_segments(bio)      ((bio)->bi_vcnt - (bio)->bi_iter.bi_idx)
 #define bio_sectors(bio)       ((bio)->bi_iter.bi_size >> 9)
 #define bio_end_sector(bio)    ((bio)->bi_iter.bi_sector + bio_sectors((bio)))
 static inline unsigned int bio_cur_bytes(struct bio *bio)
 {
        if (bio->bi_vcnt)
-               return bio_iovec(bio)->bv_len;
+               return bio_iovec(bio).bv_len;
        else /* dataless requests such as discard */
                return bio->bi_iter.bi_size;
 }