tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: c6935931c1894ff857616ff8549b61236a19148f commit: aa71987472a974f4f6dc4be377720564079ef42e nvme: fabrics drivers don't need the nvme-pci driver date: 2 weeks ago config: x86_64-randconfig-n0-09052021 (attached as .config) compiler: gcc-4.8 (Debian 4.8.4-1) 4.8.4 reproduce: git checkout aa71987472a974f4f6dc4be377720564079ef42e # save the attached .config to linux build tree make ARCH=x86_64
All warnings (new ones prefixed by >>): In file included from drivers/nvme/host/core.c:16:0: include/linux/blk-mq.h:61:18: error: field 'kobj' has incomplete type struct kobject kobj; ^ include/linux/blk-mq.h:128:2: error: unknown type name 'softirq_done_fn' softirq_done_fn *complete; ^ include/linux/blk-mq.h:181:33: warning: 'struct gendisk' declared inside parameter list [enabled by default] int blk_mq_register_disk(struct gendisk *); ^ include/linux/blk-mq.h:181:33: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default] include/linux/blk-mq.h:182:36: warning: 'struct gendisk' declared inside parameter list [enabled by default] void blk_mq_unregister_disk(struct gendisk *); ^ include/linux/blk-mq.h: In function 'blk_mq_rq_from_pdu': include/linux/blk-mq.h:260:22: error: invalid application of 'sizeof' to incomplete type 'struct request' return pdu - sizeof(struct request); ^ include/linux/blk-mq.h: In function 'blk_mq_rq_to_pdu': include/linux/blk-mq.h:264:2: error: invalid use of undefined type 'struct request' return rq + 1; ^ In file included from drivers/nvme/host/core.c:32:0: drivers/nvme/host/nvme.h: In function 'nvme_map_len': drivers/nvme/host/nvme.h:217:2: error: implicit declaration of function 'req_op' [-Werror=implicit-function-declaration] if (req_op(rq) == REQ_OP_DISCARD) ^ drivers/nvme/host/nvme.h:220:3: error: implicit declaration of function 'blk_rq_bytes' [-Werror=implicit-function-declaration] return blk_rq_bytes(rq); ^ drivers/nvme/host/nvme.h: In function 'nvme_cleanup_cmd': drivers/nvme/host/nvme.h:226:12: error: dereferencing pointer to incomplete type kfree(req->completion_data); ^ drivers/nvme/host/nvme.h: In function 'nvme_req_needs_retry': drivers/nvme/host/nvme.h:243:2: error: implicit declaration of function 'blk_noretry_request' [-Werror=implicit-function-declaration] return !(status & NVME_SC_DNR || blk_noretry_request(req)) && ^ drivers/nvme/host/nvme.h:244:17: error: dereferencing pointer to incomplete type (jiffies - req->start_time) < req->timeout && ^ drivers/nvme/host/nvme.h:244:36: error: dereferencing pointer to incomplete type (jiffies - req->start_time) < req->timeout && ^ drivers/nvme/host/nvme.h:245:6: error: dereferencing pointer to incomplete type req->retries < nvme_max_retries; ^ In file included from include/linux/pci.h:30:0, from drivers/nvme/host/nvme.h:18, from drivers/nvme/host/core.c:32: drivers/nvme/host/core.c: In function 'nvme_cancel_request': drivers/nvme/host/core.c:72:29: error: dereferencing pointer to incomplete type "Cancelling I/O %d", req->tag); ^ include/linux/device.h:1294:38: note: in definition of macro 'dev_dbg_ratelimited' dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ ^ drivers/nvme/host/core.c:75:2: error: implicit declaration of function 'blk_queue_dying' [-Werror=implicit-function-declaration] if (blk_queue_dying(req->q)) ^ drivers/nvme/host/core.c:75:25: error: dereferencing pointer to incomplete type if (blk_queue_dying(req->q)) ^ drivers/nvme/host/core.c: In function 'nvme_free_ns': drivers/nvme/host/core.c:157:42: error: dereferencing pointer to incomplete type nvme_nvm_unregister(ns->queue, ns->disk->disk_name); ^ drivers/nvme/host/core.c:160:10: error: dereferencing pointer to incomplete type ns->disk->private_data = NULL; ^ drivers/nvme/host/core.c:163:2: error: implicit declaration of function 'put_disk' [-Werror=implicit-function-declaration] put_disk(ns->disk); ^ drivers/nvme/host/core.c: In function 'nvme_get_ns_from_disk': drivers/nvme/host/core.c:179:11: error: dereferencing pointer to incomplete type ns = disk->private_data; ^ In file included from include/linux/seqlock.h:35:0, from include/linux/time.h:5, from include/uapi/linux/timex.h:56, from include/linux/timex.h:56, from include/linux/sched.h:19, from include/linux/blkdev.h:4, from drivers/nvme/host/core.c:15: drivers/nvme/host/core.c: In function 'nvme_requeue_req': drivers/nvme/host/core.c:202:23: error: dereferencing pointer to incomplete type spin_lock_irqsave(req->q->queue_lock, flags); ^ include/linux/spinlock.h:208:34: note: in definition of macro 'raw_spin_lock_irqsave' flags = _raw_spin_lock_irqsave(lock); \ ^ >> drivers/nvme/host/core.c:202:2: note: in expansion of macro >> 'spin_lock_irqsave' spin_lock_irqsave(req->q->queue_lock, flags); ^ drivers/nvme/host/core.c:203:2: error: implicit declaration of function 'blk_queue_stopped' [-Werror=implicit-function-declaration] if (!blk_queue_stopped(req->q)) ^ drivers/nvme/host/core.c:203:28: error: dereferencing pointer to incomplete type if (!blk_queue_stopped(req->q)) ^ drivers/nvme/host/core.c:204:31: error: dereferencing pointer to incomplete type blk_mq_kick_requeue_list(req->q); ^ drivers/nvme/host/core.c:205:28: error: dereferencing pointer to incomplete type spin_unlock_irqrestore(req->q->queue_lock, flags); ^ drivers/nvme/host/core.c: In function 'nvme_alloc_request': drivers/nvme/host/core.c:223:5: error: dereferencing pointer to incomplete type req->cmd_type = REQ_TYPE_DRV_PRIV; ^ drivers/nvme/host/core.c:223:18: error: 'REQ_TYPE_DRV_PRIV' undeclared (first use in this function) req->cmd_type = REQ_TYPE_DRV_PRIV; ^ drivers/nvme/host/core.c:223:18: note: each undeclared identifier is reported only once for each function it appears in drivers/nvme/host/core.c:224:5: error: dereferencing pointer to incomplete type req->cmd_flags |= REQ_FAILFAST_DRIVER; ^ drivers/nvme/host/core.c:225:5: error: dereferencing pointer to incomplete type req->cmd = (unsigned char *)cmd; ^ drivers/nvme/host/core.c:226:5: error: dereferencing pointer to incomplete type req->cmd_len = sizeof(struct nvme_command); ^ drivers/nvme/host/core.c: In function 'nvme_setup_discard': drivers/nvme/host/core.c:254:2: error: implicit declaration of function 'blk_rq_pos' [-Werror=implicit-function-declaration] range->slba = cpu_to_le64(nvme_block_nr(ns, blk_rq_pos(req))); ^ drivers/nvme/host/core.c:262:5: error: dereferencing pointer to incomplete type req->completion_data = range; ^ drivers/nvme/host/core.c:265:2: error: implicit declaration of function 'blk_add_request_payload' [-Werror=implicit-function-declaration] blk_add_request_payload(req, page, offset, sizeof(*range)); ^ drivers/nvme/host/core.c:272:5: error: dereferencing pointer to incomplete type req->__data_len = nr_bytes; ^ drivers/nvme/host/core.c: In function 'nvme_setup_rw': drivers/nvme/host/core.c:283:9: error: dereferencing pointer to incomplete type if (req->cmd_flags & REQ_FUA) ^ drivers/nvme/host/core.c:285:9: error: dereferencing pointer to incomplete type if (req->cmd_flags & (REQ_FAILFAST_DEV | REQ_RAHEAD)) ^ drivers/nvme/host/core.c:288:9: error: dereferencing pointer to incomplete type if (req->cmd_flags & REQ_RAHEAD) ^ drivers/nvme/host/core.c:292:2: error: implicit declaration of function 'rq_data_dir' [-Werror=implicit-function-declaration] cmnd->rw.opcode = (rq_data_dir(req) ? nvme_cmd_write : nvme_cmd_read); ^ drivers/nvme/host/core.c:293:27: error: dereferencing pointer to incomplete type cmnd->rw.command_id = req->tag; ^ drivers/nvme/host/core.c:311:3: error: implicit declaration of function 'blk_integrity_rq' [-Werror=implicit-function-declaration] if (!blk_integrity_rq(req)) ^ drivers/nvme/host/core.c: In function 'nvme_setup_cmd': drivers/nvme/host/core.c:324:9: error: dereferencing pointer to incomplete type if (req->cmd_type == REQ_TYPE_DRV_PRIV) ^ drivers/nvme/host/core.c:324:23: error: 'REQ_TYPE_DRV_PRIV' undeclared (first use in this function) if (req->cmd_type == REQ_TYPE_DRV_PRIV) ^ drivers/nvme/host/core.c:325:18: error: dereferencing pointer to incomplete type memcpy(cmd, req->cmd, sizeof(*cmd)); ^ drivers/nvme/host/core.c: In function '__nvme_submit_sync_cmd': drivers/nvme/host/core.c:352:5: error: dereferencing pointer to incomplete type req->timeout = timeout ? timeout : ADMIN_TIMEOUT; ^ drivers/nvme/host/core.c:353:5: error: dereferencing pointer to incomplete type req->special = cqe; ^ drivers/nvme/host/core.c:356:3: error: implicit declaration of function 'blk_rq_map_kern' [-Werror=implicit-function-declaration] ret = blk_rq_map_kern(q, req, buffer, bufflen, GFP_KERNEL); ^ drivers/nvme/host/core.c:361:2: error: implicit declaration of function 'blk_execute_rq' [-Werror=implicit-function-declaration] blk_execute_rq(req->q, NULL, req, at_head); ^ drivers/nvme/host/core.c:361:20: error: dereferencing pointer to incomplete type blk_execute_rq(req->q, NULL, req, at_head); ^ drivers/nvme/host/core.c:362:11: error: dereferencing pointer to incomplete type ret = req->errors; ^ drivers/nvme/host/core.c: In function '__nvme_submit_user_cmd': drivers/nvme/host/core.c:384:24: error: dereferencing pointer to incomplete type struct nvme_ns *ns = q->queuedata; ^ drivers/nvme/host/core.c:395:5: error: dereferencing pointer to incomplete type req->timeout = timeout ? timeout : ADMIN_TIMEOUT; ^ drivers/nvme/host/core.c:396:5: error: dereferencing pointer to incomplete type -- .getgeo = nvme_getgeo, ^ drivers/nvme/host/core.c:1065:2: warning: excess elements in struct initializer [enabled by default] drivers/nvme/host/core.c:1065:2: warning: (near initialization for 'nvme_fops') [enabled by default] drivers/nvme/host/core.c:1066:2: error: unknown field 'revalidate_disk' specified in initializer .revalidate_disk= nvme_revalidate_disk, ^ drivers/nvme/host/core.c:1066:2: warning: excess elements in struct initializer [enabled by default] drivers/nvme/host/core.c:1066:2: warning: (near initialization for 'nvme_fops') [enabled by default] drivers/nvme/host/core.c:1067:2: error: unknown field 'pr_ops' specified in initializer .pr_ops = &nvme_pr_ops, ^ drivers/nvme/host/core.c:1067:2: warning: excess elements in struct initializer [enabled by default] drivers/nvme/host/core.c:1067:2: warning: (near initialization for 'nvme_fops') [enabled by default] drivers/nvme/host/core.c: In function 'nvme_set_queue_limits': drivers/nvme/host/core.c:1196:3: error: implicit declaration of function 'blk_queue_max_hw_sectors' [-Werror=implicit-function-declaration] blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors); ^ drivers/nvme/host/core.c:1197:3: error: implicit declaration of function 'blk_queue_max_segments' [-Werror=implicit-function-declaration] blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); ^ drivers/nvme/host/core.c:1200:3: error: implicit declaration of function 'blk_queue_chunk_sectors' [-Werror=implicit-function-declaration] blk_queue_chunk_sectors(q, ctrl->stripe_size >> 9); ^ drivers/nvme/host/core.c:1201:2: error: implicit declaration of function 'blk_queue_virt_boundary' [-Werror=implicit-function-declaration] blk_queue_virt_boundary(q, ctrl->page_size - 1); ^ drivers/nvme/host/core.c:1204:2: error: implicit declaration of function 'blk_queue_write_cache' [-Werror=implicit-function-declaration] blk_queue_write_cache(q, vwc, vwc); ^ drivers/nvme/host/core.c: In function 'wwid_show': drivers/nvme/host/core.c:1425:9: error: implicit declaration of function 'dev_to_disk' [-Werror=implicit-function-declaration] struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c:1425:39: error: invalid type argument of '->' (have 'int') struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c: In function 'uuid_show': drivers/nvme/host/core.c:1449:39: error: invalid type argument of '->' (have 'int') struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c: In function 'eui_show': drivers/nvme/host/core.c:1457:39: error: invalid type argument of '->' (have 'int') struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c: In function 'nsid_show': drivers/nvme/host/core.c:1465:39: error: invalid type argument of '->' (have 'int') struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c: In function 'nvme_ns_attrs_are_visible': drivers/nvme/host/core.c:1482:39: error: invalid type argument of '->' (have 'int') struct nvme_ns *ns = dev_to_disk(dev)->private_data; ^ drivers/nvme/host/core.c: In function 'nvme_alloc_ns': drivers/nvme/host/core.c:1655:26: error: 'QUEUE_FLAG_NONROT' undeclared (first use in this function) queue_flag_set_unlocked(QUEUE_FLAG_NONROT, ns->queue); ^ drivers/nvme/host/core.c:1656:11: error: dereferencing pointer to incomplete type ns->queue->queuedata = ns; ^ drivers/nvme/host/core.c:1659:2: error: implicit declaration of function 'alloc_disk_node' [-Werror=implicit-function-declaration] disk = alloc_disk_node(0, node); ^ drivers/nvme/host/core.c:1659:7: warning: assignment makes pointer from integer without a cast [enabled by default] disk = alloc_disk_node(0, node); ^ drivers/nvme/host/core.c:1672:6: error: dereferencing pointer to incomplete type disk->fops = &nvme_fops; ^ drivers/nvme/host/core.c:1673:6: error: dereferencing pointer to incomplete type disk->private_data = ns; ^ drivers/nvme/host/core.c:1674:6: error: dereferencing pointer to incomplete type disk->queue = ns->queue; ^ drivers/nvme/host/core.c:1675:6: error: dereferencing pointer to incomplete type disk->flags = GENHD_FL_EXT_DEVT; ^ drivers/nvme/host/core.c:1675:16: error: 'GENHD_FL_EXT_DEVT' undeclared (first use in this function) disk->flags = GENHD_FL_EXT_DEVT; ^ drivers/nvme/host/core.c:1676:14: error: dereferencing pointer to incomplete type sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, ns->instance); ^ drivers/nvme/host/core.c:1689:2: error: implicit declaration of function 'device_add_disk' [-Werror=implicit-function-declaration] device_add_disk(ctrl->device, ns->disk); ^ drivers/nvme/host/core.c:1690:47: error: invalid type argument of '->' (have 'int') if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj, ^ In file included from include/linux/kernel.h:13:0, from include/linux/sched.h:17, from include/linux/blkdev.h:4, from drivers/nvme/host/core.c:15: drivers/nvme/host/core.c:1693:12: error: dereferencing pointer to incomplete type ns->disk->disk_name); ^ include/linux/printk.h:269:37: note: in definition of macro 'pr_warning' printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) ^ >> drivers/nvme/host/core.c:1692:3: note: in expansion of macro 'pr_warn' pr_warn("%s: failed to create sysfs group for identification\n", ^ drivers/nvme/host/core.c:1698:2: error: implicit declaration of function 'blk_cleanup_queue' [-Werror=implicit-function-declaration] blk_cleanup_queue(ns->queue); ^ drivers/nvme/host/core.c: In function 'nvme_ns_remove': drivers/nvme/host/core.c:1710:14: error: dereferencing pointer to incomplete type if (ns->disk->flags & GENHD_FL_UP) { ^ drivers/nvme/host/core.c:1710:24: error: 'GENHD_FL_UP' undeclared (first use in this function) if (ns->disk->flags & GENHD_FL_UP) { ^ drivers/nvme/host/core.c:1713:44: error: invalid type argument of '->' (have 'int') sysfs_remove_group(&disk_to_dev(ns->disk)->kobj, ^ drivers/nvme/host/core.c:1715:3: error: implicit declaration of function 'del_gendisk' [-Werror=implicit-function-declaration] del_gendisk(ns->disk); ^ drivers/nvme/host/core.c: In function 'nvme_validate_ns': drivers/nvme/host/core.c:1733:3: error: implicit declaration of function 'revalidate_disk' [-Werror=implicit-function-declaration] if (revalidate_disk(ns->disk)) ^ drivers/nvme/host/core.c: In function 'nvme_kill_queues': drivers/nvme/host/core.c:2041:3: error: implicit declaration of function 'blk_set_queue_dying' [-Werror=implicit-function-declaration] blk_set_queue_dying(ns->queue); ^ drivers/nvme/host/core.c: In function 'nvme_stop_queues': drivers/nvme/host/core.c:2055:26: error: dereferencing pointer to incomplete type spin_lock_irq(ns->queue->queue_lock); ^ drivers/nvme/host/core.c:2056:3: error: implicit declaration of function 'queue_flag_set' [-Werror=implicit-function-declaration] queue_flag_set(QUEUE_FLAG_STOPPED, ns->queue); ^ drivers/nvme/host/core.c:2056:18: error: 'QUEUE_FLAG_STOPPED' undeclared (first use in this function) queue_flag_set(QUEUE_FLAG_STOPPED, ns->queue); ^ drivers/nvme/host/core.c:2057:28: error: dereferencing pointer to incomplete type spin_unlock_irq(ns->queue->queue_lock); ^ drivers/nvme/host/core.c: In function 'nvme_start_queues': drivers/nvme/host/core.c:2072:3: error: implicit declaration of function 'queue_flag_clear_unlocked' [-Werror=implicit-function-declaration] queue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue); ^ drivers/nvme/host/core.c:2072:29: error: 'QUEUE_FLAG_STOPPED' undeclared (first use in this function) queue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue); ^ cc1: some warnings being treated as errors .. vim +/spin_lock_irqsave +202 drivers/nvme/host/core.c 21d34711e Christoph Hellwig 2015-11-26 9 * This program is distributed in the hope it will be useful, but WITHOUT 21d34711e Christoph Hellwig 2015-11-26 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 21d34711e Christoph Hellwig 2015-11-26 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 21d34711e Christoph Hellwig 2015-11-26 12 * more details. 21d34711e Christoph Hellwig 2015-11-26 13 */ 21d34711e Christoph Hellwig 2015-11-26 14 21d34711e Christoph Hellwig 2015-11-26 @15 #include <linux/blkdev.h> 21d34711e Christoph Hellwig 2015-11-26 16 #include <linux/blk-mq.h> 5fd4ce1b0 Christoph Hellwig 2015-11-28 17 #include <linux/delay.h> 21d34711e Christoph Hellwig 2015-11-26 18 #include <linux/errno.h> 1673f1f08 Christoph Hellwig 2015-11-26 19 #include <linux/hdreg.h> 21d34711e Christoph Hellwig 2015-11-26 20 #include <linux/kernel.h> 5bae7f73d Christoph Hellwig 2015-11-28 21 #include <linux/module.h> 5bae7f73d Christoph Hellwig 2015-11-28 22 #include <linux/list_sort.h> 21d34711e Christoph Hellwig 2015-11-26 23 #include <linux/slab.h> 21d34711e Christoph Hellwig 2015-11-26 24 #include <linux/types.h> 1673f1f08 Christoph Hellwig 2015-11-26 25 #include <linux/pr.h> 1673f1f08 Christoph Hellwig 2015-11-26 26 #include <linux/ptrace.h> 1673f1f08 Christoph Hellwig 2015-11-26 27 #include <linux/nvme_ioctl.h> 1673f1f08 Christoph Hellwig 2015-11-26 28 #include <linux/t10-pi.h> 1673f1f08 Christoph Hellwig 2015-11-26 29 #include <scsi/sg.h> 1673f1f08 Christoph Hellwig 2015-11-26 30 #include <asm/unaligned.h> 21d34711e Christoph Hellwig 2015-11-26 31 21d34711e Christoph Hellwig 2015-11-26 32 #include "nvme.h" 038bd4cb6 Sagi Grimberg 2016-06-13 33 #include "fabrics.h" 21d34711e Christoph Hellwig 2015-11-26 34 f3ca80fc1 Christoph Hellwig 2015-11-28 35 #define NVME_MINORS (1U << MINORBITS) f3ca80fc1 Christoph Hellwig 2015-11-28 36 ba0ba7d3e Ming Lin 2016-02-10 37 unsigned char admin_timeout = 60; ba0ba7d3e Ming Lin 2016-02-10 38 module_param(admin_timeout, byte, 0644); ba0ba7d3e Ming Lin 2016-02-10 39 MODULE_PARM_DESC(admin_timeout, "timeout in seconds for admin commands"); 576d55d62 Ming Lin 2016-02-10 40 EXPORT_SYMBOL_GPL(admin_timeout); ba0ba7d3e Ming Lin 2016-02-10 41 ba0ba7d3e Ming Lin 2016-02-10 42 unsigned char nvme_io_timeout = 30; ba0ba7d3e Ming Lin 2016-02-10 43 module_param_named(io_timeout, nvme_io_timeout, byte, 0644); ba0ba7d3e Ming Lin 2016-02-10 44 MODULE_PARM_DESC(io_timeout, "timeout in seconds for I/O"); 576d55d62 Ming Lin 2016-02-10 45 EXPORT_SYMBOL_GPL(nvme_io_timeout); ba0ba7d3e Ming Lin 2016-02-10 46 ba0ba7d3e Ming Lin 2016-02-10 47 unsigned char shutdown_timeout = 5; ba0ba7d3e Ming Lin 2016-02-10 48 module_param(shutdown_timeout, byte, 0644); ba0ba7d3e Ming Lin 2016-02-10 49 MODULE_PARM_DESC(shutdown_timeout, "timeout in seconds for controller shutdown"); ba0ba7d3e Ming Lin 2016-02-10 50 f80ec966c Keith Busch 2016-07-12 51 unsigned int nvme_max_retries = 5; f80ec966c Keith Busch 2016-07-12 52 module_param_named(max_retries, nvme_max_retries, uint, 0644); f80ec966c Keith Busch 2016-07-12 53 MODULE_PARM_DESC(max_retries, "max number of retries a command may have"); f80ec966c Keith Busch 2016-07-12 54 EXPORT_SYMBOL_GPL(nvme_max_retries); 5bae7f73d Christoph Hellwig 2015-11-28 55 f3ca80fc1 Christoph Hellwig 2015-11-28 56 static int nvme_char_major; f3ca80fc1 Christoph Hellwig 2015-11-28 57 module_param(nvme_char_major, int, 0); f3ca80fc1 Christoph Hellwig 2015-11-28 58 f3ca80fc1 Christoph Hellwig 2015-11-28 59 static LIST_HEAD(nvme_ctrl_list); 9f2482b91 Ming Lin 2016-02-10 60 static DEFINE_SPINLOCK(dev_list_lock); 1673f1f08 Christoph Hellwig 2015-11-26 61 f3ca80fc1 Christoph Hellwig 2015-11-28 62 static struct class *nvme_class; f3ca80fc1 Christoph Hellwig 2015-11-28 63 c55a2fd4b Ming Lin 2016-05-18 64 void nvme_cancel_request(struct request *req, void *data, bool reserved) c55a2fd4b Ming Lin 2016-05-18 65 { c55a2fd4b Ming Lin 2016-05-18 66 int status; c55a2fd4b Ming Lin 2016-05-18 67 c55a2fd4b Ming Lin 2016-05-18 68 if (!blk_mq_request_started(req)) c55a2fd4b Ming Lin 2016-05-18 69 return; c55a2fd4b Ming Lin 2016-05-18 70 c55a2fd4b Ming Lin 2016-05-18 71 dev_dbg_ratelimited(((struct nvme_ctrl *) data)->device, c55a2fd4b Ming Lin 2016-05-18 72 "Cancelling I/O %d", req->tag); c55a2fd4b Ming Lin 2016-05-18 73 c55a2fd4b Ming Lin 2016-05-18 74 status = NVME_SC_ABORT_REQ; c55a2fd4b Ming Lin 2016-05-18 75 if (blk_queue_dying(req->q)) c55a2fd4b Ming Lin 2016-05-18 76 status |= NVME_SC_DNR; c55a2fd4b Ming Lin 2016-05-18 77 blk_mq_complete_request(req, status); c55a2fd4b Ming Lin 2016-05-18 78 } c55a2fd4b Ming Lin 2016-05-18 79 EXPORT_SYMBOL_GPL(nvme_cancel_request); c55a2fd4b Ming Lin 2016-05-18 80 bb8d261e0 Christoph Hellwig 2016-04-26 81 bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl, bb8d261e0 Christoph Hellwig 2016-04-26 82 enum nvme_ctrl_state new_state) bb8d261e0 Christoph Hellwig 2016-04-26 83 { bb8d261e0 Christoph Hellwig 2016-04-26 84 enum nvme_ctrl_state old_state = ctrl->state; bb8d261e0 Christoph Hellwig 2016-04-26 85 bool changed = false; bb8d261e0 Christoph Hellwig 2016-04-26 86 bb8d261e0 Christoph Hellwig 2016-04-26 87 spin_lock_irq(&ctrl->lock); bb8d261e0 Christoph Hellwig 2016-04-26 88 switch (new_state) { bb8d261e0 Christoph Hellwig 2016-04-26 89 case NVME_CTRL_LIVE: bb8d261e0 Christoph Hellwig 2016-04-26 90 switch (old_state) { 7d2e80080 Christoph Hellwig 2016-06-13 91 case NVME_CTRL_NEW: bb8d261e0 Christoph Hellwig 2016-04-26 92 case NVME_CTRL_RESETTING: def61eca9 Christoph Hellwig 2016-07-06 93 case NVME_CTRL_RECONNECTING: bb8d261e0 Christoph Hellwig 2016-04-26 94 changed = true; bb8d261e0 Christoph Hellwig 2016-04-26 95 /* FALLTHRU */ bb8d261e0 Christoph Hellwig 2016-04-26 96 default: bb8d261e0 Christoph Hellwig 2016-04-26 97 break; bb8d261e0 Christoph Hellwig 2016-04-26 98 } bb8d261e0 Christoph Hellwig 2016-04-26 99 break; bb8d261e0 Christoph Hellwig 2016-04-26 100 case NVME_CTRL_RESETTING: bb8d261e0 Christoph Hellwig 2016-04-26 101 switch (old_state) { bb8d261e0 Christoph Hellwig 2016-04-26 102 case NVME_CTRL_NEW: bb8d261e0 Christoph Hellwig 2016-04-26 103 case NVME_CTRL_LIVE: def61eca9 Christoph Hellwig 2016-07-06 104 case NVME_CTRL_RECONNECTING: def61eca9 Christoph Hellwig 2016-07-06 105 changed = true; def61eca9 Christoph Hellwig 2016-07-06 106 /* FALLTHRU */ def61eca9 Christoph Hellwig 2016-07-06 107 default: def61eca9 Christoph Hellwig 2016-07-06 108 break; def61eca9 Christoph Hellwig 2016-07-06 109 } def61eca9 Christoph Hellwig 2016-07-06 110 break; def61eca9 Christoph Hellwig 2016-07-06 111 case NVME_CTRL_RECONNECTING: def61eca9 Christoph Hellwig 2016-07-06 112 switch (old_state) { def61eca9 Christoph Hellwig 2016-07-06 113 case NVME_CTRL_LIVE: bb8d261e0 Christoph Hellwig 2016-04-26 114 changed = true; bb8d261e0 Christoph Hellwig 2016-04-26 115 /* FALLTHRU */ bb8d261e0 Christoph Hellwig 2016-04-26 116 default: bb8d261e0 Christoph Hellwig 2016-04-26 117 break; bb8d261e0 Christoph Hellwig 2016-04-26 118 } bb8d261e0 Christoph Hellwig 2016-04-26 119 break; bb8d261e0 Christoph Hellwig 2016-04-26 120 case NVME_CTRL_DELETING: bb8d261e0 Christoph Hellwig 2016-04-26 121 switch (old_state) { bb8d261e0 Christoph Hellwig 2016-04-26 122 case NVME_CTRL_LIVE: bb8d261e0 Christoph Hellwig 2016-04-26 123 case NVME_CTRL_RESETTING: def61eca9 Christoph Hellwig 2016-07-06 124 case NVME_CTRL_RECONNECTING: bb8d261e0 Christoph Hellwig 2016-04-26 125 changed = true; bb8d261e0 Christoph Hellwig 2016-04-26 126 /* FALLTHRU */ bb8d261e0 Christoph Hellwig 2016-04-26 127 default: bb8d261e0 Christoph Hellwig 2016-04-26 128 break; bb8d261e0 Christoph Hellwig 2016-04-26 129 } bb8d261e0 Christoph Hellwig 2016-04-26 130 break; 0ff9d4e1a Keith Busch 2016-05-12 131 case NVME_CTRL_DEAD: 0ff9d4e1a Keith Busch 2016-05-12 132 switch (old_state) { 0ff9d4e1a Keith Busch 2016-05-12 133 case NVME_CTRL_DELETING: 0ff9d4e1a Keith Busch 2016-05-12 134 changed = true; 0ff9d4e1a Keith Busch 2016-05-12 135 /* FALLTHRU */ 0ff9d4e1a Keith Busch 2016-05-12 136 default: 0ff9d4e1a Keith Busch 2016-05-12 137 break; 0ff9d4e1a Keith Busch 2016-05-12 138 } 0ff9d4e1a Keith Busch 2016-05-12 139 break; bb8d261e0 Christoph Hellwig 2016-04-26 140 default: bb8d261e0 Christoph Hellwig 2016-04-26 141 break; bb8d261e0 Christoph Hellwig 2016-04-26 142 } bb8d261e0 Christoph Hellwig 2016-04-26 143 spin_unlock_irq(&ctrl->lock); bb8d261e0 Christoph Hellwig 2016-04-26 144 bb8d261e0 Christoph Hellwig 2016-04-26 145 if (changed) bb8d261e0 Christoph Hellwig 2016-04-26 146 ctrl->state = new_state; bb8d261e0 Christoph Hellwig 2016-04-26 147 bb8d261e0 Christoph Hellwig 2016-04-26 148 return changed; bb8d261e0 Christoph Hellwig 2016-04-26 149 } bb8d261e0 Christoph Hellwig 2016-04-26 150 EXPORT_SYMBOL_GPL(nvme_change_ctrl_state); bb8d261e0 Christoph Hellwig 2016-04-26 151 1673f1f08 Christoph Hellwig 2015-11-26 152 static void nvme_free_ns(struct kref *kref) 1673f1f08 Christoph Hellwig 2015-11-26 153 { 1673f1f08 Christoph Hellwig 2015-11-26 154 struct nvme_ns *ns = container_of(kref, struct nvme_ns, kref); 1673f1f08 Christoph Hellwig 2015-11-26 155 1673f1f08 Christoph Hellwig 2015-11-26 156 if (ns->type == NVME_NS_LIGHTNVM) 1673f1f08 Christoph Hellwig 2015-11-26 157 nvme_nvm_unregister(ns->queue, ns->disk->disk_name); 1673f1f08 Christoph Hellwig 2015-11-26 158 1673f1f08 Christoph Hellwig 2015-11-26 159 spin_lock(&dev_list_lock); 1673f1f08 Christoph Hellwig 2015-11-26 160 ns->disk->private_data = NULL; 1673f1f08 Christoph Hellwig 2015-11-26 161 spin_unlock(&dev_list_lock); 1673f1f08 Christoph Hellwig 2015-11-26 162 1673f1f08 Christoph Hellwig 2015-11-26 163 put_disk(ns->disk); 075790ebb Keith Busch 2016-02-24 164 ida_simple_remove(&ns->ctrl->ns_ida, ns->instance); 075790ebb Keith Busch 2016-02-24 165 nvme_put_ctrl(ns->ctrl); 1673f1f08 Christoph Hellwig 2015-11-26 166 kfree(ns); 1673f1f08 Christoph Hellwig 2015-11-26 167 } 1673f1f08 Christoph Hellwig 2015-11-26 168 5bae7f73d Christoph Hellwig 2015-11-28 169 static void nvme_put_ns(struct nvme_ns *ns) 1673f1f08 Christoph Hellwig 2015-11-26 170 { 1673f1f08 Christoph Hellwig 2015-11-26 171 kref_put(&ns->kref, nvme_free_ns); 1673f1f08 Christoph Hellwig 2015-11-26 172 } 1673f1f08 Christoph Hellwig 2015-11-26 173 1673f1f08 Christoph Hellwig 2015-11-26 174 static struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk) 1673f1f08 Christoph Hellwig 2015-11-26 175 { 1673f1f08 Christoph Hellwig 2015-11-26 176 struct nvme_ns *ns; 1673f1f08 Christoph Hellwig 2015-11-26 177 1673f1f08 Christoph Hellwig 2015-11-26 178 spin_lock(&dev_list_lock); 1673f1f08 Christoph Hellwig 2015-11-26 179 ns = disk->private_data; e439bb12e Sagi Grimberg 2016-02-10 180 if (ns) { e439bb12e Sagi Grimberg 2016-02-10 181 if (!kref_get_unless_zero(&ns->kref)) e439bb12e Sagi Grimberg 2016-02-10 182 goto fail; e439bb12e Sagi Grimberg 2016-02-10 183 if (!try_module_get(ns->ctrl->ops->module)) e439bb12e Sagi Grimberg 2016-02-10 184 goto fail_put_ns; e439bb12e Sagi Grimberg 2016-02-10 185 } 1673f1f08 Christoph Hellwig 2015-11-26 186 spin_unlock(&dev_list_lock); 1673f1f08 Christoph Hellwig 2015-11-26 187 1673f1f08 Christoph Hellwig 2015-11-26 188 return ns; e439bb12e Sagi Grimberg 2016-02-10 189 e439bb12e Sagi Grimberg 2016-02-10 190 fail_put_ns: e439bb12e Sagi Grimberg 2016-02-10 191 kref_put(&ns->kref, nvme_free_ns); e439bb12e Sagi Grimberg 2016-02-10 192 fail: e439bb12e Sagi Grimberg 2016-02-10 193 spin_unlock(&dev_list_lock); e439bb12e Sagi Grimberg 2016-02-10 194 return NULL; 1673f1f08 Christoph Hellwig 2015-11-26 195 } 1673f1f08 Christoph Hellwig 2015-11-26 196 7688faa6d Christoph Hellwig 2015-11-28 197 void nvme_requeue_req(struct request *req) 7688faa6d Christoph Hellwig 2015-11-28 198 { 7688faa6d Christoph Hellwig 2015-11-28 199 unsigned long flags; 7688faa6d Christoph Hellwig 2015-11-28 200 7688faa6d Christoph Hellwig 2015-11-28 201 blk_mq_requeue_request(req); 7688faa6d Christoph Hellwig 2015-11-28 @202 spin_lock_irqsave(req->q->queue_lock, flags); 7688faa6d Christoph Hellwig 2015-11-28 203 if (!blk_queue_stopped(req->q)) 7688faa6d Christoph Hellwig 2015-11-28 204 blk_mq_kick_requeue_list(req->q); 7688faa6d Christoph Hellwig 2015-11-28 205 spin_unlock_irqrestore(req->q->queue_lock, flags); :::::: The code at line 202 was first introduced by commit :::::: 7688faa6dd2c99ce5d66571d9ad65535ec39e8cb nvme: factor out a few helpers from req_completion :::::: TO: Christoph Hellwig <h...@lst.de> :::::: CC: Jens Axboe <ax...@fb.com> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
.config.gz
Description: Binary data