smb311: Add support for lookup with posix extensions query info
[linux-2.6-microblaze.git] / block / blk-merge.c
index a04e991..f0b0bae 100644 (file)
@@ -562,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);
@@ -578,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);
@@ -627,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;
@@ -662,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
@@ -787,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
@@ -851,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))