#include <linux/async.h>
#include <linux/blkdev.h>
#include <linux/blk-mq.h>
#include <linux/blk-integrity.h>
#include <linux/compat.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/hdreg.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/backing-dev.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/pr.h>
#include <linux/ptrace.h>
#include <linux/nvme_ioctl.h>
#include <linux/pm_qos.h>
#include <linux/ratelimit.h>
#include <linux/unaligned.h>
#include "nvme.h"
#include "fabrics.h"
#include <linux/nvme-auth.h>
#define CREATE_TRACE_POINTS
#include "trace.h"
#define NVME_MINORS …
struct nvme_ns_info { … };
unsigned int admin_timeout = …;
module_param(admin_timeout, uint, 0644);
MODULE_PARM_DESC(…) …;
EXPORT_SYMBOL_GPL(…);
unsigned int nvme_io_timeout = …;
module_param_named(io_timeout, nvme_io_timeout, uint, 0644);
MODULE_PARM_DESC(…) …;
EXPORT_SYMBOL_GPL(…);
static unsigned char shutdown_timeout = …;
module_param(shutdown_timeout, byte, 0644);
MODULE_PARM_DESC(…) …;
static u8 nvme_max_retries = …;
module_param_named(max_retries, nvme_max_retries, byte, 0644);
MODULE_PARM_DESC(…) …;
static unsigned long default_ps_max_latency_us = …;
module_param(default_ps_max_latency_us, ulong, 0644);
MODULE_PARM_DESC(…) …;
static bool force_apst;
module_param(force_apst, bool, 0644);
MODULE_PARM_DESC(…) …;
static unsigned long apst_primary_timeout_ms = …;
module_param(apst_primary_timeout_ms, ulong, 0644);
MODULE_PARM_DESC(…) …;
static unsigned long apst_secondary_timeout_ms = …;
module_param(apst_secondary_timeout_ms, ulong, 0644);
MODULE_PARM_DESC(…) …;
static unsigned long apst_primary_latency_tol_us = …;
module_param(apst_primary_latency_tol_us, ulong, 0644);
MODULE_PARM_DESC(…) …;
static unsigned long apst_secondary_latency_tol_us = …;
module_param(apst_secondary_latency_tol_us, ulong, 0644);
MODULE_PARM_DESC(…) …;
static bool disable_pi_offsets = …;
module_param(disable_pi_offsets, bool, 0444);
MODULE_PARM_DESC(…) …;
struct workqueue_struct *nvme_wq;
EXPORT_SYMBOL_GPL(…);
struct workqueue_struct *nvme_reset_wq;
EXPORT_SYMBOL_GPL(…);
struct workqueue_struct *nvme_delete_wq;
EXPORT_SYMBOL_GPL(…);
static LIST_HEAD(nvme_subsystems);
DEFINE_MUTEX(…) …;
static DEFINE_IDA(nvme_instance_ida);
static dev_t nvme_ctrl_base_chr_devt;
static int nvme_class_uevent(const struct device *dev, struct kobj_uevent_env *env);
static const struct class nvme_class = …;
static const struct class nvme_subsys_class = …;
static DEFINE_IDA(nvme_ns_chr_minor_ida);
static dev_t nvme_ns_chr_devt;
static const struct class nvme_ns_chr_class = …;
static void nvme_put_subsystem(struct nvme_subsystem *subsys);
static void nvme_remove_invalid_namespaces(struct nvme_ctrl *ctrl,
unsigned nsid);
static void nvme_update_keep_alive(struct nvme_ctrl *ctrl,
struct nvme_command *cmd);
void nvme_queue_scan(struct nvme_ctrl *ctrl)
{ … }
int nvme_try_sched_reset(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static void nvme_failfast_work(struct work_struct *work)
{ … }
static inline void nvme_start_failfast_work(struct nvme_ctrl *ctrl)
{ … }
static inline void nvme_stop_failfast_work(struct nvme_ctrl *ctrl)
{ … }
int nvme_reset_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
{ … }
static void nvme_do_delete_ctrl(struct nvme_ctrl *ctrl)
{ … }
static void nvme_delete_ctrl_work(struct work_struct *work)
{ … }
int nvme_delete_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
{ … }
static blk_status_t nvme_error_status(u16 status)
{ … }
static void nvme_retry_req(struct request *req)
{ … }
static void nvme_log_error(struct request *req)
{ … }
static void nvme_log_err_passthru(struct request *req)
{ … }
enum nvme_disposition { … };
static inline enum nvme_disposition nvme_decide_disposition(struct request *req)
{ … }
static inline void nvme_end_req_zoned(struct request *req)
{ … }
static inline void __nvme_end_req(struct request *req)
{ … }
void nvme_end_req(struct request *req)
{ … }
void nvme_complete_rq(struct request *req)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_complete_batch_req(struct request *req)
{ … }
EXPORT_SYMBOL_GPL(…);
blk_status_t nvme_host_path_error(struct request *req)
{ … }
EXPORT_SYMBOL_GPL(…);
bool nvme_cancel_request(struct request *req, void *data)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_cancel_tagset(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_cancel_admin_tagset(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl,
enum nvme_ctrl_state new_state)
{ … }
EXPORT_SYMBOL_GPL(…);
bool nvme_wait_reset(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static void nvme_free_ns_head(struct kref *ref)
{ … }
bool nvme_tryget_ns_head(struct nvme_ns_head *head)
{ … }
void nvme_put_ns_head(struct nvme_ns_head *head)
{ … }
static void nvme_free_ns(struct kref *kref)
{ … }
bool nvme_get_ns(struct nvme_ns *ns)
{ … }
void nvme_put_ns(struct nvme_ns *ns)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static inline void nvme_clear_nvme_request(struct request *req)
{ … }
void nvme_init_request(struct request *req, struct nvme_command *cmd)
{ … }
EXPORT_SYMBOL_GPL(…);
blk_status_t nvme_fail_nonready_command(struct nvme_ctrl *ctrl,
struct request *rq)
{ … }
EXPORT_SYMBOL_GPL(…);
bool __nvme_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
bool queue_live, enum nvme_ctrl_state state)
{ … }
EXPORT_SYMBOL_GPL(…);
static inline void nvme_setup_flush(struct nvme_ns *ns,
struct nvme_command *cmnd)
{ … }
static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req,
struct nvme_command *cmnd)
{ … }
static void nvme_set_ref_tag(struct nvme_ns *ns, struct nvme_command *cmnd,
struct request *req)
{ … }
static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,
struct request *req, struct nvme_command *cmnd)
{ … }
static bool nvme_valid_atomic_write(struct request *req)
{ … }
static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
struct request *req, struct nvme_command *cmnd,
enum nvme_opcode op)
{ … }
void nvme_cleanup_cmd(struct request *req)
{ … }
EXPORT_SYMBOL_GPL(…);
blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_execute_rq(struct request *rq, bool at_head)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
union nvme_result *result, void *buffer, unsigned bufflen,
int qid, nvme_submit_flags_t flags)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
void *buffer, unsigned bufflen)
{ … }
EXPORT_SYMBOL_GPL(…);
u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
u32 nvme_passthru_start(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 effects,
struct nvme_command *cmd, int status)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static unsigned long nvme_keep_alive_work_period(struct nvme_ctrl *ctrl)
{ … }
static void nvme_queue_keep_alive_work(struct nvme_ctrl *ctrl)
{ … }
static void nvme_keep_alive_finish(struct request *rq,
blk_status_t status, struct nvme_ctrl *ctrl)
{ … }
static void nvme_keep_alive_work(struct work_struct *work)
{ … }
static void nvme_start_keep_alive(struct nvme_ctrl *ctrl)
{ … }
void nvme_stop_keep_alive(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static void nvme_update_keep_alive(struct nvme_ctrl *ctrl,
struct nvme_command *cmd)
{ … }
static bool nvme_id_cns_ok(struct nvme_ctrl *ctrl, u8 cns)
{ … }
static int nvme_identify_ctrl(struct nvme_ctrl *dev, struct nvme_id_ctrl **id)
{ … }
static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
struct nvme_ns_id_desc *cur, bool *csi_seen)
{ … }
static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl,
struct nvme_ns_info *info)
{ … }
int nvme_identify_ns(struct nvme_ctrl *ctrl, unsigned nsid,
struct nvme_id_ns **id)
{ … }
static int nvme_ns_info_from_identify(struct nvme_ctrl *ctrl,
struct nvme_ns_info *info)
{ … }
static int nvme_ns_info_from_id_cs_indep(struct nvme_ctrl *ctrl,
struct nvme_ns_info *info)
{ … }
static int nvme_features(struct nvme_ctrl *dev, u8 op, unsigned int fid,
unsigned int dword11, void *buffer, size_t buflen, u32 *result)
{ … }
int nvme_set_features(struct nvme_ctrl *dev, unsigned int fid,
unsigned int dword11, void *buffer, size_t buflen,
u32 *result)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_get_features(struct nvme_ctrl *dev, unsigned int fid,
unsigned int dword11, void *buffer, size_t buflen,
u32 *result)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_set_queue_count(struct nvme_ctrl *ctrl, int *count)
{ … }
EXPORT_SYMBOL_GPL(…);
#define NVME_AEN_SUPPORTED …
static void nvme_enable_aen(struct nvme_ctrl *ctrl)
{ … }
static int nvme_ns_open(struct nvme_ns *ns)
{ … }
static void nvme_ns_release(struct nvme_ns *ns)
{ … }
static int nvme_open(struct gendisk *disk, blk_mode_t mode)
{ … }
static void nvme_release(struct gendisk *disk)
{ … }
int nvme_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{ … }
static bool nvme_init_integrity(struct nvme_ns_head *head,
struct queue_limits *lim, struct nvme_ns_info *info)
{ … }
static void nvme_config_discard(struct nvme_ns *ns, struct queue_limits *lim)
{ … }
static bool nvme_ns_ids_equal(struct nvme_ns_ids *a, struct nvme_ns_ids *b)
{ … }
static int nvme_identify_ns_nvm(struct nvme_ctrl *ctrl, unsigned int nsid,
struct nvme_id_ns_nvm **nvmp)
{ … }
static void nvme_configure_pi_elbas(struct nvme_ns_head *head,
struct nvme_id_ns *id, struct nvme_id_ns_nvm *nvm)
{ … }
static void nvme_configure_metadata(struct nvme_ctrl *ctrl,
struct nvme_ns_head *head, struct nvme_id_ns *id,
struct nvme_id_ns_nvm *nvm, struct nvme_ns_info *info)
{ … }
static void nvme_update_atomic_write_disk_info(struct nvme_ns *ns,
struct nvme_id_ns *id, struct queue_limits *lim,
u32 bs, u32 atomic_bs)
{ … }
static u32 nvme_max_drv_segments(struct nvme_ctrl *ctrl)
{ … }
static void nvme_set_ctrl_limits(struct nvme_ctrl *ctrl,
struct queue_limits *lim)
{ … }
static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id,
struct queue_limits *lim)
{ … }
static bool nvme_ns_is_readonly(struct nvme_ns *ns, struct nvme_ns_info *info)
{ … }
static inline bool nvme_first_scan(struct gendisk *disk)
{ … }
static void nvme_set_chunk_sectors(struct nvme_ns *ns, struct nvme_id_ns *id,
struct queue_limits *lim)
{ … }
static int nvme_update_ns_info_generic(struct nvme_ns *ns,
struct nvme_ns_info *info)
{ … }
static int nvme_update_ns_info_block(struct nvme_ns *ns,
struct nvme_ns_info *info)
{ … }
static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info)
{ … }
int nvme_ns_get_unique_id(struct nvme_ns *ns, u8 id[16],
enum blk_unique_id type)
{ … }
static int nvme_get_unique_id(struct gendisk *disk, u8 id[16],
enum blk_unique_id type)
{ … }
#ifdef CONFIG_BLK_SED_OPAL
static int nvme_sec_submit(void *data, u16 spsp, u8 secp, void *buffer, size_t len,
bool send)
{ … }
static void nvme_configure_opal(struct nvme_ctrl *ctrl, bool was_suspended)
{ … }
#else
static void nvme_configure_opal(struct nvme_ctrl *ctrl, bool was_suspended)
{
}
#endif
#ifdef CONFIG_BLK_DEV_ZONED
static int nvme_report_zones(struct gendisk *disk, sector_t sector,
unsigned int nr_zones, report_zones_cb cb, void *data)
{ … }
#else
#define nvme_report_zones …
#endif
const struct block_device_operations nvme_bdev_ops = …;
static int nvme_wait_ready(struct nvme_ctrl *ctrl, u32 mask, u32 val,
u32 timeout, const char *op)
{ … }
int nvme_disable_ctrl(struct nvme_ctrl *ctrl, bool shutdown)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static int nvme_configure_timestamp(struct nvme_ctrl *ctrl)
{ … }
static int nvme_configure_host_options(struct nvme_ctrl *ctrl)
{ … }
static bool nvme_apst_get_transition_time(u64 total_latency,
u64 *transition_time, unsigned *last_index)
{ … }
static int nvme_configure_apst(struct nvme_ctrl *ctrl)
{ … }
static void nvme_set_latency_tolerance(struct device *dev, s32 val)
{ … }
struct nvme_core_quirk_entry { … };
static const struct nvme_core_quirk_entry core_quirks[] = …;
static bool string_matches(const char *idstr, const char *match, size_t len)
{ … }
static bool quirk_matches(const struct nvme_id_ctrl *id,
const struct nvme_core_quirk_entry *q)
{ … }
static void nvme_init_subnqn(struct nvme_subsystem *subsys, struct nvme_ctrl *ctrl,
struct nvme_id_ctrl *id)
{ … }
static void nvme_release_subsystem(struct device *dev)
{ … }
static void nvme_destroy_subsystem(struct kref *ref)
{ … }
static void nvme_put_subsystem(struct nvme_subsystem *subsys)
{ … }
static struct nvme_subsystem *__nvme_find_get_subsystem(const char *subsysnqn)
{ … }
static inline bool nvme_discovery_ctrl(struct nvme_ctrl *ctrl)
{ … }
static bool nvme_validate_cntlid(struct nvme_subsystem *subsys,
struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
{ … }
static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
{ … }
int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
void *log, size_t size, u64 offset)
{ … }
static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
struct nvme_effects_log **log)
{ … }
static inline u32 nvme_mps_to_sectors(struct nvme_ctrl *ctrl, u32 units)
{ … }
static int nvme_init_non_mdts_limits(struct nvme_ctrl *ctrl)
{ … }
static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl)
{ … }
static int nvme_init_effects(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
{ … }
static int nvme_check_ctrl_fabric_info(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
{ … }
static int nvme_init_identify(struct nvme_ctrl *ctrl)
{ … }
int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl, bool was_suspended)
{ … }
EXPORT_SYMBOL_GPL(…);
static int nvme_dev_open(struct inode *inode, struct file *file)
{ … }
static int nvme_dev_release(struct inode *inode, struct file *file)
{ … }
static const struct file_operations nvme_dev_fops = …;
static struct nvme_ns_head *nvme_find_ns_head(struct nvme_ctrl *ctrl,
unsigned nsid)
{ … }
static int nvme_subsys_check_duplicate_ids(struct nvme_subsystem *subsys,
struct nvme_ns_ids *ids)
{ … }
static void nvme_cdev_rel(struct device *dev)
{ … }
void nvme_cdev_del(struct cdev *cdev, struct device *cdev_device)
{ … }
int nvme_cdev_add(struct cdev *cdev, struct device *cdev_device,
const struct file_operations *fops, struct module *owner)
{ … }
static int nvme_ns_chr_open(struct inode *inode, struct file *file)
{ … }
static int nvme_ns_chr_release(struct inode *inode, struct file *file)
{ … }
static const struct file_operations nvme_ns_chr_fops = …;
static int nvme_add_ns_cdev(struct nvme_ns *ns)
{ … }
static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl,
struct nvme_ns_info *info)
{ … }
static int nvme_global_check_duplicate_ids(struct nvme_subsystem *this,
struct nvme_ns_ids *ids)
{ … }
static int nvme_init_ns_head(struct nvme_ns *ns, struct nvme_ns_info *info)
{ … }
struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static void nvme_ns_add_to_ctrl_list(struct nvme_ns *ns)
{ … }
static void nvme_alloc_ns(struct nvme_ctrl *ctrl, struct nvme_ns_info *info)
{ … }
static void nvme_ns_remove(struct nvme_ns *ns)
{ … }
static void nvme_ns_remove_by_nsid(struct nvme_ctrl *ctrl, u32 nsid)
{ … }
static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
{ … }
static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
{ … }
struct async_scan_info { … };
static void nvme_scan_ns_async(void *data, async_cookie_t cookie)
{ … }
static void nvme_remove_invalid_namespaces(struct nvme_ctrl *ctrl,
unsigned nsid)
{ … }
static int nvme_scan_ns_list(struct nvme_ctrl *ctrl)
{ … }
static void nvme_scan_ns_sequential(struct nvme_ctrl *ctrl)
{ … }
static void nvme_clear_changed_ns_log(struct nvme_ctrl *ctrl)
{ … }
static void nvme_scan_work(struct work_struct *work)
{ … }
void nvme_remove_namespaces(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static int nvme_class_uevent(const struct device *dev, struct kobj_uevent_env *env)
{ … }
static void nvme_change_uevent(struct nvme_ctrl *ctrl, char *envdata)
{ … }
static void nvme_aen_uevent(struct nvme_ctrl *ctrl)
{ … }
static void nvme_async_event_work(struct work_struct *work)
{ … }
static bool nvme_ctrl_pp_status(struct nvme_ctrl *ctrl)
{ … }
static void nvme_get_fw_slot_info(struct nvme_ctrl *ctrl)
{ … }
static void nvme_fw_act_work(struct work_struct *work)
{ … }
static u32 nvme_aer_type(u32 result)
{ … }
static u32 nvme_aer_subtype(u32 result)
{ … }
static bool nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
{ … }
static void nvme_handle_aer_persistent_error(struct nvme_ctrl *ctrl)
{ … }
void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
volatile union nvme_result *res)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
const struct blk_mq_ops *ops, unsigned int cmd_size)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_remove_admin_tag_set(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_alloc_io_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
const struct blk_mq_ops *ops, unsigned int nr_maps,
unsigned int cmd_size)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_remove_io_tag_set(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_stop_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_start_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
static void nvme_free_cels(struct nvme_ctrl *ctrl)
{ … }
static void nvme_free_ctrl(struct device *dev)
{ … }
int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
const struct nvme_ctrl_ops *ops, unsigned long quirks)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_add_ctrl(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_mark_namespaces_dead(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_unfreeze(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
int nvme_wait_freeze_timeout(struct nvme_ctrl *ctrl, long timeout)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_wait_freeze(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_start_freeze(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_quiesce_io_queues(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_unquiesce_io_queues(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_quiesce_admin_queue(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_unquiesce_admin_queue(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_sync_io_queues(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
void nvme_sync_queues(struct nvme_ctrl *ctrl)
{ … }
EXPORT_SYMBOL_GPL(…);
struct nvme_ctrl *nvme_ctrl_from_file(struct file *file)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static inline void _nvme_check_size(void)
{ … }
static int __init nvme_core_init(void)
{ … }
static void __exit nvme_core_exit(void)
{ … }
MODULE_LICENSE(…) …;
MODULE_VERSION(…) …;
MODULE_DESCRIPTION(…) …;
module_init(…) …;
module_exit(nvme_core_exit);