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