]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/bio.c
block: Abstract out bvec iterator
[mirror_ubuntu-zesty-kernel.git] / fs / bio.c
index 33d79a4eb92d6e623aa90e2291af39b2b2689d83..a402ad6e753f68031c21ef41994a3ba5be22ac11 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -532,13 +532,13 @@ void __bio_clone(struct bio *bio, struct bio *bio_src)
         * most users will be overriding ->bi_bdev with a new target,
         * so we don't set nor calculate new physical/hw segment counts here
         */
-       bio->bi_sector = bio_src->bi_sector;
+       bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector;
        bio->bi_bdev = bio_src->bi_bdev;
        bio->bi_flags |= 1 << BIO_CLONED;
        bio->bi_rw = bio_src->bi_rw;
        bio->bi_vcnt = bio_src->bi_vcnt;
-       bio->bi_size = bio_src->bi_size;
-       bio->bi_idx = bio_src->bi_idx;
+       bio->bi_iter.bi_size = bio_src->bi_iter.bi_size;
+       bio->bi_iter.bi_idx = bio_src->bi_iter.bi_idx;
 }
 EXPORT_SYMBOL(__bio_clone);
 
@@ -612,7 +612,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
        if (unlikely(bio_flagged(bio, BIO_CLONED)))
                return 0;
 
-       if (((bio->bi_size + len) >> 9) > max_sectors)
+       if (((bio->bi_iter.bi_size + len) >> 9) > max_sectors)
                return 0;
 
        /*
@@ -635,8 +635,9 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                                           simulate merging updated prev_bvec
                                           as new bvec. */
                                        .bi_bdev = bio->bi_bdev,
-                                       .bi_sector = bio->bi_sector,
-                                       .bi_size = bio->bi_size - prev_bv_len,
+                                       .bi_sector = bio->bi_iter.bi_sector,
+                                       .bi_size = bio->bi_iter.bi_size -
+                                               prev_bv_len,
                                        .bi_rw = bio->bi_rw,
                                };
 
@@ -684,8 +685,8 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
        if (q->merge_bvec_fn) {
                struct bvec_merge_data bvm = {
                        .bi_bdev = bio->bi_bdev,
-                       .bi_sector = bio->bi_sector,
-                       .bi_size = bio->bi_size,
+                       .bi_sector = bio->bi_iter.bi_sector,
+                       .bi_size = bio->bi_iter.bi_size,
                        .bi_rw = bio->bi_rw,
                };
 
@@ -708,7 +709,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
        bio->bi_vcnt++;
        bio->bi_phys_segments++;
  done:
-       bio->bi_size += len;
+       bio->bi_iter.bi_size += len;
        return len;
 }
 
@@ -807,22 +808,22 @@ void bio_advance(struct bio *bio, unsigned bytes)
        if (bio_integrity(bio))
                bio_integrity_advance(bio, bytes);
 
-       bio->bi_sector += bytes >> 9;
-       bio->bi_size -= bytes;
+       bio->bi_iter.bi_sector += bytes >> 9;
+       bio->bi_iter.bi_size -= bytes;
 
        if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK)
                return;
 
        while (bytes) {
-               if (unlikely(bio->bi_idx >= bio->bi_vcnt)) {
+               if (unlikely(bio->bi_iter.bi_idx >= bio->bi_vcnt)) {
                        WARN_ONCE(1, "bio idx %d >= vcnt %d\n",
-                                 bio->bi_idx, bio->bi_vcnt);
+                                 bio->bi_iter.bi_idx, bio->bi_vcnt);
                        break;
                }
 
                if (bytes >= bio_iovec(bio)->bv_len) {
                        bytes -= bio_iovec(bio)->bv_len;
-                       bio->bi_idx++;
+                       bio->bi_iter.bi_idx++;
                } else {
                        bio_iovec(bio)->bv_len -= bytes;
                        bio_iovec(bio)->bv_offset += bytes;
@@ -1485,7 +1486,7 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len,
        if (IS_ERR(bio))
                return bio;
 
-       if (bio->bi_size == len)
+       if (bio->bi_iter.bi_size == len)
                return bio;
 
        /*
@@ -1763,16 +1764,16 @@ struct bio_pair *bio_split(struct bio *bi, int first_sectors)
                return bp;
 
        trace_block_split(bdev_get_queue(bi->bi_bdev), bi,
-                               bi->bi_sector + first_sectors);
+                               bi->bi_iter.bi_sector + first_sectors);
 
        BUG_ON(bio_segments(bi) > 1);
        atomic_set(&bp->cnt, 3);
        bp->error = 0;
        bp->bio1 = *bi;
        bp->bio2 = *bi;
-       bp->bio2.bi_sector += first_sectors;
-       bp->bio2.bi_size -= first_sectors << 9;
-       bp->bio1.bi_size = first_sectors << 9;
+       bp->bio2.bi_iter.bi_sector += first_sectors;
+       bp->bio2.bi_iter.bi_size -= first_sectors << 9;
+       bp->bio1.bi_iter.bi_size = first_sectors << 9;
 
        if (bi->bi_vcnt != 0) {
                bp->bv1 = *bio_iovec(bi);
@@ -1821,21 +1822,22 @@ void bio_trim(struct bio *bio, int offset, int size)
        int sofar = 0;
 
        size <<= 9;
-       if (offset == 0 && size == bio->bi_size)
+       if (offset == 0 && size == bio->bi_iter.bi_size)
                return;
 
        clear_bit(BIO_SEG_VALID, &bio->bi_flags);
 
        bio_advance(bio, offset << 9);
 
-       bio->bi_size = size;
+       bio->bi_iter.bi_size = size;
 
        /* avoid any complications with bi_idx being non-zero*/
-       if (bio->bi_idx) {
-               memmove(bio->bi_io_vec, bio->bi_io_vec+bio->bi_idx,
-                       (bio->bi_vcnt - bio->bi_idx) * sizeof(struct bio_vec));
-               bio->bi_vcnt -= bio->bi_idx;
-               bio->bi_idx = 0;
+       if (bio->bi_iter.bi_idx) {
+               memmove(bio->bi_io_vec, bio->bi_io_vec+bio->bi_iter.bi_idx,
+                       (bio->bi_vcnt - bio->bi_iter.bi_idx) *
+                       sizeof(struct bio_vec));
+               bio->bi_vcnt -= bio->bi_iter.bi_idx;
+               bio->bi_iter.bi_idx = 0;
        }
        /* Make sure vcnt and last bv are not too big */
        bio_for_each_segment(bvec, bio, i) {
@@ -1871,7 +1873,7 @@ sector_t bio_sector_offset(struct bio *bio, unsigned short index,
        sector_sz = queue_logical_block_size(bio->bi_bdev->bd_disk->queue);
        sectors = 0;
 
-       if (index >= bio->bi_idx)
+       if (index >= bio->bi_iter.bi_idx)
                index = bio->bi_vcnt - 1;
 
        bio_for_each_segment_all(bv, bio, i) {