linux/drivers/block/rnbd/rnbd-clt.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * RDMA Network Block Driver
   4 *
   5 * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
   6 * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
   7 * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
   8 */
   9
  10#ifndef RNBD_CLT_H
  11#define RNBD_CLT_H
  12
  13#include <linux/wait.h>
  14#include <linux/in.h>
  15#include <linux/inet.h>
  16#include <linux/blk-mq.h>
  17#include <linux/refcount.h>
  18
  19#include <rtrs.h>
  20#include "rnbd-proto.h"
  21#include "rnbd-log.h"
  22
  23/*  time in seconds between reconnect tries, default to 30 s */
  24#define RECONNECT_DELAY 30
  25/*
  26 * Number of times to reconnect on error before giving up, 0 for * disabled,
  27 * -1 for forever
  28 */
  29#define MAX_RECONNECTS -1
  30
  31enum rnbd_clt_dev_state {
  32        DEV_STATE_INIT,
  33        DEV_STATE_MAPPED,
  34        DEV_STATE_MAPPED_DISCONNECTED,
  35        DEV_STATE_UNMAPPED,
  36};
  37
  38struct rnbd_iu_comp {
  39        wait_queue_head_t wait;
  40        int errno;
  41};
  42
  43#ifdef CONFIG_ARCH_NO_SG_CHAIN
  44#define RNBD_INLINE_SG_CNT 0
  45#else
  46#define RNBD_INLINE_SG_CNT 2
  47#endif
  48#define RNBD_RDMA_SGL_SIZE (sizeof(struct scatterlist) * RNBD_INLINE_SG_CNT)
  49
  50struct rnbd_iu {
  51        union {
  52                struct request *rq; /* for block io */
  53                void *buf; /* for user messages */
  54        };
  55        struct rtrs_permit      *permit;
  56        union {
  57                /* use to send msg associated with a dev */
  58                struct rnbd_clt_dev *dev;
  59                /* use to send msg associated with a sess */
  60                struct rnbd_clt_session *sess;
  61        };
  62        struct sg_table         sgt;
  63        struct work_struct      work;
  64        int                     errno;
  65        struct rnbd_iu_comp     comp;
  66        atomic_t                refcount;
  67        struct scatterlist      first_sgl[]; /* must be the last one */
  68};
  69
  70struct rnbd_cpu_qlist {
  71        struct list_head        requeue_list;
  72        spinlock_t              requeue_lock;
  73        unsigned int            cpu;
  74};
  75
  76struct rnbd_clt_session {
  77        struct list_head        list;
  78        struct rtrs_clt        *rtrs;
  79        wait_queue_head_t       rtrs_waitq;
  80        bool                    rtrs_ready;
  81        struct rnbd_cpu_qlist   __percpu
  82                                *cpu_queues;
  83        DECLARE_BITMAP(cpu_queues_bm, NR_CPUS);
  84        int     __percpu        *cpu_rr; /* per-cpu var for CPU round-robin */
  85        atomic_t                busy;
  86        size_t                  queue_depth;
  87        u32                     max_io_size;
  88        u32                     max_segments;
  89        struct blk_mq_tag_set   tag_set;
  90        u32                     nr_poll_queues;
  91        struct mutex            lock; /* protects state and devs_list */
  92        struct list_head        devs_list; /* list of struct rnbd_clt_dev */
  93        refcount_t              refcount;
  94        char                    sessname[NAME_MAX];
  95        u8                      ver; /* protocol version */
  96};
  97
  98/**
  99 * Submission queues.
 100 */
 101struct rnbd_queue {
 102        struct list_head        requeue_list;
 103        unsigned long           in_list;
 104        struct rnbd_clt_dev     *dev;
 105        struct blk_mq_hw_ctx    *hctx;
 106};
 107
 108struct rnbd_clt_dev {
 109        struct rnbd_clt_session *sess;
 110        struct request_queue    *queue;
 111        struct rnbd_queue       *hw_queues;
 112        u32                     device_id;
 113        /* local Idr index - used to track minor number allocations. */
 114        u32                     clt_device_id;
 115        struct mutex            lock;
 116        enum rnbd_clt_dev_state dev_state;
 117        char                    *pathname;
 118        enum rnbd_access_mode   access_mode;
 119        u32                     nr_poll_queues;
 120        bool                    read_only;
 121        bool                    rotational;
 122        bool                    wc;
 123        bool                    fua;
 124        u32                     max_hw_sectors;
 125        u32                     max_write_same_sectors;
 126        u32                     max_discard_sectors;
 127        u32                     discard_granularity;
 128        u32                     discard_alignment;
 129        u16                     secure_discard;
 130        u16                     physical_block_size;
 131        u16                     logical_block_size;
 132        u16                     max_segments;
 133        size_t                  nsectors;
 134        u64                     size;           /* device size in bytes */
 135        struct list_head        list;
 136        struct gendisk          *gd;
 137        struct kobject          kobj;
 138        char                    *blk_symlink_name;
 139        refcount_t              refcount;
 140        struct work_struct      unmap_on_rmmod_work;
 141};
 142
 143/* rnbd-clt.c */
 144
 145struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
 146                                           struct rtrs_addr *paths,
 147                                           size_t path_cnt, u16 port_nr,
 148                                           const char *pathname,
 149                                           enum rnbd_access_mode access_mode,
 150                                           u32 nr_poll_queues);
 151int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
 152                           const struct attribute *sysfs_self);
 153
 154int rnbd_clt_remap_device(struct rnbd_clt_dev *dev);
 155int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize);
 156
 157/* rnbd-clt-sysfs.c */
 158
 159int rnbd_clt_create_sysfs_files(void);
 160
 161void rnbd_clt_destroy_sysfs_files(void);
 162
 163void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev);
 164
 165#endif /* RNBD_CLT_H */
 166