Merge branch 'for-6.1/wacom' into for-linus
[linux-2.6-microblaze.git] / drivers / block / rnbd / rnbd-clt.h
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_sess        *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 kobject          kobj;
110         struct rnbd_clt_session *sess;
111         struct request_queue    *queue;
112         struct rnbd_queue       *hw_queues;
113         u32                     device_id;
114         /* local Idr index - used to track minor number allocations. */
115         u32                     clt_device_id;
116         struct mutex            lock;
117         enum rnbd_clt_dev_state dev_state;
118         refcount_t              refcount;
119         char                    *pathname;
120         enum rnbd_access_mode   access_mode;
121         u32                     nr_poll_queues;
122         u64                     size;           /* device size in bytes */
123         struct list_head        list;
124         struct gendisk          *gd;
125         char                    *blk_symlink_name;
126         struct work_struct      unmap_on_rmmod_work;
127 };
128
129 /* rnbd-clt.c */
130
131 struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
132                                            struct rtrs_addr *paths,
133                                            size_t path_cnt, u16 port_nr,
134                                            const char *pathname,
135                                            enum rnbd_access_mode access_mode,
136                                            u32 nr_poll_queues);
137 int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
138                            const struct attribute *sysfs_self);
139
140 int rnbd_clt_remap_device(struct rnbd_clt_dev *dev);
141 int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize);
142
143 /* rnbd-clt-sysfs.c */
144
145 int rnbd_clt_create_sysfs_files(void);
146
147 void rnbd_clt_destroy_sysfs_files(void);
148
149 void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev);
150
151 #endif /* RNBD_CLT_H */