block: fix elevator init check
authorChristoph Hellwig <hch@lst.de>
Wed, 25 Jan 2017 10:17:11 +0000 (11:17 +0100)
committerJens Axboe <axboe@fb.com>
Fri, 27 Jan 2017 22:08:35 +0000 (15:08 -0700)
We can't initalize the elevator fields for flushes as flush share space
in struct request with the elevator data.  But currently we can't
communicate that a request is a flush through blk_get_request as we
can only pass READ or WRITE, and the low-level code looks at the
possible NULL bio to check for a flush.

Fix this by allowing to pass any block op and flags, and by checking for
the flush flags in __get_request.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-core.c

index 02833ce5664ea4e59209a93ad82ff0d1f62e8f74..4cad535592c353f9a76b1c5dde2f978ad1818ed7 100644 (file)
@@ -1022,25 +1022,6 @@ int blk_update_nr_requests(struct request_queue *q, unsigned int nr)
        return 0;
 }
 
-/*
- * Determine if elevator data should be initialized when allocating the
- * request associated with @bio.
- */
-static bool blk_rq_should_init_elevator(struct bio *bio)
-{
-       if (!bio)
-               return true;
-
-       /*
-        * Flush requests do not use the elevator so skip initialization.
-        * This allows a request to share the flush and elevator data.
-        */
-       if (op_is_flush(bio->bi_opf))
-               return false;
-
-       return true;
-}
-
 /**
  * __get_request - get a free request
  * @rl: request list to allocate from
@@ -1119,10 +1100,13 @@ static struct request *__get_request(struct request_list *rl, unsigned int op,
         * request is freed.  This guarantees icq's won't be destroyed and
         * makes creating new ones safe.
         *
+        * Flush requests do not use the elevator so skip initialization.
+        * This allows a request to share the flush and elevator data.
+        *
         * Also, lookup icq while holding queue_lock.  If it doesn't exist,
         * it will be created after releasing queue_lock.
         */
-       if (blk_rq_should_init_elevator(bio) && !blk_queue_bypass(q)) {
+       if (!op_is_flush(op) && !blk_queue_bypass(q)) {
                rq_flags |= RQF_ELVPRIV;
                q->nr_rqs_elvpriv++;
                if (et->icq_cache && ioc)
@@ -1276,8 +1260,6 @@ static struct request *blk_old_get_request(struct request_queue *q, int rw,
 {
        struct request *rq;
 
-       BUG_ON(rw != READ && rw != WRITE);
-
        /* create ioc upfront */
        create_io_context(gfp_mask, q->node);