block, nvme: Introduce blk_mq_req_flags_t
authorBart Van Assche <bart.vanassche@wdc.com>
Thu, 9 Nov 2017 18:49:59 +0000 (10:49 -0800)
committerJens Axboe <axboe@kernel.dk>
Sat, 11 Nov 2017 02:53:25 +0000 (19:53 -0700)
Several block layer and NVMe core functions accept a combination
of BLK_MQ_REQ_* flags through the 'flags' argument but there is
no verification at compile time whether the right type of block
layer flags is passed. Make it possible for sparse to verify this.
This patch does not change any functionality.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Cc: linux-nvme@lists.infradead.org
Cc: Christoph Hellwig <hch@lst.de>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-core.c
block/blk-mq.c
block/blk-mq.h
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h
include/linux/blk-mq.h
include/linux/blk_types.h
include/linux/blkdev.h

index 29b08428ae459722c32a9927c8a50e6bd202a7a9..7c54c195e79e87ffc03d5ae1e12d38367e11d1f2 100644 (file)
@@ -801,7 +801,7 @@ EXPORT_SYMBOL(blk_alloc_queue);
  * @q: request queue pointer
  * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PREEMPT
  */
-int blk_queue_enter(struct request_queue *q, unsigned int flags)
+int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
 {
        const bool preempt = flags & BLK_MQ_REQ_PREEMPT;
 
@@ -1225,7 +1225,7 @@ int blk_update_nr_requests(struct request_queue *q, unsigned int nr)
  * Returns request pointer on success, with @q->queue_lock *not held*.
  */
 static struct request *__get_request(struct request_list *rl, unsigned int op,
-                                    struct bio *bio, unsigned int flags)
+                                    struct bio *bio, blk_mq_req_flags_t flags)
 {
        struct request_queue *q = rl->q;
        struct request *rq;
@@ -1408,7 +1408,7 @@ rq_starved:
  * Returns request pointer on success, with @q->queue_lock *not held*.
  */
 static struct request *get_request(struct request_queue *q, unsigned int op,
-                                  struct bio *bio, unsigned int flags)
+                                  struct bio *bio, blk_mq_req_flags_t flags)
 {
        const bool is_sync = op_is_sync(op);
        DEFINE_WAIT(wait);
@@ -1458,7 +1458,7 @@ retry:
 
 /* flags: BLK_MQ_REQ_PREEMPT and/or BLK_MQ_REQ_NOWAIT. */
 static struct request *blk_old_get_request(struct request_queue *q,
-                                          unsigned int op, unsigned int flags)
+                               unsigned int op, blk_mq_req_flags_t flags)
 {
        struct request *rq;
        gfp_t gfp_mask = flags & BLK_MQ_REQ_NOWAIT ? GFP_ATOMIC :
@@ -1495,7 +1495,7 @@ static struct request *blk_old_get_request(struct request_queue *q,
  * @flags: BLK_MQ_REQ_* flags, e.g. BLK_MQ_REQ_NOWAIT.
  */
 struct request *blk_get_request_flags(struct request_queue *q, unsigned int op,
-                                     unsigned int flags)
+                                     blk_mq_req_flags_t flags)
 {
        struct request *req;
 
@@ -2291,7 +2291,7 @@ blk_qc_t generic_make_request(struct bio *bio)
        current->bio_list = bio_list_on_stack;
        do {
                struct request_queue *q = bio->bi_disk->queue;
-               unsigned int flags = bio->bi_opf & REQ_NOWAIT ?
+               blk_mq_req_flags_t flags = bio->bi_opf & REQ_NOWAIT ?
                        BLK_MQ_REQ_NOWAIT : 0;
 
                if (likely(blk_queue_enter(q, flags) == 0)) {
index 211bc8a3e2cc48f37993fdedeee5ae9dd694f522..bfe24a5b62a360209a445cb619aa8d66465fdaf5 100644 (file)
@@ -383,7 +383,7 @@ static struct request *blk_mq_get_request(struct request_queue *q,
 }
 
 struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
-               unsigned int flags)
+               blk_mq_req_flags_t flags)
 {
        struct blk_mq_alloc_data alloc_data = { .flags = flags };
        struct request *rq;
@@ -409,7 +409,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
 EXPORT_SYMBOL(blk_mq_alloc_request);
 
 struct request *blk_mq_alloc_request_hctx(struct request_queue *q,
-               unsigned int op, unsigned int flags, unsigned int hctx_idx)
+       unsigned int op, blk_mq_req_flags_t flags, unsigned int hctx_idx)
 {
        struct blk_mq_alloc_data alloc_data = { .flags = flags };
        struct request *rq;
index 2502f40ccdc07d77abddd3c761132b441bb1f2f4..99a19c5523e2ba9b6e5525208f497ea231c5d66c 100644 (file)
@@ -111,7 +111,7 @@ static inline void blk_mq_put_ctx(struct blk_mq_ctx *ctx)
 struct blk_mq_alloc_data {
        /* input parameter */
        struct request_queue *q;
-       unsigned int flags;
+       blk_mq_req_flags_t flags;
        unsigned int shallow_depth;
 
        /* input & output parameter */
index 683d890d73fa3d27035bed062131edd624c44ef2..878d5c09d15b2905fa1ce576085fa5ecf2019cf1 100644 (file)
@@ -305,7 +305,7 @@ static void nvme_put_ns(struct nvme_ns *ns)
 }
 
 struct request *nvme_alloc_request(struct request_queue *q,
-               struct nvme_command *cmd, unsigned int flags, int qid)
+               struct nvme_command *cmd, blk_mq_req_flags_t flags, int qid)
 {
        unsigned op = nvme_is_write(cmd) ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN;
        struct request *req;
@@ -573,7 +573,8 @@ EXPORT_SYMBOL_GPL(nvme_setup_cmd);
  */
 int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
                union nvme_result *result, void *buffer, unsigned bufflen,
-               unsigned timeout, int qid, int at_head, int flags)
+               unsigned timeout, int qid, int at_head,
+               blk_mq_req_flags_t flags)
 {
        struct request *req;
        int ret;
index 7b9cc7d616b75a695e890840d86a37edf58e78ea..23b8504ace7fae584939b2ec186232d067ade22e 100644 (file)
@@ -327,14 +327,15 @@ int nvme_reinit_tagset(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set);
 
 #define NVME_QID_ANY -1
 struct request *nvme_alloc_request(struct request_queue *q,
-               struct nvme_command *cmd, unsigned int flags, int qid);
+               struct nvme_command *cmd, blk_mq_req_flags_t flags, int qid);
 blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req,
                struct nvme_command *cmd);
 int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
                void *buf, unsigned bufflen);
 int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
                union nvme_result *result, void *buffer, unsigned bufflen,
