0001
0002
0003
0004
0005
0006
0007
0008
0009 #undef pr_fmt
0010 #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt
0011
0012 #include <linux/module.h>
0013 #include <linux/blkdev.h>
0014
0015 #include "rnbd-srv.h"
0016 #include "rnbd-srv-dev.h"
0017
0018 MODULE_DESCRIPTION("RDMA Network Block Device Server");
0019 MODULE_LICENSE("GPL");
0020
0021 static u16 port_nr = RTRS_PORT;
0022
0023 module_param_named(port_nr, port_nr, ushort, 0444);
0024 MODULE_PARM_DESC(port_nr,
0025 "The port number the server is listening on (default: "
0026 __stringify(RTRS_PORT)")");
0027
0028 #define DEFAULT_DEV_SEARCH_PATH "/"
0029
0030 static char dev_search_path[PATH_MAX] = DEFAULT_DEV_SEARCH_PATH;
0031
0032 static int dev_search_path_set(const char *val, const struct kernel_param *kp)
0033 {
0034 const char *p = strrchr(val, '\n') ? : val + strlen(val);
0035
0036 if (strlen(val) >= sizeof(dev_search_path))
0037 return -EINVAL;
0038
0039 snprintf(dev_search_path, sizeof(dev_search_path), "%.*s",
0040 (int)(p - val), val);
0041
0042 pr_info("dev_search_path changed to '%s'\n", dev_search_path);
0043
0044 return 0;
0045 }
0046
0047 static struct kparam_string dev_search_path_kparam_str = {
0048 .maxlen = sizeof(dev_search_path),
0049 .string = dev_search_path
0050 };
0051
0052 static const struct kernel_param_ops dev_search_path_ops = {
0053 .set = dev_search_path_set,
0054 .get = param_get_string,
0055 };
0056
0057 module_param_cb(dev_search_path, &dev_search_path_ops,
0058 &dev_search_path_kparam_str, 0444);
0059 MODULE_PARM_DESC(dev_search_path,
0060 "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: "
0061 DEFAULT_DEV_SEARCH_PATH ")");
0062
0063 static DEFINE_MUTEX(sess_lock);
0064 static DEFINE_SPINLOCK(dev_lock);
0065
0066 static LIST_HEAD(sess_list);
0067 static LIST_HEAD(dev_list);
0068
0069 struct rnbd_io_private {
0070 struct rtrs_srv_op *id;
0071 struct rnbd_srv_sess_dev *sess_dev;
0072 };
0073
0074 static void rnbd_sess_dev_release(struct kref *kref)
0075 {
0076 struct rnbd_srv_sess_dev *sess_dev;
0077
0078 sess_dev = container_of(kref, struct rnbd_srv_sess_dev, kref);
0079 complete(sess_dev->destroy_comp);
0080 }
0081
0082 static inline void rnbd_put_sess_dev(struct rnbd_srv_sess_dev *sess_dev)
0083 {
0084 kref_put(&sess_dev->kref, rnbd_sess_dev_release);
0085 }
0086
0087 void rnbd_endio(void *priv, int error)
0088 {
0089 struct rnbd_io_private *rnbd_priv = priv;
0090 struct rnbd_srv_sess_dev *sess_dev = rnbd_priv->sess_dev;
0091
0092 rnbd_put_sess_dev(sess_dev);
0093
0094 rtrs_srv_resp_rdma(rnbd_priv->id, error);
0095
0096 kfree(priv);
0097 }
0098
0099 static struct rnbd_srv_sess_dev *
0100 rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
0101 {
0102 struct rnbd_srv_sess_dev *sess_dev;
0103 int ret = 0;
0104
0105 rcu_read_lock();
0106 sess_dev = xa_load(&srv_sess->index_idr, dev_id);
0107 if (sess_dev)
0108 ret = kref_get_unless_zero(&sess_dev->kref);
0109 rcu_read_unlock();
0110
0111 if (!sess_dev || !ret)
0112 return ERR_PTR(-ENXIO);
0113
0114 return sess_dev;
0115 }
0116
0117 static void rnbd_dev_bi_end_io(struct bio *bio)
0118 {
0119 rnbd_endio(bio->bi_private, blk_status_to_errno(bio->bi_status));
0120 bio_put(bio);
0121 }
0122
0123 static int process_rdma(struct rnbd_srv_session *srv_sess,
0124 struct rtrs_srv_op *id, void *data, u32 datalen,
0125 const void *usr, size_t usrlen)
0126 {
0127 const struct rnbd_msg_io *msg = usr;
0128 struct rnbd_io_private *priv;
0129 struct rnbd_srv_sess_dev *sess_dev;
0130 u32 dev_id;
0131 int err;
0132 struct bio *bio;
0133 short prio;
0134
0135 priv = kmalloc(sizeof(*priv), GFP_KERNEL);
0136 if (!priv)
0137 return -ENOMEM;
0138
0139 dev_id = le32_to_cpu(msg->device_id);
0140
0141 sess_dev = rnbd_get_sess_dev(dev_id, srv_sess);
0142 if (IS_ERR(sess_dev)) {
0143 pr_err_ratelimited("Got I/O request on session %s for unknown device id %d\n",
0144 srv_sess->sessname, dev_id);
0145 err = -ENOTCONN;
0146 goto err;
0147 }
0148
0149 priv->sess_dev = sess_dev;
0150 priv->id = id;
0151
0152 bio = bio_alloc(sess_dev->rnbd_dev->bdev, 1,
0153 rnbd_to_bio_flags(le32_to_cpu(msg->rw)), GFP_KERNEL);
0154 if (bio_add_page(bio, virt_to_page(data), datalen,
0155 offset_in_page(data)) != datalen) {
0156 rnbd_srv_err(sess_dev, "Failed to map data to bio\n");
0157 err = -EINVAL;
0158 goto bio_put;
0159 }
0160
0161 bio->bi_end_io = rnbd_dev_bi_end_io;
0162 bio->bi_private = priv;
0163 bio->bi_iter.bi_sector = le64_to_cpu(msg->sector);
0164 bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size);
0165 prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR ||
0166 usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio);
0167 bio_set_prio(bio, prio);
0168
0169 submit_bio(bio);
0170
0171 return 0;
0172
0173 bio_put:
0174 bio_put(bio);
0175 rnbd_put_sess_dev(sess_dev);
0176 err:
0177 kfree(priv);
0178 return err;
0179 }
0180
0181 static void destroy_device(struct kref *kref)
0182 {
0183 struct rnbd_srv_dev *dev = container_of(kref, struct rnbd_srv_dev, kref);
0184
0185 WARN_ONCE(!list_empty(&dev->sess_dev_list),
0186 "Device %s is being destroyed but still in use!\n",
0187 dev->id);
0188
0189 spin_lock(&dev_lock);
0190 list_del(&dev->list);
0191 spin_unlock(&dev_lock);
0192
0193 mutex_destroy(&dev->lock);
0194 if (dev->dev_kobj.state_in_sysfs)
0195
0196
0197
0198 rnbd_srv_destroy_dev_sysfs(dev);
0199 else
0200 kfree(dev);
0201 }
0202
0203 static void rnbd_put_srv_dev(struct rnbd_srv_dev *dev)
0204 {
0205 kref_put(&dev->kref, destroy_device);
0206 }
0207
0208 void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id)
0209 {
0210 DECLARE_COMPLETION_ONSTACK(dc);
0211
0212 if (keep_id)
0213
0214
0215
0216 xa_cmpxchg(&sess_dev->sess->index_idr, sess_dev->device_id,
0217 sess_dev, NULL, 0);
0218 else
0219 xa_erase(&sess_dev->sess->index_idr, sess_dev->device_id);
0220 synchronize_rcu();
0221
0222 sess_dev->destroy_comp = &dc;
0223 rnbd_put_sess_dev(sess_dev);
0224 wait_for_completion(&dc);
0225
0226 rnbd_dev_close(sess_dev->rnbd_dev);
0227 mutex_lock(&sess_dev->dev->lock);
0228 list_del(&sess_dev->dev_list);
0229 if (sess_dev->open_flags & FMODE_WRITE)
0230 sess_dev->dev->open_write_cnt--;
0231 mutex_unlock(&sess_dev->dev->lock);
0232
0233 rnbd_put_srv_dev(sess_dev->dev);
0234
0235 rnbd_srv_info(sess_dev, "Device closed\n");
0236 kfree(sess_dev);
0237 }
0238
0239 static void destroy_sess(struct rnbd_srv_session *srv_sess)
0240 {
0241 struct rnbd_srv_sess_dev *sess_dev;
0242 unsigned long index;
0243
0244 if (xa_empty(&srv_sess->index_idr))
0245 goto out;
0246
0247 mutex_lock(&srv_sess->lock);
0248 xa_for_each(&srv_sess->index_idr, index, sess_dev)
0249 rnbd_srv_destroy_dev_session_sysfs(sess_dev);
0250 mutex_unlock(&srv_sess->lock);
0251
0252 out:
0253 xa_destroy(&srv_sess->index_idr);
0254
0255 pr_info("RTRS Session %s disconnected\n", srv_sess->sessname);
0256
0257 mutex_lock(&sess_lock);
0258 list_del(&srv_sess->list);
0259 mutex_unlock(&sess_lock);
0260
0261 mutex_destroy(&srv_sess->lock);
0262 kfree(srv_sess);
0263 }
0264
0265 static int create_sess(struct rtrs_srv_sess *rtrs)
0266 {
0267 struct rnbd_srv_session *srv_sess;
0268 char pathname[NAME_MAX];
0269 int err;
0270
0271 err = rtrs_srv_get_path_name(rtrs, pathname, sizeof(pathname));
0272 if (err) {
0273 pr_err("rtrs_srv_get_path_name(%s): %d\n", pathname, err);
0274
0275 return err;
0276 }
0277 srv_sess = kzalloc(sizeof(*srv_sess), GFP_KERNEL);
0278 if (!srv_sess)
0279 return -ENOMEM;
0280
0281 srv_sess->queue_depth = rtrs_srv_get_queue_depth(rtrs);
0282 xa_init_flags(&srv_sess->index_idr, XA_FLAGS_ALLOC);
0283 mutex_init(&srv_sess->lock);
0284 mutex_lock(&sess_lock);
0285 list_add(&srv_sess->list, &sess_list);
0286 mutex_unlock(&sess_lock);
0287
0288 srv_sess->rtrs = rtrs;
0289 strscpy(srv_sess->sessname, pathname, sizeof(srv_sess->sessname));
0290
0291 rtrs_srv_set_sess_priv(rtrs, srv_sess);
0292
0293 return 0;
0294 }
0295
0296 static int rnbd_srv_link_ev(struct rtrs_srv_sess *rtrs,
0297 enum rtrs_srv_link_ev ev, void *priv)
0298 {
0299 struct rnbd_srv_session *srv_sess = priv;
0300
0301 switch (ev) {
0302 case RTRS_SRV_LINK_EV_CONNECTED:
0303 return create_sess(rtrs);
0304
0305 case RTRS_SRV_LINK_EV_DISCONNECTED:
0306 if (WARN_ON_ONCE(!srv_sess))
0307 return -EINVAL;
0308
0309 destroy_sess(srv_sess);
0310 return 0;
0311
0312 default:
0313 pr_warn("Received unknown RTRS session event %d from session %s\n",
0314 ev, srv_sess->sessname);
0315 return -EINVAL;
0316 }
0317 }
0318
0319 void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev,
0320 struct kobj_attribute *attr)
0321 {
0322 struct rnbd_srv_session *sess = sess_dev->sess;
0323
0324
0325 if (!mutex_trylock(&sess->lock))
0326 return;
0327
0328 sess_dev->keep_id = true;
0329
0330 sysfs_remove_file_self(&sess_dev->kobj, &attr->attr);
0331 rnbd_srv_destroy_dev_session_sysfs(sess_dev);
0332 mutex_unlock(&sess->lock);
0333 }
0334
0335 static int process_msg_close(struct rnbd_srv_session *srv_sess,
0336 void *data, size_t datalen, const void *usr,
0337 size_t usrlen)
0338 {
0339 const struct rnbd_msg_close *close_msg = usr;
0340 struct rnbd_srv_sess_dev *sess_dev;
0341
0342 sess_dev = rnbd_get_sess_dev(le32_to_cpu(close_msg->device_id),
0343 srv_sess);
0344 if (IS_ERR(sess_dev))
0345 return 0;
0346
0347 rnbd_put_sess_dev(sess_dev);
0348 mutex_lock(&srv_sess->lock);
0349 rnbd_srv_destroy_dev_session_sysfs(sess_dev);
0350 mutex_unlock(&srv_sess->lock);
0351 return 0;
0352 }
0353
0354 static int process_msg_open(struct rnbd_srv_session *srv_sess,
0355 const void *msg, size_t len,
0356 void *data, size_t datalen);
0357
0358 static int process_msg_sess_info(struct rnbd_srv_session *srv_sess,
0359 const void *msg, size_t len,
0360 void *data, size_t datalen);
0361
0362 static int rnbd_srv_rdma_ev(void *priv,
0363 struct rtrs_srv_op *id, int dir,
0364 void *data, size_t datalen, const void *usr,
0365 size_t usrlen)
0366 {
0367 struct rnbd_srv_session *srv_sess = priv;
0368 const struct rnbd_msg_hdr *hdr = usr;
0369 int ret = 0;
0370 u16 type;
0371
0372 if (WARN_ON_ONCE(!srv_sess))
0373 return -ENODEV;
0374
0375 type = le16_to_cpu(hdr->type);
0376
0377 switch (type) {
0378 case RNBD_MSG_IO:
0379 return process_rdma(srv_sess, id, data, datalen, usr, usrlen);
0380 case RNBD_MSG_CLOSE:
0381 ret = process_msg_close(srv_sess, data, datalen, usr, usrlen);
0382 break;
0383 case RNBD_MSG_OPEN:
0384 ret = process_msg_open(srv_sess, usr, usrlen, data, datalen);
0385 break;
0386 case RNBD_MSG_SESS_INFO:
0387 ret = process_msg_sess_info(srv_sess, usr, usrlen, data,
0388 datalen);
0389 break;
0390 default:
0391 pr_warn("Received unexpected message type %d with dir %d from session %s\n",
0392 type, dir, srv_sess->sessname);
0393 return -EINVAL;
0394 }
0395
0396 rtrs_srv_resp_rdma(id, ret);
0397 return 0;
0398 }
0399
0400 static struct rnbd_srv_sess_dev
0401 *rnbd_sess_dev_alloc(struct rnbd_srv_session *srv_sess)
0402 {
0403 struct rnbd_srv_sess_dev *sess_dev;
0404 int error;
0405
0406 sess_dev = kzalloc(sizeof(*sess_dev), GFP_KERNEL);
0407 if (!sess_dev)
0408 return ERR_PTR(-ENOMEM);
0409
0410 error = xa_alloc(&srv_sess->index_idr, &sess_dev->device_id, sess_dev,
0411 xa_limit_32b, GFP_NOWAIT);
0412 if (error < 0) {
0413 pr_warn("Allocating idr failed, err: %d\n", error);
0414 kfree(sess_dev);
0415 return ERR_PTR(error);
0416 }
0417
0418 return sess_dev;
0419 }
0420
0421 static struct rnbd_srv_dev *rnbd_srv_init_srv_dev(struct block_device *bdev)
0422 {
0423 struct rnbd_srv_dev *dev;
0424
0425 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0426 if (!dev)
0427 return ERR_PTR(-ENOMEM);
0428
0429 snprintf(dev->id, sizeof(dev->id), "%pg", bdev);
0430 kref_init(&dev->kref);
0431 INIT_LIST_HEAD(&dev->sess_dev_list);
0432 mutex_init(&dev->lock);
0433
0434 return dev;
0435 }
0436
0437 static struct rnbd_srv_dev *
0438 rnbd_srv_find_or_add_srv_dev(struct rnbd_srv_dev *new_dev)
0439 {
0440 struct rnbd_srv_dev *dev;
0441
0442 spin_lock(&dev_lock);
0443 list_for_each_entry(dev, &dev_list, list) {
0444 if (!strncmp(dev->id, new_dev->id, sizeof(dev->id))) {
0445 if (!kref_get_unless_zero(&dev->kref))
0446
0447
0448
0449
0450 continue;
0451 spin_unlock(&dev_lock);
0452 return dev;
0453 }
0454 }
0455 list_add(&new_dev->list, &dev_list);
0456 spin_unlock(&dev_lock);
0457
0458 return new_dev;
0459 }
0460
0461 static int rnbd_srv_check_update_open_perm(struct rnbd_srv_dev *srv_dev,
0462 struct rnbd_srv_session *srv_sess,
0463 enum rnbd_access_mode access_mode)
0464 {
0465 int ret = -EPERM;
0466
0467 mutex_lock(&srv_dev->lock);
0468
0469 switch (access_mode) {
0470 case RNBD_ACCESS_RO:
0471 ret = 0;
0472 break;
0473 case RNBD_ACCESS_RW:
0474 if (srv_dev->open_write_cnt == 0) {
0475 srv_dev->open_write_cnt++;
0476 ret = 0;
0477 } else {
0478 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",
0479 srv_dev->id, srv_sess->sessname,
0480 srv_dev->open_write_cnt,
0481 rnbd_access_mode_str(access_mode));
0482 }
0483 break;
0484 case RNBD_ACCESS_MIGRATION:
0485 if (srv_dev->open_write_cnt < 2) {
0486 srv_dev->open_write_cnt++;
0487 ret = 0;
0488 } else {
0489 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",
0490 srv_dev->id, srv_sess->sessname,
0491 srv_dev->open_write_cnt,
0492 rnbd_access_mode_str(access_mode));
0493 }
0494 break;
0495 default:
0496 pr_err("Received mapping request for device '%s' on session %s with invalid access mode: %d\n",
0497 srv_dev->id, srv_sess->sessname, access_mode);
0498 ret = -EINVAL;
0499 }
0500
0501 mutex_unlock(&srv_dev->lock);
0502
0503 return ret;
0504 }
0505
0506 static struct rnbd_srv_dev *
0507 rnbd_srv_get_or_create_srv_dev(struct rnbd_dev *rnbd_dev,
0508 struct rnbd_srv_session *srv_sess,
0509 enum rnbd_access_mode access_mode)
0510 {
0511 int ret;
0512 struct rnbd_srv_dev *new_dev, *dev;
0513
0514 new_dev = rnbd_srv_init_srv_dev(rnbd_dev->bdev);
0515 if (IS_ERR(new_dev))
0516 return new_dev;
0517
0518 dev = rnbd_srv_find_or_add_srv_dev(new_dev);
0519 if (dev != new_dev)
0520 kfree(new_dev);
0521
0522 ret = rnbd_srv_check_update_open_perm(dev, srv_sess, access_mode);
0523 if (ret) {
0524 rnbd_put_srv_dev(dev);
0525 return ERR_PTR(ret);
0526 }
0527
0528 return dev;
0529 }
0530
0531 static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp,
0532 struct rnbd_srv_sess_dev *sess_dev)
0533 {
0534 struct rnbd_dev *rnbd_dev = sess_dev->rnbd_dev;
0535
0536 rsp->hdr.type = cpu_to_le16(RNBD_MSG_OPEN_RSP);
0537 rsp->device_id =
0538 cpu_to_le32(sess_dev->device_id);
0539 rsp->nsectors =
0540 cpu_to_le64(get_capacity(rnbd_dev->bdev->bd_disk));
0541 rsp->logical_block_size =
0542 cpu_to_le16(bdev_logical_block_size(rnbd_dev->bdev));
0543 rsp->physical_block_size =
0544 cpu_to_le16(bdev_physical_block_size(rnbd_dev->bdev));
0545 rsp->max_segments =
0546 cpu_to_le16(rnbd_dev_get_max_segs(rnbd_dev));
0547 rsp->max_hw_sectors =
0548 cpu_to_le32(rnbd_dev_get_max_hw_sects(rnbd_dev));
0549 rsp->max_write_same_sectors = 0;
0550 rsp->max_discard_sectors =
0551 cpu_to_le32(rnbd_dev_get_max_discard_sects(rnbd_dev));
0552 rsp->discard_granularity =
0553 cpu_to_le32(rnbd_dev_get_discard_granularity(rnbd_dev));
0554 rsp->discard_alignment =
0555 cpu_to_le32(rnbd_dev_get_discard_alignment(rnbd_dev));
0556 rsp->secure_discard =
0557 cpu_to_le16(rnbd_dev_get_secure_discard(rnbd_dev));
0558 rsp->cache_policy = 0;
0559 if (bdev_write_cache(rnbd_dev->bdev))
0560 rsp->cache_policy |= RNBD_WRITEBACK;
0561 if (bdev_fua(rnbd_dev->bdev))
0562 rsp->cache_policy |= RNBD_FUA;
0563 }
0564
0565 static struct rnbd_srv_sess_dev *
0566 rnbd_srv_create_set_sess_dev(struct rnbd_srv_session *srv_sess,
0567 const struct rnbd_msg_open *open_msg,
0568 struct rnbd_dev *rnbd_dev, fmode_t open_flags,
0569 struct rnbd_srv_dev *srv_dev)
0570 {
0571 struct rnbd_srv_sess_dev *sdev = rnbd_sess_dev_alloc(srv_sess);
0572
0573 if (IS_ERR(sdev))
0574 return sdev;
0575
0576 kref_init(&sdev->kref);
0577
0578 strscpy(sdev->pathname, open_msg->dev_name, sizeof(sdev->pathname));
0579
0580 sdev->rnbd_dev = rnbd_dev;
0581 sdev->sess = srv_sess;
0582 sdev->dev = srv_dev;
0583 sdev->open_flags = open_flags;
0584 sdev->access_mode = open_msg->access_mode;
0585
0586 return sdev;
0587 }
0588
0589 static char *rnbd_srv_get_full_path(struct rnbd_srv_session *srv_sess,
0590 const char *dev_name)
0591 {
0592 char *full_path;
0593 char *a, *b;
0594
0595 full_path = kmalloc(PATH_MAX, GFP_KERNEL);
0596 if (!full_path)
0597 return ERR_PTR(-ENOMEM);
0598
0599
0600
0601
0602
0603 a = strnstr(dev_search_path, "%SESSNAME%", sizeof(dev_search_path));
0604 if (a) {
0605 int len = a - dev_search_path;
0606
0607 len = snprintf(full_path, PATH_MAX, "%.*s/%s/%s", len,
0608 dev_search_path, srv_sess->sessname, dev_name);
0609 if (len >= PATH_MAX) {
0610 pr_err("Too long path: %s, %s, %s\n",
0611 dev_search_path, srv_sess->sessname, dev_name);
0612 kfree(full_path);
0613 return ERR_PTR(-EINVAL);
0614 }
0615 } else {
0616 snprintf(full_path, PATH_MAX, "%s/%s",
0617 dev_search_path, dev_name);
0618 }
0619
0620
0621 a = strchr(full_path, '/');
0622 b = a;
0623 while (*b != '\0') {
0624 if (*b == '/' && *a == '/') {
0625 b++;
0626 } else {
0627 a++;
0628 *a = *b;
0629 b++;
0630 }
0631 }
0632 a++;
0633 *a = '\0';
0634
0635 return full_path;
0636 }
0637
0638 static int process_msg_sess_info(struct rnbd_srv_session *srv_sess,
0639 const void *msg, size_t len,
0640 void *data, size_t datalen)
0641 {
0642 const struct rnbd_msg_sess_info *sess_info_msg = msg;
0643 struct rnbd_msg_sess_info_rsp *rsp = data;
0644
0645 srv_sess->ver = min_t(u8, sess_info_msg->ver, RNBD_PROTO_VER_MAJOR);
0646 pr_debug("Session %s using protocol version %d (client version: %d, server version: %d)\n",
0647 srv_sess->sessname, srv_sess->ver,
0648 sess_info_msg->ver, RNBD_PROTO_VER_MAJOR);
0649
0650 rsp->hdr.type = cpu_to_le16(RNBD_MSG_SESS_INFO_RSP);
0651 rsp->ver = srv_sess->ver;
0652
0653 return 0;
0654 }
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 static struct rnbd_srv_sess_dev *
0665 find_srv_sess_dev(struct rnbd_srv_session *srv_sess, const char *dev_name)
0666 {
0667 struct rnbd_srv_sess_dev *sess_dev;
0668 unsigned long index;
0669
0670 if (xa_empty(&srv_sess->index_idr))
0671 return NULL;
0672
0673 xa_for_each(&srv_sess->index_idr, index, sess_dev)
0674 if (!strcmp(sess_dev->pathname, dev_name))
0675 return sess_dev;
0676
0677 return NULL;
0678 }
0679
0680 static int process_msg_open(struct rnbd_srv_session *srv_sess,
0681 const void *msg, size_t len,
0682 void *data, size_t datalen)
0683 {
0684 int ret;
0685 struct rnbd_srv_dev *srv_dev;
0686 struct rnbd_srv_sess_dev *srv_sess_dev;
0687 const struct rnbd_msg_open *open_msg = msg;
0688 fmode_t open_flags;
0689 char *full_path;
0690 struct rnbd_dev *rnbd_dev;
0691 struct rnbd_msg_open_rsp *rsp = data;
0692
0693 pr_debug("Open message received: session='%s' path='%s' access_mode=%d\n",
0694 srv_sess->sessname, open_msg->dev_name,
0695 open_msg->access_mode);
0696 open_flags = FMODE_READ;
0697 if (open_msg->access_mode != RNBD_ACCESS_RO)
0698 open_flags |= FMODE_WRITE;
0699
0700 mutex_lock(&srv_sess->lock);
0701
0702 srv_sess_dev = find_srv_sess_dev(srv_sess, open_msg->dev_name);
0703 if (srv_sess_dev)
0704 goto fill_response;
0705
0706 if ((strlen(dev_search_path) + strlen(open_msg->dev_name))
0707 >= PATH_MAX) {
0708 pr_err("Opening device for session %s failed, device path too long. '%s/%s' is longer than PATH_MAX (%d)\n",
0709 srv_sess->sessname, dev_search_path, open_msg->dev_name,
0710 PATH_MAX);
0711 ret = -EINVAL;
0712 goto reject;
0713 }
0714 if (strstr(open_msg->dev_name, "..")) {
0715 pr_err("Opening device for session %s failed, device path %s contains relative path ..\n",
0716 srv_sess->sessname, open_msg->dev_name);
0717 ret = -EINVAL;
0718 goto reject;
0719 }
0720 full_path = rnbd_srv_get_full_path(srv_sess, open_msg->dev_name);
0721 if (IS_ERR(full_path)) {
0722 ret = PTR_ERR(full_path);
0723 pr_err("Opening device '%s' for client %s failed, failed to get device full path, err: %d\n",
0724 open_msg->dev_name, srv_sess->sessname, ret);
0725 goto reject;
0726 }
0727
0728 rnbd_dev = rnbd_dev_open(full_path, open_flags);
0729 if (IS_ERR(rnbd_dev)) {
0730 pr_err("Opening device '%s' on session %s failed, failed to open the block device, err: %ld\n",
0731 full_path, srv_sess->sessname, PTR_ERR(rnbd_dev));
0732 ret = PTR_ERR(rnbd_dev);
0733 goto free_path;
0734 }
0735
0736 srv_dev = rnbd_srv_get_or_create_srv_dev(rnbd_dev, srv_sess,
0737 open_msg->access_mode);
0738 if (IS_ERR(srv_dev)) {
0739 pr_err("Opening device '%s' on session %s failed, creating srv_dev failed, err: %ld\n",
0740 full_path, srv_sess->sessname, PTR_ERR(srv_dev));
0741 ret = PTR_ERR(srv_dev);
0742 goto rnbd_dev_close;
0743 }
0744
0745 srv_sess_dev = rnbd_srv_create_set_sess_dev(srv_sess, open_msg,
0746 rnbd_dev, open_flags,
0747 srv_dev);
0748 if (IS_ERR(srv_sess_dev)) {
0749 pr_err("Opening device '%s' on session %s failed, creating sess_dev failed, err: %ld\n",
0750 full_path, srv_sess->sessname, PTR_ERR(srv_sess_dev));
0751 ret = PTR_ERR(srv_sess_dev);
0752 goto srv_dev_put;
0753 }
0754
0755
0756
0757
0758
0759 mutex_lock(&srv_dev->lock);
0760 if (!srv_dev->dev_kobj.state_in_sysfs) {
0761 ret = rnbd_srv_create_dev_sysfs(srv_dev, rnbd_dev->bdev);
0762 if (ret) {
0763 mutex_unlock(&srv_dev->lock);
0764 rnbd_srv_err(srv_sess_dev,
0765 "Opening device failed, failed to create device sysfs files, err: %d\n",
0766 ret);
0767 goto free_srv_sess_dev;
0768 }
0769 }
0770
0771 ret = rnbd_srv_create_dev_session_sysfs(srv_sess_dev);
0772 if (ret) {
0773 mutex_unlock(&srv_dev->lock);
0774 rnbd_srv_err(srv_sess_dev,
0775 "Opening device failed, failed to create dev client sysfs files, err: %d\n",
0776 ret);
0777 goto free_srv_sess_dev;
0778 }
0779
0780 list_add(&srv_sess_dev->dev_list, &srv_dev->sess_dev_list);
0781 mutex_unlock(&srv_dev->lock);
0782
0783 rnbd_srv_info(srv_sess_dev, "Opened device '%s'\n", srv_dev->id);
0784
0785 kfree(full_path);
0786
0787 fill_response:
0788 rnbd_srv_fill_msg_open_rsp(rsp, srv_sess_dev);
0789 mutex_unlock(&srv_sess->lock);
0790 return 0;
0791
0792 free_srv_sess_dev:
0793 xa_erase(&srv_sess->index_idr, srv_sess_dev->device_id);
0794 synchronize_rcu();
0795 kfree(srv_sess_dev);
0796 srv_dev_put:
0797 if (open_msg->access_mode != RNBD_ACCESS_RO) {
0798 mutex_lock(&srv_dev->lock);
0799 srv_dev->open_write_cnt--;
0800 mutex_unlock(&srv_dev->lock);
0801 }
0802 rnbd_put_srv_dev(srv_dev);
0803 rnbd_dev_close:
0804 rnbd_dev_close(rnbd_dev);
0805 free_path:
0806 kfree(full_path);
0807 reject:
0808 mutex_unlock(&srv_sess->lock);
0809 return ret;
0810 }
0811
0812 static struct rtrs_srv_ctx *rtrs_ctx;
0813
0814 static struct rtrs_srv_ops rtrs_ops;
0815 static int __init rnbd_srv_init_module(void)
0816 {
0817 int err;
0818
0819 BUILD_BUG_ON(sizeof(struct rnbd_msg_hdr) != 4);
0820 BUILD_BUG_ON(sizeof(struct rnbd_msg_sess_info) != 36);
0821 BUILD_BUG_ON(sizeof(struct rnbd_msg_sess_info_rsp) != 36);
0822 BUILD_BUG_ON(sizeof(struct rnbd_msg_open) != 264);
0823 BUILD_BUG_ON(sizeof(struct rnbd_msg_close) != 8);
0824 BUILD_BUG_ON(sizeof(struct rnbd_msg_open_rsp) != 56);
0825 rtrs_ops = (struct rtrs_srv_ops) {
0826 .rdma_ev = rnbd_srv_rdma_ev,
0827 .link_ev = rnbd_srv_link_ev,
0828 };
0829 rtrs_ctx = rtrs_srv_open(&rtrs_ops, port_nr);
0830 if (IS_ERR(rtrs_ctx)) {
0831 err = PTR_ERR(rtrs_ctx);
0832 pr_err("rtrs_srv_open(), err: %d\n", err);
0833 return err;
0834 }
0835
0836 err = rnbd_srv_create_sysfs_files();
0837 if (err) {
0838 pr_err("rnbd_srv_create_sysfs_files(), err: %d\n", err);
0839 rtrs_srv_close(rtrs_ctx);
0840 return err;
0841 }
0842
0843 return 0;
0844 }
0845
0846 static void __exit rnbd_srv_cleanup_module(void)
0847 {
0848 rtrs_srv_close(rtrs_ctx);
0849 WARN_ON(!list_empty(&sess_list));
0850 rnbd_srv_destroy_sysfs_files();
0851 }
0852
0853 module_init(rnbd_srv_init_module);
0854 module_exit(rnbd_srv_cleanup_module);