Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * RDMA Network Block Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #undef pr_fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include "rnbd-srv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include "rnbd-srv-dev.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) MODULE_DESCRIPTION("RDMA Network Block Device Server");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) static u16 port_nr = RTRS_PORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) module_param_named(port_nr, port_nr, ushort, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) MODULE_PARM_DESC(port_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 		 "The port number the server is listening on (default: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 		 __stringify(RTRS_PORT)")");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define DEFAULT_DEV_SEARCH_PATH "/"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) static char dev_search_path[PATH_MAX] = DEFAULT_DEV_SEARCH_PATH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) static int dev_search_path_set(const char *val, const struct kernel_param *kp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	const char *p = strrchr(val, '\n') ? : val + strlen(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	if (strlen(val) >= sizeof(dev_search_path))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	snprintf(dev_search_path, sizeof(dev_search_path), "%.*s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 		 (int)(p - val), val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	pr_info("dev_search_path changed to '%s'\n", dev_search_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) static struct kparam_string dev_search_path_kparam_str = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	.maxlen	= sizeof(dev_search_path),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	.string	= dev_search_path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) static const struct kernel_param_ops dev_search_path_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	.set	= dev_search_path_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	.get	= param_get_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) module_param_cb(dev_search_path, &dev_search_path_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		&dev_search_path_kparam_str, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) MODULE_PARM_DESC(dev_search_path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		 "Sets the dev_search_path. When a device is mapped this path is prepended to the device path from the map device operation.  If %SESSNAME% is specified in a path, then device will be searched in a session namespace. (default: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		 DEFAULT_DEV_SEARCH_PATH ")");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) static DEFINE_MUTEX(sess_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) static DEFINE_SPINLOCK(dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) static LIST_HEAD(sess_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) static LIST_HEAD(dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) struct rnbd_io_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	struct rtrs_srv_op		*id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	struct rnbd_srv_sess_dev	*sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) static void rnbd_sess_dev_release(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	sess_dev = container_of(kref, struct rnbd_srv_sess_dev, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	complete(sess_dev->destroy_comp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) static inline void rnbd_put_sess_dev(struct rnbd_srv_sess_dev *sess_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	kref_put(&sess_dev->kref, rnbd_sess_dev_release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) void rnbd_endio(void *priv, int error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	struct rnbd_io_private *rnbd_priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	struct rnbd_srv_sess_dev *sess_dev = rnbd_priv->sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	rnbd_put_sess_dev(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	rtrs_srv_resp_rdma(rnbd_priv->id, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) static struct rnbd_srv_sess_dev *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	sess_dev = xa_load(&srv_sess->index_idr, dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	if (likely(sess_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		ret = kref_get_unless_zero(&sess_dev->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	if (!sess_dev || !ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		return ERR_PTR(-ENXIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	return sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static int process_rdma(struct rtrs_srv *sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 			struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 			struct rtrs_srv_op *id, void *data, u32 datalen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 			const void *usr, size_t usrlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	const struct rnbd_msg_io *msg = usr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	struct rnbd_io_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	u32 dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	struct rnbd_dev_blk_io *io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	struct bio *bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	short prio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	priv = kmalloc(sizeof(*priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	if (!priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	dev_id = le32_to_cpu(msg->device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	sess_dev = rnbd_get_sess_dev(dev_id, srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	if (IS_ERR(sess_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		pr_err_ratelimited("Got I/O request on session %s for unknown device id %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 				   srv_sess->sessname, dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	priv->sess_dev = sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	priv->id = id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	/* Generate bio with pages pointing to the rdma buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	if (IS_ERR(bio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		err = PTR_ERR(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		rnbd_srv_err(sess_dev, "Failed to generate bio, err: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		goto sess_dev_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	io = container_of(bio, struct rnbd_dev_blk_io, bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	io->dev = sess_dev->rnbd_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	io->priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	bio->bi_end_io = rnbd_dev_bi_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	bio->bi_private = io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	bio->bi_iter.bi_sector = le64_to_cpu(msg->sector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	       usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	bio_set_prio(bio, prio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	bio_set_dev(bio, sess_dev->rnbd_dev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	submit_bio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) sess_dev_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	rnbd_put_sess_dev(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static void destroy_device(struct rnbd_srv_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	WARN_ONCE(!list_empty(&dev->sess_dev_list),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		  "Device %s is being destroyed but still in use!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		  dev->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	spin_lock(&dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	list_del(&dev->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	spin_unlock(&dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	mutex_destroy(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	if (dev->dev_kobj.state_in_sysfs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		 * Destroy kobj only if it was really created.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		rnbd_srv_destroy_dev_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) static void destroy_device_cb(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	struct rnbd_srv_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	dev = container_of(kref, struct rnbd_srv_dev, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	destroy_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static void rnbd_put_srv_dev(struct rnbd_srv_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	kref_put(&dev->kref, destroy_device_cb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	DECLARE_COMPLETION_ONSTACK(dc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	xa_erase(&sess_dev->sess->index_idr, sess_dev->device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	sess_dev->destroy_comp = &dc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	rnbd_put_sess_dev(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	wait_for_completion(&dc); /* wait for inflights to drop to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	rnbd_dev_close(sess_dev->rnbd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	list_del(&sess_dev->sess_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	mutex_lock(&sess_dev->dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	list_del(&sess_dev->dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	if (sess_dev->open_flags & FMODE_WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		sess_dev->dev->open_write_cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	mutex_unlock(&sess_dev->dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	rnbd_put_srv_dev(sess_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	rnbd_srv_info(sess_dev, "Device closed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	kfree(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static void destroy_sess(struct rnbd_srv_session *srv_sess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	struct rnbd_srv_sess_dev *sess_dev, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	if (list_empty(&srv_sess->sess_dev_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	mutex_lock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	list_for_each_entry_safe(sess_dev, tmp, &srv_sess->sess_dev_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 				 sess_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		rnbd_srv_destroy_dev_session_sysfs(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	mutex_unlock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	xa_destroy(&srv_sess->index_idr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	bioset_exit(&srv_sess->sess_bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	pr_info("RTRS Session %s disconnected\n", srv_sess->sessname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	mutex_lock(&sess_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	list_del(&srv_sess->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	mutex_unlock(&sess_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	mutex_destroy(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	kfree(srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static int create_sess(struct rtrs_srv *rtrs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	struct rnbd_srv_session *srv_sess;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	char sessname[NAME_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	err = rtrs_srv_get_sess_name(rtrs, sessname, sizeof(sessname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		pr_err("rtrs_srv_get_sess_name(%s): %d\n", sessname, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	srv_sess = kzalloc(sizeof(*srv_sess), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	if (!srv_sess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	srv_sess->queue_depth = rtrs_srv_get_queue_depth(rtrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	err = bioset_init(&srv_sess->sess_bio_set, srv_sess->queue_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 			  offsetof(struct rnbd_dev_blk_io, bio),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 			  BIOSET_NEED_BVECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		pr_err("Allocating srv_session for session %s failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 		       sessname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		kfree(srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	xa_init_flags(&srv_sess->index_idr, XA_FLAGS_ALLOC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	INIT_LIST_HEAD(&srv_sess->sess_dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	mutex_init(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	mutex_lock(&sess_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	list_add(&srv_sess->list, &sess_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	mutex_unlock(&sess_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	srv_sess->rtrs = rtrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	strlcpy(srv_sess->sessname, sessname, sizeof(srv_sess->sessname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	rtrs_srv_set_sess_priv(rtrs, srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static int rnbd_srv_link_ev(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 			     enum rtrs_srv_link_ev ev, void *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	struct rnbd_srv_session *srv_sess = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	switch (ev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	case RTRS_SRV_LINK_EV_CONNECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 		return create_sess(rtrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	case RTRS_SRV_LINK_EV_DISCONNECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		if (WARN_ON_ONCE(!srv_sess))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		destroy_sess(srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		pr_warn("Received unknown RTRS session event %d from session %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 			ev, srv_sess->sessname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) static int process_msg_close(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 			     struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 			     void *data, size_t datalen, const void *usr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 			     size_t usrlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	const struct rnbd_msg_close *close_msg = usr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	sess_dev = rnbd_get_sess_dev(le32_to_cpu(close_msg->device_id),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 				      srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	if (IS_ERR(sess_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	rnbd_put_sess_dev(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	mutex_lock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	rnbd_srv_destroy_dev_session_sysfs(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	mutex_unlock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static int process_msg_open(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 			    struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 			    const void *msg, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 			    void *data, size_t datalen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) static int process_msg_sess_info(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 				 struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 				 const void *msg, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 				 void *data, size_t datalen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) static int rnbd_srv_rdma_ev(struct rtrs_srv *rtrs, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 			     struct rtrs_srv_op *id, int dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 			     void *data, size_t datalen, const void *usr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 			     size_t usrlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	struct rnbd_srv_session *srv_sess = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	const struct rnbd_msg_hdr *hdr = usr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	u16 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	if (WARN_ON_ONCE(!srv_sess))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	type = le16_to_cpu(hdr->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	case RNBD_MSG_IO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		return process_rdma(rtrs, srv_sess, id, data, datalen, usr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 				    usrlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	case RNBD_MSG_CLOSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		ret = process_msg_close(rtrs, srv_sess, data, datalen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 					usr, usrlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	case RNBD_MSG_OPEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 		ret = process_msg_open(rtrs, srv_sess, usr, usrlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 				       data, datalen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	case RNBD_MSG_SESS_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		ret = process_msg_sess_info(rtrs, srv_sess, usr, usrlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 					    data, datalen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 		pr_warn("Received unexpected message type %d with dir %d from session %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 			type, dir, srv_sess->sessname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	rtrs_srv_resp_rdma(id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) static struct rnbd_srv_sess_dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) *rnbd_sess_dev_alloc(struct rnbd_srv_session *srv_sess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	sess_dev = kzalloc(sizeof(*sess_dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	if (!sess_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	error = xa_alloc(&srv_sess->index_idr, &sess_dev->device_id, sess_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 			 xa_limit_32b, GFP_NOWAIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	if (error < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		pr_warn("Allocating idr failed, err: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 		kfree(sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 		return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	return sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) static struct rnbd_srv_dev *rnbd_srv_init_srv_dev(const char *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	struct rnbd_srv_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	strlcpy(dev->id, id, sizeof(dev->id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	kref_init(&dev->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	INIT_LIST_HEAD(&dev->sess_dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	mutex_init(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) static struct rnbd_srv_dev *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) rnbd_srv_find_or_add_srv_dev(struct rnbd_srv_dev *new_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	struct rnbd_srv_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	spin_lock(&dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	list_for_each_entry(dev, &dev_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 		if (!strncmp(dev->id, new_dev->id, sizeof(dev->id))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 			if (!kref_get_unless_zero(&dev->kref))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 				/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 				 * We lost the race, device is almost dead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 				 *  Continue traversing to find a valid one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 			spin_unlock(&dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 			return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	list_add(&new_dev->list, &dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	spin_unlock(&dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	return new_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) static int rnbd_srv_check_update_open_perm(struct rnbd_srv_dev *srv_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 					    struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 					    enum rnbd_access_mode access_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	int ret = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	mutex_lock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	switch (access_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	case RNBD_ACCESS_RO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	case RNBD_ACCESS_RW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 		if (srv_dev->open_write_cnt == 0)  {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 			srv_dev->open_write_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 			pr_err("Mapping device '%s' for session %s with RW permissions failed. Device already opened as 'RW' by %d client(s), access mode %s.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 			       srv_dev->id, srv_sess->sessname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 			       srv_dev->open_write_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 			       rnbd_access_mode_str(access_mode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	case RNBD_ACCESS_MIGRATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 		if (srv_dev->open_write_cnt < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 			srv_dev->open_write_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 			pr_err("Mapping device '%s' for session %s with migration permissions failed. Device already opened as 'RW' by %d client(s), access mode %s.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 			       srv_dev->id, srv_sess->sessname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 			       srv_dev->open_write_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 			       rnbd_access_mode_str(access_mode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 		pr_err("Received mapping request for device '%s' on session %s with invalid access mode: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 		       srv_dev->id, srv_sess->sessname, access_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	mutex_unlock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) static struct rnbd_srv_dev *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) rnbd_srv_get_or_create_srv_dev(struct rnbd_dev *rnbd_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 				struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 				enum rnbd_access_mode access_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	struct rnbd_srv_dev *new_dev, *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	new_dev = rnbd_srv_init_srv_dev(rnbd_dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	if (IS_ERR(new_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 		return new_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	dev = rnbd_srv_find_or_add_srv_dev(new_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 	if (dev != new_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 		kfree(new_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	ret = rnbd_srv_check_update_open_perm(dev, srv_sess, access_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 		rnbd_put_srv_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 		return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 					struct rnbd_srv_sess_dev *sess_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	struct rnbd_dev *rnbd_dev = sess_dev->rnbd_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	rsp->hdr.type = cpu_to_le16(RNBD_MSG_OPEN_RSP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 	rsp->device_id =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 		cpu_to_le32(sess_dev->device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	rsp->nsectors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 		cpu_to_le64(get_capacity(rnbd_dev->bdev->bd_disk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	rsp->logical_block_size	=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 		cpu_to_le16(bdev_logical_block_size(rnbd_dev->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	rsp->physical_block_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 		cpu_to_le16(bdev_physical_block_size(rnbd_dev->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	rsp->max_segments =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 		cpu_to_le16(rnbd_dev_get_max_segs(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	rsp->max_hw_sectors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 		cpu_to_le32(rnbd_dev_get_max_hw_sects(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	rsp->max_write_same_sectors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 		cpu_to_le32(bdev_write_same(rnbd_dev->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	rsp->max_discard_sectors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 		cpu_to_le32(rnbd_dev_get_max_discard_sects(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	rsp->discard_granularity =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 		cpu_to_le32(rnbd_dev_get_discard_granularity(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	rsp->discard_alignment =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 		cpu_to_le32(rnbd_dev_get_discard_alignment(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	rsp->secure_discard =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 		cpu_to_le16(rnbd_dev_get_secure_discard(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	rsp->rotational =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 		!blk_queue_nonrot(bdev_get_queue(rnbd_dev->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) static struct rnbd_srv_sess_dev *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) rnbd_srv_create_set_sess_dev(struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 			      const struct rnbd_msg_open *open_msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 			      struct rnbd_dev *rnbd_dev, fmode_t open_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 			      struct rnbd_srv_dev *srv_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	struct rnbd_srv_sess_dev *sdev = rnbd_sess_dev_alloc(srv_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 	if (IS_ERR(sdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 		return sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 	kref_init(&sdev->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	strlcpy(sdev->pathname, open_msg->dev_name, sizeof(sdev->pathname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	sdev->rnbd_dev		= rnbd_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 	sdev->sess		= srv_sess;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	sdev->dev		= srv_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	sdev->open_flags	= open_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	sdev->access_mode	= open_msg->access_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	return sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) static char *rnbd_srv_get_full_path(struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 				     const char *dev_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 	char *full_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 	char *a, *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 	full_path = kmalloc(PATH_MAX, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 	if (!full_path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 	 * Replace %SESSNAME% with a real session name in order to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 	 * create device namespace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 	a = strnstr(dev_search_path, "%SESSNAME%", sizeof(dev_search_path));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	if (a) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 		int len = a - dev_search_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 		len = snprintf(full_path, PATH_MAX, "%.*s/%s/%s", len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 			       dev_search_path, srv_sess->sessname, dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 		if (len >= PATH_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 			pr_err("Too long path: %s, %s, %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 			       dev_search_path, srv_sess->sessname, dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 			kfree(full_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 			return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 		snprintf(full_path, PATH_MAX, "%s/%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 			 dev_search_path, dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 	/* eliminitate duplicated slashes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 	a = strchr(full_path, '/');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 	b = a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 	while (*b != '\0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 		if (*b == '/' && *a == '/') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 			b++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 			a++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 			*a = *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 			b++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 	a++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 	*a = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 	return full_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) static int process_msg_sess_info(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 				 struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 				 const void *msg, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 				 void *data, size_t datalen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 	const struct rnbd_msg_sess_info *sess_info_msg = msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 	struct rnbd_msg_sess_info_rsp *rsp = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 	srv_sess->ver = min_t(u8, sess_info_msg->ver, RNBD_PROTO_VER_MAJOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 	pr_debug("Session %s using protocol version %d (client version: %d, server version: %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 		 srv_sess->sessname, srv_sess->ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 		 sess_info_msg->ver, RNBD_PROTO_VER_MAJOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 	rsp->hdr.type = cpu_to_le16(RNBD_MSG_SESS_INFO_RSP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 	rsp->ver = srv_sess->ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)  * find_srv_sess_dev() - a dev is already opened by this name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)  * @srv_sess:	the session to search.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)  * @dev_name:	string containing the name of the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)  * Return struct rnbd_srv_sess_dev if srv_sess already opened the dev_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)  * NULL if the session didn't open the device yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) static struct rnbd_srv_sess_dev *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) find_srv_sess_dev(struct rnbd_srv_session *srv_sess, const char *dev_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 	struct rnbd_srv_sess_dev *sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	if (list_empty(&srv_sess->sess_dev_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 	list_for_each_entry(sess_dev, &srv_sess->sess_dev_list, sess_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 		if (!strcmp(sess_dev->pathname, dev_name))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 			return sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) static int process_msg_open(struct rtrs_srv *rtrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 			    struct rnbd_srv_session *srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 			    const void *msg, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 			    void *data, size_t datalen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 	struct rnbd_srv_dev *srv_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 	struct rnbd_srv_sess_dev *srv_sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 	const struct rnbd_msg_open *open_msg = msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 	fmode_t open_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 	char *full_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 	struct rnbd_dev *rnbd_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 	struct rnbd_msg_open_rsp *rsp = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 	pr_debug("Open message received: session='%s' path='%s' access_mode=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 		 srv_sess->sessname, open_msg->dev_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 		 open_msg->access_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 	open_flags = FMODE_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 	if (open_msg->access_mode != RNBD_ACCESS_RO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 		open_flags |= FMODE_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 	mutex_lock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 	srv_sess_dev = find_srv_sess_dev(srv_sess, open_msg->dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 	if (srv_sess_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 		goto fill_response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 	if ((strlen(dev_search_path) + strlen(open_msg->dev_name))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 	    >= PATH_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 		pr_err("Opening device for session %s failed, device path too long. '%s/%s' is longer than PATH_MAX (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 		       srv_sess->sessname, dev_search_path, open_msg->dev_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		       PATH_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 		goto reject;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 	if (strstr(open_msg->dev_name, "..")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 		pr_err("Opening device for session %s failed, device path %s contains relative path ..\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 		       srv_sess->sessname, open_msg->dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 		goto reject;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 	full_path = rnbd_srv_get_full_path(srv_sess, open_msg->dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 	if (IS_ERR(full_path)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 		ret = PTR_ERR(full_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 		pr_err("Opening device '%s' for client %s failed, failed to get device full path, err: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 		       open_msg->dev_name, srv_sess->sessname, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 		goto reject;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 	rnbd_dev = rnbd_dev_open(full_path, open_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 				 &srv_sess->sess_bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 	if (IS_ERR(rnbd_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 		pr_err("Opening device '%s' on session %s failed, failed to open the block device, err: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 		       full_path, srv_sess->sessname, PTR_ERR(rnbd_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 		ret = PTR_ERR(rnbd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 		goto free_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 	srv_dev = rnbd_srv_get_or_create_srv_dev(rnbd_dev, srv_sess,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 						  open_msg->access_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 	if (IS_ERR(srv_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 		pr_err("Opening device '%s' on session %s failed, creating srv_dev failed, err: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 		       full_path, srv_sess->sessname, PTR_ERR(srv_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 		ret = PTR_ERR(srv_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 		goto rnbd_dev_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 	srv_sess_dev = rnbd_srv_create_set_sess_dev(srv_sess, open_msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 						     rnbd_dev, open_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 						     srv_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 	if (IS_ERR(srv_sess_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 		pr_err("Opening device '%s' on session %s failed, creating sess_dev failed, err: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 		       full_path, srv_sess->sessname, PTR_ERR(srv_sess_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 		ret = PTR_ERR(srv_sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 		goto srv_dev_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 	/* Create the srv_dev sysfs files if they haven't been created yet. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 	 * reason to delay the creation is not to create the sysfs files before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 	 * we are sure the device can be opened.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 	mutex_lock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 	if (!srv_dev->dev_kobj.state_in_sysfs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 		ret = rnbd_srv_create_dev_sysfs(srv_dev, rnbd_dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 						 rnbd_dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 			mutex_unlock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) 			rnbd_srv_err(srv_sess_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) 				      "Opening device failed, failed to create device sysfs files, err: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 				      ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 			goto free_srv_sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 	ret = rnbd_srv_create_dev_session_sysfs(srv_sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 		mutex_unlock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 		rnbd_srv_err(srv_sess_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 			      "Opening device failed, failed to create dev client sysfs files, err: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 			      ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 		goto free_srv_sess_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 	list_add(&srv_sess_dev->dev_list, &srv_dev->sess_dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 	mutex_unlock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 	list_add(&srv_sess_dev->sess_list, &srv_sess->sess_dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 	rnbd_srv_info(srv_sess_dev, "Opened device '%s'\n", srv_dev->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 	kfree(full_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) fill_response:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 	rnbd_srv_fill_msg_open_rsp(rsp, srv_sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 	mutex_unlock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) free_srv_sess_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 	xa_erase(&srv_sess->index_idr, srv_sess_dev->device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 	synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 	kfree(srv_sess_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) srv_dev_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 	if (open_msg->access_mode != RNBD_ACCESS_RO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 		mutex_lock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 		srv_dev->open_write_cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 		mutex_unlock(&srv_dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 	rnbd_put_srv_dev(srv_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) rnbd_dev_close:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) 	rnbd_dev_close(rnbd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) free_path:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) 	kfree(full_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) reject:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) 	mutex_unlock(&srv_sess->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static struct rtrs_srv_ctx *rtrs_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static struct rtrs_srv_ops rtrs_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) static int __init rnbd_srv_init_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_hdr) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_sess_info) != 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_sess_info_rsp) != 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_open) != 264);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_close) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) 	BUILD_BUG_ON(sizeof(struct rnbd_msg_open_rsp) != 56);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) 	rtrs_ops = (struct rtrs_srv_ops) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) 		.rdma_ev = rnbd_srv_rdma_ev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) 		.link_ev = rnbd_srv_link_ev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) 	rtrs_ctx = rtrs_srv_open(&rtrs_ops, port_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) 	if (IS_ERR(rtrs_ctx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) 		err = PTR_ERR(rtrs_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) 		pr_err("rtrs_srv_open(), err: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) 	err = rnbd_srv_create_sysfs_files();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) 		pr_err("rnbd_srv_create_sysfs_files(), err: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) 		rtrs_srv_close(rtrs_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) static void __exit rnbd_srv_cleanup_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) 	rtrs_srv_close(rtrs_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) 	WARN_ON(!list_empty(&sess_list));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) 	rnbd_srv_destroy_sysfs_files();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) module_init(rnbd_srv_init_module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) module_exit(rnbd_srv_cleanup_module);