Merge tag 'kbuild-v5.13-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-microblaze.git] / drivers / block / rnbd / rnbd-srv.c
index a6a68d4..aafecfe 100644 (file)
@@ -104,7 +104,7 @@ rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
 
        rcu_read_lock();
        sess_dev = xa_load(&srv_sess->index_idr, dev_id);
-       if (likely(sess_dev))
+       if (sess_dev)
                ret = kref_get_unless_zero(&sess_dev->kref);
        rcu_read_unlock();
 
@@ -114,8 +114,7 @@ rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
        return sess_dev;
 }
 
-static int process_rdma(struct rtrs_srv *sess,
-                       struct rnbd_srv_session *srv_sess,
+static int process_rdma(struct rnbd_srv_session *srv_sess,
                        struct rtrs_srv_op *id, void *data, u32 datalen,
                        const void *usr, size_t usrlen)
 {
@@ -178,8 +177,10 @@ err:
        return err;
 }
 
-static void destroy_device(struct rnbd_srv_dev *dev)
+static void destroy_device(struct kref *kref)
 {
+       struct rnbd_srv_dev *dev = container_of(kref, struct rnbd_srv_dev, kref);
+
        WARN_ONCE(!list_empty(&dev->sess_dev_list),
                  "Device %s is being destroyed but still in use!\n",
                  dev->id);
@@ -198,18 +199,9 @@ static void destroy_device(struct rnbd_srv_dev *dev)
                kfree(dev);
 }
 
-static void destroy_device_cb(struct kref *kref)
-{
-       struct rnbd_srv_dev *dev;
-
-       dev = container_of(kref, struct rnbd_srv_dev, kref);
-
-       destroy_device(dev);
-}
-
 static void rnbd_put_srv_dev(struct rnbd_srv_dev *dev)
 {
-       kref_put(&dev->kref, destroy_device_cb);
+       kref_put(&dev->kref, destroy_device);
 }
 
 void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id)
@@ -306,7 +298,7 @@ static int create_sess(struct rtrs_srv *rtrs)
        mutex_unlock(&sess_lock);
 
        srv_sess->rtrs = rtrs;
-       strlcpy(srv_sess->sessname, sessname, sizeof(srv_sess->sessname));
+       strscpy(srv_sess->sessname, sessname, sizeof(srv_sess->sessname));
 
        rtrs_srv_set_sess_priv(rtrs, srv_sess);
 
@@ -336,18 +328,22 @@ static int rnbd_srv_link_ev(struct rtrs_srv *rtrs,
        }
 }
 
-void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev)
+void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev,
+                                  struct kobj_attribute *attr)
 {
        struct rnbd_srv_session *sess = sess_dev->sess;
 
        sess_dev->keep_id = true;
-       mutex_lock(&sess->lock);
+       /* It is already started to close by client's close message. */
+       if (!mutex_trylock(&sess->lock))
+               return;
+       /* first remove sysfs itself to avoid deadlock */
+       sysfs_remove_file_self(&sess_dev->kobj, &attr->attr);
        rnbd_srv_destroy_dev_session_sysfs(sess_dev);
        mutex_unlock(&sess->lock);
 }
 
-static int process_msg_close(struct rtrs_srv *rtrs,
-                            struct rnbd_srv_session *srv_sess,
+static int process_msg_close(struct rnbd_srv_session *srv_sess,
                             void *data, size_t datalen, const void *usr,
                             size_t usrlen)
 {
@@ -366,20 +362,18 @@ static int process_msg_close(struct rtrs_srv *rtrs,
        return 0;
 }
 
-static int process_msg_open(struct rtrs_srv *rtrs,
-                           struct rnbd_srv_session *srv_sess,
+static int process_msg_open(struct rnbd_srv_session *srv_sess,
                            const void *msg, size_t len,
                            void *data, size_t datalen);
 
-static int process_msg_sess_info(struct rtrs_srv *rtrs,
-                                struct rnbd_srv_session *srv_sess,
+static int process_msg_sess_info(struct rnbd_srv_session *srv_sess,
                                 const void *msg, size_t len,
                                 void *data, size_t datalen);
 
-static int rnbd_srv_rdma_ev(struct rtrs_srv *rtrs, void *priv,
-                            struct rtrs_srv_op *id, int dir,
-                            void *data, size_t datalen, const void *usr,
-                            size_t usrlen)
+static int rnbd_srv_rdma_ev(void *priv,
+                           struct rtrs_srv_op *id, int dir,
+                           void *data, size_t datalen, const void *usr,
+                           size_t usrlen)
 {
        struct rnbd_srv_session *srv_sess = priv;
        const struct rnbd_msg_hdr *hdr = usr;
@@ -393,19 +387,16 @@ static int rnbd_srv_rdma_ev(struct rtrs_srv *rtrs, void *priv,
 
        switch (type) {
        case RNBD_MSG_IO:
-               return process_rdma(rtrs, srv_sess, id, data, datalen, usr,
-                                   usrlen);
+               return process_rdma(srv_sess, id, data, datalen, usr, usrlen);
        case RNBD_MSG_CLOSE:
-               ret = process_msg_close(rtrs, srv_sess, data, datalen,
-                                       usr, usrlen);
+               ret = process_msg_close(srv_sess, data, datalen, usr, usrlen);
                break;
        case RNBD_MSG_OPEN:
-               ret = process_msg_open(rtrs, srv_sess, usr, usrlen,
-                                      data, datalen);
+               ret = process_msg_open(srv_sess, usr, usrlen, data, datalen);
                break;
        case RNBD_MSG_SESS_INFO:
-               ret = process_msg_sess_info(rtrs, srv_sess, usr, usrlen,
-                                           data, datalen);
+               ret = process_msg_sess_info(srv_sess, usr, usrlen, data,
+                                           datalen);
                break;
        default:
                pr_warn("Received unexpected message type %d with dir %d from session %s\n",
@@ -446,7 +437,7 @@ static struct rnbd_srv_dev *rnbd_srv_init_srv_dev(const char *id)
        if (!dev)
                return ERR_PTR(-ENOMEM);
 
-       strlcpy(dev->id, id, sizeof(dev->id));
+       strscpy(dev->id, id, sizeof(dev->id));
        kref_init(&dev->kref);
        INIT_LIST_HEAD(&dev->sess_dev_list);
        mutex_init(&dev->lock);
@@ -598,7 +589,7 @@ rnbd_srv_create_set_sess_dev(struct rnbd_srv_session *srv_sess,
 
        kref_init(&sdev->kref);
 
-       strlcpy(sdev->pathname, open_msg->dev_name, sizeof(sdev->pathname));
+       strscpy(sdev->pathname, open_msg->dev_name, sizeof(sdev->pathname));
 
        sdev->rnbd_dev          = rnbd_dev;
        sdev->sess              = srv_sess;
@@ -658,8 +649,7 @@ static char *rnbd_srv_get_full_path(struct rnbd_srv_session *srv_sess,
        return full_path;
 }
 
-static int process_msg_sess_info(struct rtrs_srv *rtrs,
-                                struct rnbd_srv_session *srv_sess,
+static int process_msg_sess_info(struct rnbd_srv_session *srv_sess,
                                 const void *msg, size_t len,
                                 void *data, size_t datalen)
 {
@@ -700,8 +690,7 @@ find_srv_sess_dev(struct rnbd_srv_session *srv_sess, const char *dev_name)
        return NULL;
 }
 
-static int process_msg_open(struct rtrs_srv *rtrs,
-                           struct rnbd_srv_session *srv_sess,
+static int process_msg_open(struct rnbd_srv_session *srv_sess,
                            const void *msg, size_t len,
                            void *data, size_t datalen)
 {