^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);