block: Implement support for WRITE SAME
[firefly-linux-kernel-4.4.55.git] / fs / bio.c
index 191b9b86c2723da019bfd0f5ec26de26d9e00cb8..f855e0e1869cc5d85ddcfb4ed612a2582ac03355 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -438,16 +438,19 @@ void __bio_clone(struct bio *bio, struct bio *bio_src)
 EXPORT_SYMBOL(__bio_clone);
 
 /**
- *     bio_clone       -       clone a bio
+ *     bio_clone_bioset -      clone a bio
  *     @bio: bio to clone
  *     @gfp_mask: allocation priority
+ *     @bs: bio_set to allocate from
  *
  *     Like __bio_clone, only also allocates the returned bio
  */
-struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
+struct bio *bio_clone_bioset(struct bio *bio, gfp_t gfp_mask,
+                            struct bio_set *bs)
 {
-       struct bio *b = bio_alloc(gfp_mask, bio->bi_max_vecs);
+       struct bio *b;
 
+       b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, bs);
        if (!b)
                return NULL;
 
@@ -466,7 +469,7 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
 
        return b;
 }
-EXPORT_SYMBOL(bio_clone);
+EXPORT_SYMBOL(bio_clone_bioset);
 
 /**
  *     bio_get_nr_vecs         - return approx number of vecs
@@ -1484,9 +1487,12 @@ struct bio_pair *bio_split(struct bio *bi, int first_sectors)
 
        bp->bv1 = bi->bi_io_vec[0];
        bp->bv2 = bi->bi_io_vec[0];
-       bp->bv2.bv_offset += first_sectors << 9;
-       bp->bv2.bv_len -= first_sectors << 9;
-       bp->bv1.bv_len = first_sectors << 9;
+
+       if (bio_is_rw(bi)) {
+               bp->bv2.bv_offset += first_sectors << 9;
+               bp->bv2.bv_len -= first_sectors << 9;
+               bp->bv1.bv_len = first_sectors << 9;
+       }
 
        bp->bio1.bi_io_vec = &bp->bv1;
        bp->bio2.bi_io_vec = &bp->bv2;