]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/block/xen-blkfront.c
block: Consolidate duplicated bio_trim() implementations
[mirror_ubuntu-zesty-kernel.git] / drivers / block / xen-blkfront.c
index a4660bbee8a6279bd4cc1a6def776ddc85bcf169..8d53ed29360688b243d90ce34de209afa00174ed 100644 (file)
@@ -1336,57 +1336,6 @@ static int blkfront_probe(struct xenbus_device *dev,
        return 0;
 }
 
-/*
- * This is a clone of md_trim_bio, used to split a bio into smaller ones
- */
-static void trim_bio(struct bio *bio, int offset, int size)
-{
-       /* 'bio' is a cloned bio which we need to trim to match
-        * the given offset and size.
-        * This requires adjusting bi_sector, bi_size, and bi_io_vec
-        */
-       int i;
-       struct bio_vec *bvec;
-       int sofar = 0;
-
-       size <<= 9;
-       if (offset == 0 && size == bio->bi_size)
-               return;
-
-       bio->bi_sector += offset;
-       bio->bi_size = size;
-       offset <<= 9;
-       clear_bit(BIO_SEG_VALID, &bio->bi_flags);
-
-       while (bio->bi_idx < bio->bi_vcnt &&
-              bio->bi_io_vec[bio->bi_idx].bv_len <= offset) {
-               /* remove this whole bio_vec */
-               offset -= bio->bi_io_vec[bio->bi_idx].bv_len;
-               bio->bi_idx++;
-       }
-       if (bio->bi_idx < bio->bi_vcnt) {
-               bio->bi_io_vec[bio->bi_idx].bv_offset += offset;
-               bio->bi_io_vec[bio->bi_idx].bv_len -= offset;
-       }
-       /* 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;
-       }
-       /* Make sure vcnt and last bv are not too big */
-       bio_for_each_segment(bvec, bio, i) {
-               if (sofar + bvec->bv_len > size)
-                       bvec->bv_len = size - sofar;
-               if (bvec->bv_len == 0) {
-                       bio->bi_vcnt = i;
-                       break;
-               }
-               sofar += bvec->bv_len;
-       }
-}
-
 static void split_bio_end(struct bio *bio, int error)
 {
        struct split_bio *split_bio = bio->bi_private;
@@ -1522,7 +1471,7 @@ static int blkif_recover(struct blkfront_info *info)
                                           (unsigned int)(bio->bi_size >> 9) - offset);
                                cloned_bio = bio_clone(bio, GFP_NOIO);
                                BUG_ON(cloned_bio == NULL);
-                               trim_bio(cloned_bio, offset, size);
+                               bio_trim(cloned_bio, offset, size);
                                cloned_bio->bi_private = split_bio;
                                cloned_bio->bi_end_io = split_bio_end;
                                submit_bio(cloned_bio->bi_rw, cloned_bio);