1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * RDMA Network Block Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved. 6*4882a593Smuzhiyun * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved. 7*4882a593Smuzhiyun * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved. 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef RNBD_SRV_H 10*4882a593Smuzhiyun #define RNBD_SRV_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <linux/idr.h> 14*4882a593Smuzhiyun #include <linux/kref.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <rtrs.h> 17*4882a593Smuzhiyun #include "rnbd-proto.h" 18*4882a593Smuzhiyun #include "rnbd-log.h" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct rnbd_srv_session { 21*4882a593Smuzhiyun /* Entry inside global sess_list */ 22*4882a593Smuzhiyun struct list_head list; 23*4882a593Smuzhiyun struct rtrs_srv *rtrs; 24*4882a593Smuzhiyun char sessname[NAME_MAX]; 25*4882a593Smuzhiyun int queue_depth; 26*4882a593Smuzhiyun struct bio_set sess_bio_set; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct xarray index_idr; 29*4882a593Smuzhiyun /* List of struct rnbd_srv_sess_dev */ 30*4882a593Smuzhiyun struct list_head sess_dev_list; 31*4882a593Smuzhiyun struct mutex lock; 32*4882a593Smuzhiyun u8 ver; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct rnbd_srv_dev { 36*4882a593Smuzhiyun /* Entry inside global dev_list */ 37*4882a593Smuzhiyun struct list_head list; 38*4882a593Smuzhiyun struct kobject dev_kobj; 39*4882a593Smuzhiyun struct kobject *dev_sessions_kobj; 40*4882a593Smuzhiyun struct kref kref; 41*4882a593Smuzhiyun char id[NAME_MAX]; 42*4882a593Smuzhiyun /* List of rnbd_srv_sess_dev structs */ 43*4882a593Smuzhiyun struct list_head sess_dev_list; 44*4882a593Smuzhiyun struct mutex lock; 45*4882a593Smuzhiyun int open_write_cnt; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Structure which binds N devices and N sessions */ 49*4882a593Smuzhiyun struct rnbd_srv_sess_dev { 50*4882a593Smuzhiyun /* Entry inside rnbd_srv_dev struct */ 51*4882a593Smuzhiyun struct list_head dev_list; 52*4882a593Smuzhiyun /* Entry inside rnbd_srv_session struct */ 53*4882a593Smuzhiyun struct list_head sess_list; 54*4882a593Smuzhiyun struct rnbd_dev *rnbd_dev; 55*4882a593Smuzhiyun struct rnbd_srv_session *sess; 56*4882a593Smuzhiyun struct rnbd_srv_dev *dev; 57*4882a593Smuzhiyun struct kobject kobj; 58*4882a593Smuzhiyun u32 device_id; 59*4882a593Smuzhiyun fmode_t open_flags; 60*4882a593Smuzhiyun struct kref kref; 61*4882a593Smuzhiyun struct completion *destroy_comp; 62*4882a593Smuzhiyun char pathname[NAME_MAX]; 63*4882a593Smuzhiyun enum rnbd_access_mode access_mode; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* rnbd-srv-sysfs.c */ 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun int rnbd_srv_create_dev_sysfs(struct rnbd_srv_dev *dev, 69*4882a593Smuzhiyun struct block_device *bdev, 70*4882a593Smuzhiyun const char *dir_name); 71*4882a593Smuzhiyun void rnbd_srv_destroy_dev_sysfs(struct rnbd_srv_dev *dev); 72*4882a593Smuzhiyun int rnbd_srv_create_dev_session_sysfs(struct rnbd_srv_sess_dev *sess_dev); 73*4882a593Smuzhiyun void rnbd_srv_destroy_dev_session_sysfs(struct rnbd_srv_sess_dev *sess_dev); 74*4882a593Smuzhiyun int rnbd_srv_create_sysfs_files(void); 75*4882a593Smuzhiyun void rnbd_srv_destroy_sysfs_files(void); 76*4882a593Smuzhiyun void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev); 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #endif /* RNBD_SRV_H */ 79