]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/bio.c
block: Immutable bio vecs
[mirror_ubuntu-artful-kernel.git] / fs / bio.c
index 8b7f14a95503a80f5a8b13e4ddc65cf2f8d90731..07b4b7afa695d5e3cd7e5d375ba38f87e19b5176 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -532,13 +532,11 @@ 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_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_iter.bi_size = bio_src->bi_iter.bi_size;
-       bio->bi_iter.bi_idx = bio_src->bi_iter.bi_idx;
+       bio->bi_iter = bio_src->bi_iter;
 }
 EXPORT_SYMBOL(__bio_clone);
 
@@ -808,28 +806,7 @@ void bio_advance(struct bio *bio, unsigned bytes)
        if (bio_integrity(bio))
                bio_integrity_advance(bio, 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_iter.bi_idx >= bio->bi_vcnt)) {
-                       WARN_ONCE(1, "bio idx %d >= vcnt %d\n",
-                                 bio->bi_iter.bi_idx, bio->bi_vcnt);
-                       break;
-               }
-
-               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;
-                       bytes = 0;
-               }
-       }
+       bio_advance_iter(bio, &bio->bi_iter, bytes);
 }
 EXPORT_SYMBOL(bio_advance);