I recently spent some time tracking down why Smatch wasn't parsing nvme_put_ctrl() correctly. It turned out the problem is that it's declared as both inline and not inline so Smatch never parses it. drivers/nvme/host/nvme.h 472 static inline void nvme_get_ctrl(struct nvme_ctrl *ctrl) 473 { 474 get_device(ctrl->device); 475 } 476 477 static inline void nvme_put_ctrl(struct nvme_ctrl *ctrl) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It's an inline here. 478 { 479 put_device(ctrl->device); 480 } 481 482 static inline bool nvme_is_aen_req(u16 qid, __u16 command_id) 483 { 484 return !qid && command_id >= NVME_AQ_BLK_MQ_DEPTH; 485 } 486 487 void nvme_complete_rq(struct request *req); 488 bool nvme_cancel_request(struct request *req, void *data, bool reserved); 489 bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl, 490 enum nvme_ctrl_state new_state); 491 bool nvme_wait_reset(struct nvme_ctrl *ctrl); 492 int nvme_disable_ctrl(struct nvme_ctrl *ctrl); 493 int nvme_enable_ctrl(struct nvme_ctrl *ctrl); 494 int nvme_shutdown_ctrl(struct nvme_ctrl *ctrl); 495 int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev, 496 const struct nvme_ctrl_ops *ops, unsigned long quirks); 497 void nvme_uninit_ctrl(struct nvme_ctrl *ctrl); 498 void nvme_start_ctrl(struct nvme_ctrl *ctrl); 499 void nvme_stop_ctrl(struct nvme_ctrl *ctrl); 500 void nvme_put_ctrl(struct nvme_ctrl *ctrl); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ But then it's re-declared as not inline. 501 int nvme_init_identify(struct nvme_ctrl *ctrl); Could Sparse print a warning for that? regards, dan carpenter