linux/drivers/nvme/target/nvmet.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (c) 2015-2016 HGST, a Western Digital Company.
   4 */
   5
   6#ifndef _NVMET_H
   7#define _NVMET_H
   8
   9#include <linux/dma-mapping.h>
  10#include <linux/types.h>
  11#include <linux/device.h>
  12#include <linux/kref.h>
  13#include <linux/percpu-refcount.h>
  14#include <linux/list.h>
  15#include <linux/mutex.h>
  16#include <linux/uuid.h>
  17#include <linux/nvme.h>
  18#include <linux/configfs.h>
  19#include <linux/rcupdate.h>
  20#include <linux/blkdev.h>
  21#include <linux/radix-tree.h>
  22#include <linux/t10-pi.h>
  23
  24#define NVMET_DEFAULT_VS                NVME_VS(1, 3, 0)
  25
  26#define NVMET_ASYNC_EVENTS              4
  27#define NVMET_ERROR_LOG_SLOTS           128
  28#define NVMET_NO_ERROR_LOC              ((u16)-1)
  29#define NVMET_DEFAULT_CTRL_MODEL        "Linux"
  30#define NVMET_MN_MAX_SIZE               40
  31#define NVMET_SN_MAX_SIZE               20
  32
  33/*
  34 * Supported optional AENs:
  35 */
  36#define NVMET_AEN_CFG_OPTIONAL \
  37        (NVME_AEN_CFG_NS_ATTR | NVME_AEN_CFG_ANA_CHANGE)
  38#define NVMET_DISC_AEN_CFG_OPTIONAL \
  39        (NVME_AEN_CFG_DISC_CHANGE)
  40
  41/*
  42 * Plus mandatory SMART AENs (we'll never send them, but allow enabling them):
  43 */
  44#define NVMET_AEN_CFG_ALL \
  45        (NVME_SMART_CRIT_SPARE | NVME_SMART_CRIT_TEMPERATURE | \
  46         NVME_SMART_CRIT_RELIABILITY | NVME_SMART_CRIT_MEDIA | \
  47         NVME_SMART_CRIT_VOLATILE_MEMORY | NVMET_AEN_CFG_OPTIONAL)
  48
  49/* Helper Macros when NVMe error is NVME_SC_CONNECT_INVALID_PARAM
  50 * The 16 bit shift is to set IATTR bit to 1, which means offending
  51 * offset starts in the data section of connect()
  52 */
  53#define IPO_IATTR_CONNECT_DATA(x)       \
  54        (cpu_to_le32((1 << 16) | (offsetof(struct nvmf_connect_data, x))))
  55#define IPO_IATTR_CONNECT_SQE(x)        \
  56        (cpu_to_le32(offsetof(struct nvmf_connect_command, x)))
  57
  58struct nvmet_ns {
  59        struct percpu_ref       ref;
  60        struct block_device     *bdev;
  61        struct file             *file;
  62        bool                    readonly;
  63        u32                     nsid;
  64        u32                     blksize_shift;
  65        loff_t                  size;
  66        u8                      nguid[16];
  67        uuid_t                  uuid;
  68        u32                     anagrpid;
  69
  70        bool                    buffered_io;
  71        bool                    enabled;
  72        struct nvmet_subsys     *subsys;
  73        const char              *device_path;
  74
  75        struct config_group     device_group;
  76        struct config_group     group;
  77
  78        struct completion       disable_done;
  79        mempool_t               *bvec_pool;
  80        struct kmem_cache       *bvec_cache;
  81
  82        int                     use_p2pmem;
  83        struct pci_dev          *p2p_dev;
  84        int                     pi_type;
  85        int                     metadata_size;
  86        u8                      csi;
  87};
  88
  89static inline struct nvmet_ns *to_nvmet_ns(struct config_item *item)
  90{
  91        return container_of(to_config_group(item), struct nvmet_ns, group);
  92}
  93
  94static inline struct device *nvmet_ns_dev(struct nvmet_ns *ns)
  95{
  96        return ns->bdev ? disk_to_dev(ns->bdev->bd_disk) : NULL;
  97}
  98
  99struct nvmet_cq {
 100        u16                     qid;
 101        u16                     size;
 102};
 103
 104struct nvmet_sq {
 105        struct nvmet_ctrl       *ctrl;
 106        struct percpu_ref       ref;
 107        u16                     qid;
 108        u16                     size;
 109        u32                     sqhd;
 110        bool                    sqhd_disabled;
 111        struct completion       free_done;
 112        struct completion       confirm_done;
 113};
 114
 115struct nvmet_ana_group {
 116        struct config_group     group;
 117        struct nvmet_port       *port;
 118        u32                     grpid;
 119};
 120
 121static inline struct nvmet_ana_group *to_ana_group(struct config_item *item)
 122{
 123        return container_of(to_config_group(item), struct nvmet_ana_group,
 124                        group);
 125}
 126
 127/**
 128 * struct nvmet_port -  Common structure to keep port
 129 *                              information for the target.
 130 * @entry:              Entry into referrals or transport list.
 131 * @disc_addr:          Address information is stored in a format defined
 132 *                              for a discovery log page entry.
 133 * @group:              ConfigFS group for this element's folder.
 134 * @priv:               Private data for the transport.
 135 */
 136struct nvmet_port {
 137        struct list_head                entry;
 138        struct nvmf_disc_rsp_page_entry disc_addr;
 139        struct config_group             group;
 140        struct config_group             subsys_group;
 141        struct list_head                subsystems;
 142        struct config_group             referrals_group;
 143        struct list_head                referrals;
 144        struct list_head                global_entry;
 145        struct config_group             ana_groups_group;
 146        struct nvmet_ana_group          ana_default_group;
 147        enum nvme_ana_state             *ana_state;
 148        void                            *priv;
 149        bool                            enabled;
 150        int                             inline_data_size;
 151        const struct nvmet_fabrics_ops  *tr_ops;
 152        bool                            pi_enable;
 153};
 154
 155static inline struct nvmet_port *to_nvmet_port(struct config_item *item)
 156{
 157        return container_of(to_config_group(item), struct nvmet_port,
 158                        group);
 159}
 160
 161static inline struct nvmet_port *ana_groups_to_port(
 162                struct config_item *item)
 163{
 164        return container_of(to_config_group(item), struct nvmet_port,
 165                        ana_groups_group);
 166}
 167
 168struct nvmet_ctrl {
 169        struct nvmet_subsys     *subsys;
 170        struct nvmet_sq         **sqs;
 171
 172        bool                    reset_tbkas;
 173
 174        struct mutex            lock;
 175        u64                     cap;
 176        u32                     cc;
 177        u32                     csts;
 178
 179        uuid_t                  hostid;
 180        u16                     cntlid;
 181        u32                     kato;
 182
 183        struct nvmet_port       *port;
 184
 185        u32                     aen_enabled;
 186        unsigned long           aen_masked;
 187        struct nvmet_req        *async_event_cmds[NVMET_ASYNC_EVENTS];
 188        unsigned int            nr_async_event_cmds;
 189        struct list_head        async_events;
 190        struct work_struct      async_event_work;
 191
 192        struct list_head        subsys_entry;
 193        struct kref             ref;
 194        struct delayed_work     ka_work;
 195        struct work_struct      fatal_err_work;
 196
 197        const struct nvmet_fabrics_ops *ops;
 198
 199        __le32                  *changed_ns_list;
 200        u32                     nr_changed_ns;
 201
 202        char                    subsysnqn[NVMF_NQN_FIELD_LEN];
 203        char                    hostnqn[NVMF_NQN_FIELD_LEN];
 204
 205        struct device           *p2p_client;
 206        struct radix_tree_root  p2p_ns_map;
 207
 208        spinlock_t              error_lock;
 209        u64                     err_counter;
 210        struct nvme_error_slot  slots[NVMET_ERROR_LOG_SLOTS];
 211        bool                    pi_support;
 212};
 213
 214struct nvmet_subsys {
 215        enum nvme_subsys_type   type;
 216
 217        struct mutex            lock;
 218        struct kref             ref;
 219
 220        struct xarray           namespaces;
 221        unsigned int            nr_namespaces;
 222        u32                     max_nsid;
 223        u16                     cntlid_min;
 224        u16                     cntlid_max;
 225
 226        struct list_head        ctrls;
 227
 228        struct list_head        hosts;
 229        bool                    allow_any_host;
 230
 231        u16                     max_qid;
 232
 233        u64                     ver;
 234        char                    serial[NVMET_SN_MAX_SIZE];
 235        bool                    subsys_discovered;
 236        char                    *subsysnqn;
 237        bool                    pi_support;
 238
 239        struct config_group     group;
 240
 241        struct config_group     namespaces_group;
 242        struct config_group     allowed_hosts_group;
 243
 244        char                    *model_number;
 245
 246#ifdef CONFIG_NVME_TARGET_PASSTHRU
 247        struct nvme_ctrl        *passthru_ctrl;
 248        char                    *passthru_ctrl_path;
 249        struct config_group     passthru_group;
 250        unsigned int            admin_timeout;
 251        unsigned int            io_timeout;
 252#endif /* CONFIG_NVME_TARGET_PASSTHRU */
 253
 254#ifdef CONFIG_BLK_DEV_ZONED
 255        u8                      zasl;
 256#endif /* CONFIG_BLK_DEV_ZONED */
 257};
 258
 259static inline struct nvmet_subsys *to_subsys(struct config_item *item)
 260{
 261        return container_of(to_config_group(item), struct nvmet_subsys, group);
 262}
 263
 264static inline struct nvmet_subsys *namespaces_to_subsys(
 265                struct config_item *item)
 266{
 267        return container_of(to_config_group(item), struct nvmet_subsys,
 268                        namespaces_group);
 269}
 270
 271struct nvmet_host {
 272        struct config_group     group;
 273};
 274
 275static inline struct nvmet_host *to_host(struct config_item *item)
 276{
 277        return container_of(to_config_group(item), struct nvmet_host, group);
 278}
 279
 280static inline char *nvmet_host_name(struct nvmet_host *host)
 281{
 282        return config_item_name(&host->group.cg_item);
 283}
 284
 285struct nvmet_host_link {
 286        struct list_head        entry;
 287        struct nvmet_host       *host;
 288};
 289
 290struct nvmet_subsys_link {
 291        struct list_head        entry;
 292        struct nvmet_subsys     *subsys;
 293};
 294
 295struct nvmet_req;
 296struct nvmet_fabrics_ops {
 297        struct module *owner;
 298        unsigned int type;
 299        unsigned int msdbd;
 300        unsigned int flags;
 301#define NVMF_KEYED_SGLS                 (1 << 0)
 302#define NVMF_METADATA_SUPPORTED         (1 << 1)
 303        void (*queue_response)(struct nvmet_req *req);
 304        int (*add_port)(struct nvmet_port *port);
 305        void (*remove_port)(struct nvmet_port *port);
 306        void (*delete_ctrl)(struct nvmet_ctrl *ctrl);
 307        void (*disc_traddr)(struct nvmet_req *req,
 308                        struct nvmet_port *port, char *traddr);
 309        u16 (*install_queue)(struct nvmet_sq *nvme_sq);
 310        void (*discovery_chg)(struct nvmet_port *port);
 311        u8 (*get_mdts)(const struct nvmet_ctrl *ctrl);
 312};
 313
 314#define NVMET_MAX_INLINE_BIOVEC 8
 315#define NVMET_MAX_INLINE_DATA_LEN NVMET_MAX_INLINE_BIOVEC * PAGE_SIZE
 316
 317struct nvmet_req {
 318        struct nvme_command     *cmd;
 319        struct nvme_completion  *cqe;
 320        struct nvmet_sq         *sq;
 321        struct nvmet_cq         *cq;
 322        struct nvmet_ns         *ns;
 323        struct scatterlist      *sg;
 324        struct scatterlist      *metadata_sg;
 325        struct bio_vec          inline_bvec[NVMET_MAX_INLINE_BIOVEC];
 326        union {
 327                struct {
 328                        struct bio      inline_bio;
 329                } b;
 330                struct {
 331                        bool                    mpool_alloc;
 332                        struct kiocb            iocb;
 333                        struct bio_vec          *bvec;
 334                        struct work_struct      work;
 335                } f;
 336                struct {
 337                        struct bio              inline_bio;
 338                        struct request          *rq;
 339                        struct work_struct      work;
 340                        bool                    use_workqueue;
 341                } p;
 342#ifdef CONFIG_BLK_DEV_ZONED
 343                struct {
 344                        struct bio              inline_bio;
 345                        struct work_struct      zmgmt_work;
 346                } z;
 347#endif /* CONFIG_BLK_DEV_ZONED */
 348        };
 349        int                     sg_cnt;
 350        int                     metadata_sg_cnt;
 351        /* data length as parsed from the SGL descriptor: */
 352        size_t                  transfer_len;
 353        size_t                  metadata_len;
 354
 355        struct nvmet_port       *port;
 356
 357        void (*execute)(struct nvmet_req *req);
 358        const struct nvmet_fabrics_ops *ops;
 359
 360        struct pci_dev          *p2p_dev;
 361        struct device           *p2p_client;
 362        u16                     error_loc;
 363        u64                     error_slba;
 364};
 365
 366extern struct workqueue_struct *buffered_io_wq;
 367extern struct workqueue_struct *zbd_wq;
 368
 369static inline void nvmet_set_result(struct nvmet_req *req, u32 result)
 370{
 371        req->cqe->result.u32 = cpu_to_le32(result);
 372}
 373
 374/*
 375 * NVMe command writes actually are DMA reads for us on the target side.
 376 */
 377static inline enum dma_data_direction
 378nvmet_data_dir(struct nvmet_req *req)
 379{
 380        return nvme_is_write(req->cmd) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
 381}
 382
 383struct nvmet_async_event {
 384        struct list_head        entry;
 385        u8                      event_type;
 386        u8                      event_info;
 387        u8                      log_page;
 388};
 389
 390static inline void nvmet_clear_aen_bit(struct nvmet_req *req, u32 bn)
 391{
 392        int rae = le32_to_cpu(req->cmd->common.cdw10) & 1 << 15;
 393
 394        if (!rae)
 395                clear_bit(bn, &req->sq->ctrl->aen_masked);
 396}
 397
 398static inline bool nvmet_aen_bit_disabled(struct nvmet_ctrl *ctrl, u32 bn)
 399{
 400        if (!(READ_ONCE(ctrl->aen_enabled) & (1 << bn)))
 401                return true;
 402        return test_and_set_bit(bn, &ctrl->aen_masked);
 403}
 404
 405void nvmet_get_feat_kato(struct nvmet_req *req);
 406void nvmet_get_feat_async_event(struct nvmet_req *req);
 407u16 nvmet_set_feat_kato(struct nvmet_req *req);
 408u16 nvmet_set_feat_async_event(struct nvmet_req *req, u32 mask);
 409void nvmet_execute_async_event(struct nvmet_req *req);
 410void nvmet_start_keep_alive_timer(struct nvmet_ctrl *ctrl);
 411void nvmet_stop_keep_alive_timer(struct nvmet_ctrl *ctrl);
 412
 413u16 nvmet_parse_connect_cmd(struct nvmet_req *req);
 414void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id);
 415u16 nvmet_bdev_parse_io_cmd(struct nvmet_req *req);
 416u16 nvmet_file_parse_io_cmd(struct nvmet_req *req);
 417u16 nvmet_bdev_zns_parse_io_cmd(struct nvmet_req *req);
 418u16 nvmet_parse_admin_cmd(struct nvmet_req *req);
 419u16 nvmet_parse_discovery_cmd(struct nvmet_req *req);
 420u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req);
 421
 422bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
 423                struct nvmet_sq *sq, const struct nvmet_fabrics_ops *ops);
 424void nvmet_req_uninit(struct nvmet_req *req);
 425bool nvmet_check_transfer_len(struct nvmet_req *req, size_t len);
 426bool nvmet_check_data_len_lte(struct nvmet_req *req, size_t data_len);
 427void nvmet_req_complete(struct nvmet_req *req, u16 status);
 428int nvmet_req_alloc_sgls(struct nvmet_req *req);
 429void nvmet_req_free_sgls(struct nvmet_req *req);
 430
 431void nvmet_execute_set_features(struct nvmet_req *req);
 432void nvmet_execute_get_features(struct nvmet_req *req);
 433void nvmet_execute_keep_alive(struct nvmet_req *req);
 434
 435void nvmet_cq_setup(struct nvmet_ctrl *ctrl, struct nvmet_cq *cq, u16 qid,
 436                u16 size);
 437void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq, u16 qid,
 438                u16 size);
 439void nvmet_sq_destroy(struct nvmet_sq *sq);
 440int nvmet_sq_init(struct nvmet_sq *sq);
 441
 442void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl);
 443
 444void nvmet_update_cc(struct nvmet_ctrl *ctrl, u32 new);
 445u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
 446                struct nvmet_req *req, u32 kato, struct nvmet_ctrl **ctrlp);
 447struct nvmet_ctrl *nvmet_ctrl_find_get(const char *subsysnqn,
 448                                       const char *hostnqn, u16 cntlid,
 449                                       struct nvmet_req *req);
 450void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
 451u16 nvmet_check_ctrl_status(struct nvmet_req *req);
 452
 453struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
 454                enum nvme_subsys_type type);
 455void nvmet_subsys_put(struct nvmet_subsys *subsys);
 456void nvmet_subsys_del_ctrls(struct nvmet_subsys *subsys);
 457
 458u16 nvmet_req_find_ns(struct nvmet_req *req);
 459void nvmet_put_namespace(struct nvmet_ns *ns);
 460int nvmet_ns_enable(struct nvmet_ns *ns);
 461void nvmet_ns_disable(struct nvmet_ns *ns);
 462struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid);
 463void nvmet_ns_free(struct nvmet_ns *ns);
 464
 465void nvmet_send_ana_event(struct nvmet_subsys *subsys,
 466                struct nvmet_port *port);
 467void nvmet_port_send_ana_event(struct nvmet_port *port);
 468
 469int nvmet_register_transport(const struct nvmet_fabrics_ops *ops);
 470void nvmet_unregister_transport(const struct nvmet_fabrics_ops *ops);
 471
 472void nvmet_port_del_ctrls(struct nvmet_port *port,
 473                          struct nvmet_subsys *subsys);
 474
 475int nvmet_enable_port(struct nvmet_port *port);
 476void nvmet_disable_port(struct nvmet_port *port);
 477
 478void nvmet_referral_enable(struct nvmet_port *parent, struct nvmet_port *port);
 479void nvmet_referral_disable(struct nvmet_port *parent, struct nvmet_port *port);
 480
 481u16 nvmet_copy_to_sgl(struct nvmet_req *req, off_t off, const void *buf,
 482                size_t len);
 483u16 nvmet_copy_from_sgl(struct nvmet_req *req, off_t off, void *buf,
 484                size_t len);
 485u16 nvmet_zero_sgl(struct nvmet_req *req, off_t off, size_t len);
 486
 487u32 nvmet_get_log_page_len(struct nvme_command *cmd);
 488u64 nvmet_get_log_page_offset(struct nvme_command *cmd);
 489
 490extern struct list_head *nvmet_ports;
 491void nvmet_port_disc_changed(struct nvmet_port *port,
 492                struct nvmet_subsys *subsys);
 493void nvmet_subsys_disc_changed(struct nvmet_subsys *subsys,
 494                struct nvmet_host *host);
 495void nvmet_add_async_event(struct nvmet_ctrl *ctrl, u8 event_type,
 496                u8 event_info, u8 log_page);
 497
 498#define NVMET_QUEUE_SIZE        1024
 499#define NVMET_NR_QUEUES         128
 500#define NVMET_MAX_CMD           NVMET_QUEUE_SIZE
 501
 502/*
 503 * Nice round number that makes a list of nsids fit into a page.
 504 * Should become tunable at some point in the future.
 505 */
 506#define NVMET_MAX_NAMESPACES    1024
 507
 508/*
 509 * 0 is not a valid ANA group ID, so we start numbering at 1.
 510 *
 511 * ANA Group 1 exists without manual intervention, has namespaces assigned to it
 512 * by default, and is available in an optimized state through all ports.
 513 */
 514#define NVMET_MAX_ANAGRPS       128
 515#define NVMET_DEFAULT_ANA_GRPID 1
 516
 517#define NVMET_KAS               10
 518#define NVMET_DISC_KATO_MS              120000
 519
 520int __init nvmet_init_configfs(void);
 521void __exit nvmet_exit_configfs(void);
 522
 523int __init nvmet_init_discovery(void);
 524void nvmet_exit_discovery(void);
 525
 526extern struct nvmet_subsys *nvmet_disc_subsys;
 527extern struct rw_semaphore nvmet_config_sem;
 528
 529extern u32 nvmet_ana_group_enabled[NVMET_MAX_ANAGRPS + 1];
 530extern u64 nvmet_ana_chgcnt;
 531extern struct rw_semaphore nvmet_ana_sem;
 532
 533bool nvmet_host_allowed(struct nvmet_subsys *subsys, const char *hostnqn);
 534
 535int nvmet_bdev_ns_enable(struct nvmet_ns *ns);
 536int nvmet_file_ns_enable(struct nvmet_ns *ns);
 537void nvmet_bdev_ns_disable(struct nvmet_ns *ns);
 538void nvmet_file_ns_disable(struct nvmet_ns *ns);
 539u16 nvmet_bdev_flush(struct nvmet_req *req);
 540u16 nvmet_file_flush(struct nvmet_req *req);
 541void nvmet_ns_changed(struct nvmet_subsys *subsys, u32 nsid);
 542void nvmet_bdev_ns_revalidate(struct nvmet_ns *ns);
 543int nvmet_file_ns_revalidate(struct nvmet_ns *ns);
 544void nvmet_ns_revalidate(struct nvmet_ns *ns);
 545u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts);
 546
 547bool nvmet_bdev_zns_enable(struct nvmet_ns *ns);
 548void nvmet_execute_identify_cns_cs_ctrl(struct nvmet_req *req);
 549void nvmet_execute_identify_cns_cs_ns(struct nvmet_req *req);
 550void nvmet_bdev_execute_zone_mgmt_recv(struct nvmet_req *req);
 551void nvmet_bdev_execute_zone_mgmt_send(struct nvmet_req *req);
 552void nvmet_bdev_execute_zone_append(struct nvmet_req *req);
 553
 554static inline u32 nvmet_rw_data_len(struct nvmet_req *req)
 555{
 556        return ((u32)le16_to_cpu(req->cmd->rw.length) + 1) <<
 557                        req->ns->blksize_shift;
 558}
 559
 560static inline u32 nvmet_rw_metadata_len(struct nvmet_req *req)
 561{
 562        if (!IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY))
 563                return 0;
 564        return ((u32)le16_to_cpu(req->cmd->rw.length) + 1) *
 565                        req->ns->metadata_size;
 566}
 567
 568static inline u32 nvmet_dsm_len(struct nvmet_req *req)
 569{
 570        return (le32_to_cpu(req->cmd->dsm.nr) + 1) *
 571                sizeof(struct nvme_dsm_range);
 572}
 573
 574static inline struct nvmet_subsys *nvmet_req_subsys(struct nvmet_req *req)
 575{
 576        return req->sq->ctrl->subsys;
 577}
 578
 579#ifdef CONFIG_NVME_TARGET_PASSTHRU
 580void nvmet_passthru_subsys_free(struct nvmet_subsys *subsys);
 581int nvmet_passthru_ctrl_enable(struct nvmet_subsys *subsys);
 582void nvmet_passthru_ctrl_disable(struct nvmet_subsys *subsys);
 583u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req);
 584u16 nvmet_parse_passthru_io_cmd(struct nvmet_req *req);
 585static inline bool nvmet_is_passthru_subsys(struct nvmet_subsys *subsys)
 586{
 587        return subsys->passthru_ctrl;
 588}
 589#else /* CONFIG_NVME_TARGET_PASSTHRU */
 590static inline void nvmet_passthru_subsys_free(struct nvmet_subsys *subsys)
 591{
 592}
 593static inline void nvmet_passthru_ctrl_disable(struct nvmet_subsys *subsys)
 594{
 595}
 596static inline u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req)
 597{
 598        return 0;
 599}
 600static inline u16 nvmet_parse_passthru_io_cmd(struct nvmet_req *req)
 601{
 602        return 0;
 603}
 604static inline bool nvmet_is_passthru_subsys(struct nvmet_subsys *subsys)
 605{
 606        return NULL;
 607}
 608#endif /* CONFIG_NVME_TARGET_PASSTHRU */
 609
 610static inline bool nvmet_is_passthru_req(struct nvmet_req *req)
 611{
 612        return nvmet_is_passthru_subsys(nvmet_req_subsys(req));
 613}
 614
 615void nvmet_passthrough_override_cap(struct nvmet_ctrl *ctrl);
 616
 617u16 errno_to_nvme_status(struct nvmet_req *req, int errno);
 618u16 nvmet_report_invalid_opcode(struct nvmet_req *req);
 619
 620/* Convert a 32-bit number to a 16-bit 0's based number */
 621static inline __le16 to0based(u32 a)
 622{
 623        return cpu_to_le16(max(1U, min(1U << 16, a)) - 1);
 624}
 625
 626static inline bool nvmet_ns_has_pi(struct nvmet_ns *ns)
 627{
 628        if (!IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY))
 629                return false;
 630        return ns->pi_type && ns->metadata_size == sizeof(struct t10_pi_tuple);
 631}
 632
 633static inline __le64 nvmet_sect_to_lba(struct nvmet_ns *ns, sector_t sect)
 634{
 635        return cpu_to_le64(sect >> (ns->blksize_shift - SECTOR_SHIFT));
 636}
 637
 638static inline sector_t nvmet_lba_to_sect(struct nvmet_ns *ns, __le64 lba)
 639{
 640        return le64_to_cpu(lba) << (ns->blksize_shift - SECTOR_SHIFT);
 641}
 642
 643static inline bool nvmet_use_inline_bvec(struct nvmet_req *req)
 644{
 645        return req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN &&
 646               req->sg_cnt <= NVMET_MAX_INLINE_BIOVEC;
 647}
 648
 649static inline void nvmet_req_cns_error_complete(struct nvmet_req *req)
 650{
 651        pr_debug("unhandled identify cns %d on qid %d\n",
 652               req->cmd->identify.cns, req->sq->qid);
 653        req->error_loc = offsetof(struct nvme_identify, cns);
 654        nvmet_req_complete(req, NVME_SC_INVALID_FIELD | NVME_SC_DNR);
 655}
 656
 657static inline void nvmet_req_bio_put(struct nvmet_req *req, struct bio *bio)
 658{
 659        if (bio != &req->b.inline_bio)
 660                bio_put(bio);
 661}
 662
 663#endif /* _NVMET_H */
 664