Merge tag 'iwlwifi-for-john-2014-10-23' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / block / blk-merge.c
index 7788179..ba99351 100644 (file)
@@ -97,14 +97,18 @@ void blk_recalc_rq_segments(struct request *rq)
 
 void blk_recount_segments(struct request_queue *q, struct bio *bio)
 {
-       if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) &&
+       bool no_sg_merge = !!test_bit(QUEUE_FLAG_NO_SG_MERGE,
+                       &q->queue_flags);
+
+       if (no_sg_merge && !bio_flagged(bio, BIO_CLONED) &&
                        bio->bi_vcnt < queue_max_segments(q))
                bio->bi_phys_segments = bio->bi_vcnt;
        else {
                struct bio *nxt = bio->bi_next;
 
                bio->bi_next = NULL;
-               bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio, false);
+               bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio,
+                               no_sg_merge);
                bio->bi_next = nxt;
        }
 
@@ -313,7 +317,7 @@ static inline int ll_new_hw_segment(struct request_queue *q,
        if (req->nr_phys_segments + nr_phys_segs > queue_max_segments(q))
                goto no_merge;
 
-       if (bio_integrity(bio) && blk_integrity_merge_bio(q, req, bio))
+       if (blk_integrity_merge_bio(q, req, bio) == false)
                goto no_merge;
 
        /*
@@ -410,7 +414,7 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        if (total_phys_segments > queue_max_segments(q))
                return 0;
 
-       if (blk_integrity_rq(req) && blk_integrity_merge_rq(q, req, next))
+       if (blk_integrity_merge_rq(q, req, next) == false)
                return 0;
 
        /* Merge is OK... */
@@ -590,7 +594,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
                return false;
 
        /* only merge integrity protected bio into ditto rq */
-       if (bio_integrity(bio) != blk_integrity_rq(rq))
+       if (blk_integrity_merge_bio(rq->q, rq, bio) == false)
                return false;
 
        /* must be using the same buffer */