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#ifndef RNBD_SRV_H 10#define RNBD_SRV_H 11 12#include <linux/types.h> 13#include <linux/idr.h> 14#include <linux/kref.h> 15 16#include <rtrs.h> 17#include "rnbd-proto.h" 18#include "rnbd-log.h" 19 20struct rnbd_srv_session { 21 /* Entry inside global sess_list */ 22 struct list_head list; 23 struct rtrs_srv *rtrs; 24 char sessname[NAME_MAX]; 25 int queue_depth; 26 struct bio_set sess_bio_set; 27 28 struct xarray index_idr; 29 /* List of struct rnbd_srv_sess_dev */ 30 struct list_head sess_dev_list; 31 struct mutex lock; 32 u8 ver; 33}; 34 35struct rnbd_srv_dev { 36 /* Entry inside global dev_list */ 37 struct list_head list; 38 struct kobject dev_kobj; 39 struct kobject *dev_sessions_kobj; 40 struct kref kref; 41 char id[NAME_MAX]; 42 /* List of rnbd_srv_sess_dev structs */ 43 struct list_head sess_dev_list; 44 struct mutex lock; 45 int open_write_cnt; 46}; 47 48/* Structure which binds N devices and N sessions */ 49struct rnbd_srv_sess_dev { 50 /* Entry inside rnbd_srv_dev struct */ 51 struct list_head dev_list; 52 /* Entry inside rnbd_srv_session struct */ 53 struct list_head sess_list; 54 struct rnbd_dev *rnbd_dev; 55 struct rnbd_srv_session *sess; 56 struct rnbd_srv_dev *dev; 57 struct kobject kobj; 58 u32 device_id; 59 bool keep_id; 60 fmode_t open_flags; 61 struct kref kref; 62 struct completion *destroy_comp; 63 char pathname[NAME_MAX]; 64 enum rnbd_access_mode access_mode; 65}; 66 67void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev, 68 struct kobj_attribute *attr); 69/* rnbd-srv-sysfs.c */ 70 71int rnbd_srv_create_dev_sysfs(struct rnbd_srv_dev *dev, 72 struct block_device *bdev, 73 const char *dir_name); 74void rnbd_srv_destroy_dev_sysfs(struct rnbd_srv_dev *dev); 75int rnbd_srv_create_dev_session_sysfs(struct rnbd_srv_sess_dev *sess_dev); 76void rnbd_srv_destroy_dev_session_sysfs(struct rnbd_srv_sess_dev *sess_dev); 77int rnbd_srv_create_sysfs_files(void); 78void rnbd_srv_destroy_sysfs_files(void); 79void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id); 80 81#endif /* RNBD_SRV_H */ 82