scsi: blk-mq: Return budget token from .get_budget callback
[linux-2.6-microblaze.git] / include / linux / blk-mq.h
index d705b17..3bd3ee6 100644 (file)
@@ -140,10 +140,6 @@ struct blk_mq_hw_ctx {
         * shared across request queues.
         */
        atomic_t                nr_active;
-       /**
-        * @elevator_queued: Number of queued requests on hctx.
-        */
-       atomic_t                elevator_queued;
 
        /** @cpuhp_online: List to store request if CPU is going to die */
        struct hlist_node       cpuhp_online;
@@ -310,12 +306,21 @@ struct blk_mq_ops {
         * reserved budget. Also we have to handle failure case
         * of .get_budget for avoiding I/O deadlock.
         */
-       bool (*get_budget)(struct request_queue *);
+       int (*get_budget)(struct request_queue *);
 
        /**
         * @put_budget: Release the reserved budget.
         */
-       void (*put_budget)(struct request_queue *);
+       void (*put_budget)(struct request_queue *, int);
+
+       /*
+        * @set_rq_budget_toekn: store rq's budget token
+        */
+       void (*set_rq_budget_token)(struct request *, int);
+       /*
+        * @get_rq_budget_toekn: retrieve rq's budget token
+        */
+       int (*get_rq_budget_token)(struct request *);
 
        /**
         * @timeout: Called on request timeout.
@@ -494,6 +499,18 @@ static inline int blk_mq_request_completed(struct request *rq)
        return blk_mq_rq_state(rq) == MQ_RQ_COMPLETE;
 }
 
+/*
+ * 
+ * Set the state to complete when completing a request from inside ->queue_rq.
+ * This is used by drivers that want to ensure special complete actions that
+ * need access to the request are called on failure, e.g. by nvme for
+ * multipathing.
+ */
+static inline void blk_mq_set_request_complete(struct request *rq)
+{
+       WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);
+}
+
 void blk_mq_start_request(struct request *rq);
 void blk_mq_end_request(struct request *rq, blk_status_t error);
 void __blk_mq_end_request(struct request *rq, blk_status_t error);
@@ -602,8 +619,8 @@ static inline void blk_rq_bio_prep(struct request *rq, struct bio *bio,
        rq->bio = rq->biotail = bio;
        rq->ioprio = bio_prio(bio);
 
-       if (bio->bi_disk)
-               rq->rq_disk = bio->bi_disk;
+       if (bio->bi_bdev)
+               rq->rq_disk = bio->bi_bdev->bd_disk;
 }
 
 blk_qc_t blk_mq_submit_bio(struct bio *bio);