linux/drivers/nvme/target/nvmet.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2015-2016 HGST, a Western Digital Company.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 */
  13
  14#ifndef _NVMET_H
  15#define _NVMET_H
  16
  17#include <linux/dma-mapping.h>
  18#include <linux/types.h>
  19#include <linux/device.h>
  20#include <linux/kref.h>
  21#include <linux/percpu-refcount.h>
  22#include <linux/list.h>
  23#include <linux/mutex.h>
  24#include <linux/nvme.h>
  25#include <linux/configfs.h>
  26#include <linux/rcupdate.h>
  27#include <linux/blkdev.h>
  28
  29#define NVMET_ASYNC_EVENTS              4
  30#define NVMET_ERROR_LOG_SLOTS           128
  31
  32/* Helper Macros when NVMe error is NVME_SC_CONNECT_INVALID_PARAM
  33 * The 16 bit shift is to set IATTR bit to 1, which means offending
  34 * offset starts in the data section of connect()
  35 */
  36#define IPO_IATTR_CONNECT_DATA(x)       \
  37        (cpu_to_le32((1 << 16) | (offsetof(struct nvmf_connect_data, x))))
  38#define IPO_IATTR_CONNECT_SQE(x)        \
  39        (cpu_to_le32(offsetof(struct nvmf_connect_command, x)))
  40
  41struct nvmet_ns {
  42        struct list_head        dev_link;
  43        struct percpu_ref       ref;
  44        struct block_device     *bdev;
  45        u32                     nsid;
  46        u32                     blksize_shift;
  47        loff_t                  size;
  48        u8                      nguid[16];
  49
  50        struct nvmet_subsys     *subsys;
  51        const char              *device_path;
  52
  53        struct config_group     device_group;
  54        struct config_group     group;
  55
  56        struct completion       disable_done;
  57};
  58
  59static inline struct nvmet_ns *to_nvmet_ns(struct config_item *item)
  60{
  61        return container_of(to_config_group(item), struct nvmet_ns, group);
  62}
  63
  64static inline bool nvmet_ns_enabled(struct nvmet_ns *ns)
  65{
  66        return !list_empty_careful(&ns->dev_link);
  67}
  68
  69struct nvmet_cq {
  70        u16                     qid;
  71        u16                     size;
  72};
  73
  74struct nvmet_sq {
  75        struct nvmet_ctrl       *ctrl;
  76        struct percpu_ref       ref;
  77        u16                     qid;
  78        u16                     size;
  79        struct completion       free_done;
  80};
  81
  82/**
  83 * struct nvmet_port -  Common structure to keep port
  84 *                              information for the target.
  85 * @entry:              List head for holding a list of these elements.
  86 * @disc_addr:          Address information is stored in a format defined
  87 *                              for a discovery log page entry.
  88 * @group:              ConfigFS group for this element's folder.
  89 * @priv:               Private data for the transport.
  90 */
  91struct nvmet_port {
  92        struct list_head                entry;
  93        struct nvmf_disc_rsp_page_entry disc_addr;
  94        struct config_group             group;
  95        struct config_group             subsys_group;
  96        struct list_head                subsystems;
  97        struct config_group             referrals_group;
  98        struct list_head                referrals;
  99        void                            *priv;
 100        bool                            enabled;
 101};
 102
 103static inline struct nvmet_port *to_nvmet_port(struct config_item *item)
 104{
 105        return container_of(to_config_group(item), struct nvmet_port,
 106                        group);
 107}
 108
 109struct nvmet_ctrl {
 110        struct nvmet_subsys     *subsys;
 111        struct nvmet_cq         **cqs;
 112        struct nvmet_sq         **sqs;
 113
 114        struct mutex            lock;
 115        u64                     cap;
 116        u64                     serial;
 117        u32                     cc;
 118        u32                     csts;
 119
 120        u16                     cntlid;
 121        u32                     kato;
 122
 123        struct nvmet_req        *async_event_cmds[NVMET_ASYNC_EVENTS];
 124        unsigned int            nr_async_event_cmds;
 125        struct list_head        async_events;
 126        struct work_struct      async_event_work;
 127
 128        struct list_head        subsys_entry;
 129        struct kref             ref;
 130        struct delayed_work     ka_work;
 131        struct work_struct      fatal_err_work;
 132
 133        struct nvmet_fabrics_ops *ops;
 134
 135        char                    subsysnqn[NVMF_NQN_FIELD_LEN];
 136        char                    hostnqn[NVMF_NQN_FIELD_LEN];
 137};
 138
 139struct nvmet_subsys {
 140        enum nvme_subsys_type   type;
 141
 142        struct mutex            lock;
 143        struct kref             ref;
 144
 145        struct list_head        namespaces;
 146        unsigned int            max_nsid;
 147
 148        struct list_head        ctrls;
 149        struct ida              cntlid_ida;
 150
 151        struct list_head        hosts;
 152        bool                    allow_any_host;
 153
 154        u16                     max_qid;
 155
 156        u64                     ver;
 157        char                    *subsysnqn;
 158
 159        struct config_group     group;
 160
 161        struct config_group     namespaces_group;
 162        struct config_group     allowed_hosts_group;
 163};
 164
 165static inline struct nvmet_subsys *to_subsys(struct config_item *item)
 166{
 167        return container_of(to_config_group(item), struct nvmet_subsys, group);
 168}
 169
 170static inline struct nvmet_subsys *namespaces_to_subsys(
 171                struct config_item *item)
 172{
 173        return container_of(to_config_group(item), struct nvmet_subsys,
 174                        namespaces_group);
 175}
 176
 177struct nvmet_host {
 178        struct config_group     group;
 179};
 180
 181static inline struct nvmet_host *to_host(struct config_item *item)
 182{
 183        return container_of(to_config_group(item), struct nvmet_host, group);
 184}
 185
 186static inline char *nvmet_host_name(struct nvmet_host *host)
 187{
 188        return config_item_name(&host->group.cg_item);
 189}
 190
 191struct nvmet_host_link {
 192        struct list_head        entry;
 193        struct nvmet_host       *host;
 194};
 195
 196struct nvmet_subsys_link {
 197        struct list_head        entry;
 198        struct nvmet_subsys     *subsys;
 199};
 200
 201struct nvmet_req;
 202struct nvmet_fabrics_ops {
 203        struct module *owner;
 204        unsigned int type;
 205        unsigned int sqe_inline_size;
 206        unsigned int msdbd;
 207        bool has_keyed_sgls : 1;
 208        void (*queue_response)(struct nvmet_req *req);
 209        int (*add_port)(struct nvmet_port *port);
 210        void (*remove_port)(struct nvmet_port *port);
 211        void (*delete_ctrl)(struct nvmet_ctrl *ctrl);
 212};
 213
 214#define NVMET_MAX_INLINE_BIOVEC 8
 215
 216struct nvmet_req {
 217        struct nvme_command     *cmd;
 218        struct nvme_completion  *rsp;
 219        struct nvmet_sq         *sq;
 220        struct nvmet_cq         *cq;
 221        struct nvmet_ns         *ns;
 222        struct scatterlist      *sg;
 223        struct bio              inline_bio;
 224        struct bio_vec          inline_bvec[NVMET_MAX_INLINE_BIOVEC];
 225        int                     sg_cnt;
 226        size_t                  data_len;
 227
 228        struct nvmet_port       *port;
 229
 230        void (*execute)(struct nvmet_req *req);
 231        struct nvmet_fabrics_ops *ops;
 232};
 233
 234static inline void nvmet_set_status(struct nvmet_req *req, u16 status)
 235{
 236        req->rsp->status = cpu_to_le16(status << 1);
 237}
 238
 239static inline void nvmet_set_result(struct nvmet_req *req, u32 result)
 240{
 241        req->rsp->result = cpu_to_le32(result);
 242}
 243
 244/*
 245 * NVMe command writes actually are DMA reads for us on the target side.
 246 */
 247static inline enum dma_data_direction
 248nvmet_data_dir(struct nvmet_req *req)
 249{
 250        return nvme_is_write(req->cmd) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
 251}
 252
 253struct nvmet_async_event {
 254        struct list_head        entry;
 255        u8                      event_type;
 256        u8                      event_info;
 257        u8                      log_page;
 258};
 259
 260int nvmet_parse_connect_cmd(struct nvmet_req *req);
 261int nvmet_parse_io_cmd(struct nvmet_req *req);
 262int nvmet_parse_admin_cmd(struct nvmet_req *req);
 263int nvmet_parse_discovery_cmd(struct nvmet_req *req);
 264int nvmet_parse_fabrics_cmd(struct nvmet_req *req);
 265
 266bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
 267                struct nvmet_sq *sq, struct nvmet_fabrics_ops *ops);
 268void nvmet_req_complete(struct nvmet_req *req, u16 status);
 269
 270void nvmet_cq_setup(struct nvmet_ctrl *ctrl, struct nvmet_cq *cq, u16 qid,
 271                u16 size);
 272void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq, u16 qid,
 273                u16 size);
 274void nvmet_sq_destroy(struct nvmet_sq *sq);
 275int nvmet_sq_init(struct nvmet_sq *sq);
 276
 277void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl);
 278
 279void nvmet_update_cc(struct nvmet_ctrl *ctrl, u32 new);
 280u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
 281                struct nvmet_req *req, u32 kato, struct nvmet_ctrl **ctrlp);
 282u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid,
 283                struct nvmet_req *req, struct nvmet_ctrl **ret);
 284void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
 285
 286struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
 287                enum nvme_subsys_type type);
 288void nvmet_subsys_put(struct nvmet_subsys *subsys);
 289
 290struct nvmet_ns *nvmet_find_namespace(struct nvmet_ctrl *ctrl, __le32 nsid);
 291void nvmet_put_namespace(struct nvmet_ns *ns);
 292int nvmet_ns_enable(struct nvmet_ns *ns);
 293void nvmet_ns_disable(struct nvmet_ns *ns);
 294struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid);
 295void nvmet_ns_free(struct nvmet_ns *ns);
 296
 297int nvmet_register_transport(struct nvmet_fabrics_ops *ops);
 298void nvmet_unregister_transport(struct nvmet_fabrics_ops *ops);
 299
 300int nvmet_enable_port(struct nvmet_port *port);
 301void nvmet_disable_port(struct nvmet_port *port);
 302
 303void nvmet_referral_enable(struct nvmet_port *parent, struct nvmet_port *port);
 304void nvmet_referral_disable(struct nvmet_port *port);
 305
 306u16 nvmet_copy_to_sgl(struct nvmet_req *req, off_t off, const void *buf,
 307                size_t len);
 308u16 nvmet_copy_from_sgl(struct nvmet_req *req, off_t off, void *buf,
 309                size_t len);
 310
 311u32 nvmet_get_log_page_len(struct nvme_command *cmd);
 312
 313#define NVMET_QUEUE_SIZE        1024
 314#define NVMET_NR_QUEUES         64
 315#define NVMET_MAX_CMD           NVMET_QUEUE_SIZE
 316#define NVMET_KAS               10
 317#define NVMET_DISC_KATO         120
 318
 319int __init nvmet_init_configfs(void);
 320void __exit nvmet_exit_configfs(void);
 321
 322int __init nvmet_init_discovery(void);
 323void nvmet_exit_discovery(void);
 324
 325extern struct nvmet_subsys *nvmet_disc_subsys;
 326extern u64 nvmet_genctr;
 327extern struct rw_semaphore nvmet_config_sem;
 328
 329bool nvmet_host_allowed(struct nvmet_req *req, struct nvmet_subsys *subsys,
 330                const char *hostnqn);
 331
 332#endif /* _NVMET_H */
 333