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 31 enum rnbd_clt_dev_state { 32 DEV_STATE_INIT, 33 DEV_STATE_MAPPED, 34 DEV_STATE_MAPPED_DISCONNECTED, 35 DEV_STATE_UNMAPPED, 36 }; 37 38 struct 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 50 struct 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 70 struct rnbd_cpu_qlist { 71 struct list_head requeue_list; 72 spinlock_t requeue_lock; 73 unsigned int cpu; 74 }; 75 76 struct 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 */ 101 struct 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 108 struct 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 145 struct 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); 151 int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force, 152 const struct attribute *sysfs_self); 153 154 int rnbd_clt_remap_device(struct rnbd_clt_dev *dev); 155 int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize); 156 157 /* rnbd-clt-sysfs.c */ 158 159 int rnbd_clt_create_sysfs_files(void); 160 161 void rnbd_clt_destroy_sysfs_files(void); 162 163 void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev); 164 165 #endif /* RNBD_CLT_H */ 166