-               unsigned timeout, int qid, int at_head, int flags);
+               unsigned timeout, int qid, int at_head,
+               blk_mq_req_flags_t flags);
 int nvme_set_queue_count(struct nvme_ctrl *ctrl, int *count);
 void nvme_start_keep_alive(struct nvme_ctrl *ctrl);
 void nvme_stop_keep_alive(struct nvme_ctrl *ctrl);
index 82b56609736ab1a79a3ecf7d639de6693e5a4ad0..b326208277ee45dab02f704b2aa90dcc970237ea 100644 (file)
@@ -209,16 +209,21 @@ void blk_mq_free_request(struct request *rq);
 bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
 
 enum {
-       BLK_MQ_REQ_NOWAIT       = (1 << 0), /* return when out of requests */
-       BLK_MQ_REQ_RESERVED     = (1 << 1), /* allocate from reserved pool */
-       BLK_MQ_REQ_INTERNAL     = (1 << 2), /* allocate internal/sched tag */
-       BLK_MQ_REQ_PREEMPT      = (1 << 3), /* set RQF_PREEMPT */
+       /* return when out of requests */
+       BLK_MQ_REQ_NOWAIT       = (__force blk_mq_req_flags_t)(1 << 0),
+       /* allocate from reserved pool */
+       BLK_MQ_REQ_RESERVED     = (__force blk_mq_req_flags_t)(1 << 1),
+       /* allocate internal/sched tag */
+       BLK_MQ_REQ_INTERNAL     = (__force blk_mq_req_flags_t)(1 << 2),
+       /* set RQF_PREEMPT */
+       BLK_MQ_REQ_PREEMPT      = (__force blk_mq_req_flags_t)(1 << 3),
 };
 
 struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
-               unsigned int flags);
+               blk_mq_req_flags_t flags);
 struct request *blk_mq_alloc_request_hctx(struct request_queue *q,
-               unsigned int op, unsigned int flags, unsigned int hctx_idx);
+               unsigned int op, blk_mq_req_flags_t flags,
+               unsigned int hctx_idx);
 struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
 
 enum {
index 1b04085255fb37507ba92e3cc827b1057e88b087..13ccfc9b210ac78a2c99cecce68e1dce4eaf82fc 100644 (file)
@@ -162,6 +162,8 @@ struct bio {
  */
 #define BIO_RESET_BITS BVEC_POOL_OFFSET
 
+typedef __u32 __bitwise blk_mq_req_flags_t;
+
 /*
  * Operations and flags common to the bio and request structures.
  * We use 8 bits for encoding the operation, and the remaining 24 for flags.
index 402c9d536ae10e42d700d456f5ea39dc07b85b53..e80ea1d31343da36b808dfe9f547ad8466d8d091 100644 (file)
@@ -935,7 +935,7 @@ extern void blk_put_request(struct request *);
 extern void __blk_put_request(struct request_queue *, struct request *);
 extern struct request *blk_get_request_flags(struct request_queue *,
                                             unsigned int op,
-                                            unsigned int flags);
+                                            blk_mq_req_flags_t flags);
 extern struct request *blk_get_request(struct request_queue *, unsigned int op,
                                       gfp_t gfp_mask);
 extern void blk_requeue_request(struct request_queue *, struct request *);
@@ -959,7 +959,7 @@ extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,
 extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,
                         struct scsi_ioctl_command __user *);
 
-extern int blk_queue_enter(struct request_queue *q, unsigned int flags);
+extern int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags);
 extern void blk_queue_exit(struct request_queue *q);
 extern void blk_start_queue(struct request_queue *q);
 extern void blk_start_queue_async(struct request_queue *q);