smb311: Add support for lookup with posix extensions query info
[linux-2.6-microblaze.git] / block / blk-merge.c
index 25f5a5e..f0b0bae 100644 (file)
@@ -336,16 +336,6 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
                /* there isn't chance to merge the splitted bio */
                split->bi_opf |= REQ_NOMERGE;
 
-               /*
-                * Since we're recursing into make_request here, ensure
-                * that we mark this bio as already having entered the queue.
-                * If not, and the queue is going away, we can get stuck
-                * forever on waiting for the queue reference to drop. But
-                * that will never happen, as we're already holding a
-                * reference to it.
-                */
-               bio_set_flag(*bio, BIO_QUEUE_ENTERED);
-
                bio_chain(split, *bio);
                trace_block_split(q, split, (*bio)->bi_iter.bi_sector);
                generic_make_request(*bio);
@@ -531,14 +521,6 @@ int __blk_rq_map_sg(struct request_queue *q, struct request *rq,
        else if (rq->bio)
                nsegs = __blk_bios_map_sg(q, rq->bio, sglist, last_sg);
 
-       if (blk_rq_bytes(rq) && (blk_rq_bytes(rq) & q->dma_pad_mask)) {
-               unsigned int pad_len =
-                       (q->dma_pad_mask & ~blk_rq_bytes(rq)) + 1;
-
-               (*last_sg)->length += pad_len;
-               rq->extra_len += pad_len;
-       }
-
        if (*last_sg)
                sg_mark_end(*last_sg);
 
@@ -580,6 +562,8 @@ int ll_back_merge_fn(struct request *req, struct bio *bio, unsigned int nr_segs)
        if (blk_integrity_rq(req) &&
            integrity_req_gap_back_merge(req, bio))
                return 0;
+       if (!bio_crypt_ctx_back_mergeable(req, bio))
+               return 0;
        if (blk_rq_sectors(req) + bio_sectors(bio) >
            blk_rq_get_max_sectors(req, blk_rq_pos(req))) {
                req_set_nomerge(req->q, req);
@@ -596,6 +580,8 @@ int ll_front_merge_fn(struct request *req, struct bio *bio, unsigned int nr_segs
        if (blk_integrity_rq(req) &&
            integrity_req_gap_front_merge(req, bio))
                return 0;
+       if (!bio_crypt_ctx_front_mergeable(req, bio))
+               return 0;
        if (blk_rq_sectors(req) + bio_sectors(bio) >
            blk_rq_get_max_sectors(req, bio->bi_iter.bi_sector)) {
                req_set_nomerge(req->q, req);
@@ -645,6 +631,9 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        if (blk_integrity_merge_rq(q, req, next) == false)
                return 0;
 
+       if (!bio_crypt_ctx_merge_rq(req, next))
+               return 0;
+
        /* Merge is OK... */
        req->nr_phys_segments = total_phys_segments;
        return 1;
@@ -680,20 +669,17 @@ void blk_rq_set_mixed_merge(struct request *rq)
        rq->rq_flags |= RQF_MIXED_MERGE;
 }
 
-static void blk_account_io_merge(struct request *req)
+static void blk_account_io_merge_request(struct request *req)
 {
        if (blk_do_io_stat(req)) {
-               struct hd_struct *part;
-
                part_stat_lock();
-               part = req->part;
-
-               part_dec_in_flight(req->q, part, rq_data_dir(req));
-
-               hd_struct_put(part);
+               part_stat_inc(req->part, merges[op_stat_group(req_op(req))]);
                part_stat_unlock();
+
+               hd_struct_put(req->part);
        }
 }
+
 /*
  * Two cases of handling DISCARD merge:
  * If max_discard_segments > 1, the driver takes every bio
@@ -805,7 +791,7 @@ static struct request *attempt_merge(struct request_queue *q,
        /*
         * 'next' is going away, so update stats accordingly
         */
-       blk_account_io_merge(next);
+       blk_account_io_merge_request(next);
 
        /*
         * ownership of bio passed from next to req, return 'next' for
@@ -869,6 +855,10 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
        if (blk_integrity_merge_bio(rq->q, rq, bio) == false)
                return false;
 
+       /* Only merge if the crypt contexts are compatible */
+       if (!bio_crypt_rq_ctx_compatible(rq, bio))
+               return false;
+
        /* must be using the same buffer */
        if (req_op(rq) == REQ_OP_WRITE_SAME &&
            !blk_write_same_mergeable(rq->bio, bio))