Merge tag 'backlight-next-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / block / blk-merge.c
index 97b7c28..808768f 100644 (file)
@@ -279,6 +279,14 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
        return NULL;
 split:
        *segs = nsegs;
+
+       /*
+        * Bio splitting may cause subtle trouble such as hang when doing sync
+        * iopoll in direct IO routine. Given performance gain of iopoll for
+        * big IO can be trival, disable iopoll when split needed.
+        */
+       bio->bi_opf &= ~REQ_HIPRI;
+
        return bio_split(bio, sectors, GFP_NOIO, bs);
 }
 
@@ -338,7 +346,7 @@ void __blk_queue_split(struct bio **bio, unsigned int *nr_segs)
                split->bi_opf |= REQ_NOMERGE;
 
                bio_chain(split, *bio);
-               trace_block_split(q, split, (*bio)->bi_iter.bi_sector);
+               trace_block_split(split, (*bio)->bi_iter.bi_sector);
                submit_bio_noacct(*bio);
                *bio = split;
        }
@@ -683,8 +691,6 @@ static void blk_account_io_merge_request(struct request *req)
                part_stat_lock();
                part_stat_inc(req->part, merges[op_stat_group(req_op(req))]);
                part_stat_unlock();
-
-               hd_struct_put(req->part);
        }
 }
 
@@ -801,7 +807,7 @@ static struct request *attempt_merge(struct request_queue *q,
         */
        blk_account_io_merge_request(next);
 
-       trace_block_rq_merge(q, next);
+       trace_block_rq_merge(next);
 
        /*
         * ownership of bio passed from next to req, return 'next' for
@@ -924,7 +930,7 @@ static enum bio_merge_status bio_attempt_back_merge(struct request *req,
        if (!ll_back_merge_fn(req, bio, nr_segs))
                return BIO_MERGE_FAILED;
 
-       trace_block_bio_backmerge(req->q, req, bio);
+       trace_block_bio_backmerge(bio);
        rq_qos_merge(req->q, req, bio);
 
        if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff)
@@ -948,7 +954,7 @@ static enum bio_merge_status bio_attempt_front_merge(struct request *req,
        if (!ll_front_merge_fn(req, bio, nr_segs))
                return BIO_MERGE_FAILED;
 
-       trace_block_bio_frontmerge(req->q, req, bio);
+       trace_block_bio_frontmerge(bio);
        rq_qos_merge(req->q, req, bio);
 
        if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff)