Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[platform/kernel/linux-starfive.git] / drivers / block / rnbd / rnbd-srv.c
index ffcd937..f04df62 100644 (file)
@@ -114,6 +114,12 @@ rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
        return sess_dev;
 }
 
+static void rnbd_dev_bi_end_io(struct bio *bio)
+{
+       rnbd_endio(bio->bi_private, blk_status_to_errno(bio->bi_status));
+       bio_put(bio);
+}
+
 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)
@@ -123,7 +129,6 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
        struct rnbd_srv_sess_dev *sess_dev;
        u32 dev_id;
        int err;
-       struct rnbd_dev_blk_io *io;
        struct bio *bio;
        short prio;
 
@@ -144,33 +149,29 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
        priv->sess_dev = sess_dev;
        priv->id = id;
 
-       /* Generate bio with pages pointing to the rdma buffer */
-       bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL);
-       if (IS_ERR(bio)) {
-               err = PTR_ERR(bio);
-               rnbd_srv_err(sess_dev, "Failed to generate bio, err: %d\n", err);
-               goto sess_dev_put;
+       bio = bio_alloc(sess_dev->rnbd_dev->bdev, 1,
+                       rnbd_to_bio_flags(le32_to_cpu(msg->rw)), GFP_KERNEL);
+       if (bio_add_page(bio, virt_to_page(data), datalen,
+                       offset_in_page(data)) != datalen) {
+               rnbd_srv_err(sess_dev, "Failed to map data to bio\n");
+               err = -EINVAL;
+               goto bio_put;
        }
 
-       io = container_of(bio, struct rnbd_dev_blk_io, bio);
-       io->dev = sess_dev->rnbd_dev;
-       io->priv = priv;
-
        bio->bi_end_io = rnbd_dev_bi_end_io;
-       bio->bi_private = io;
-       bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw));
+       bio->bi_private = priv;
        bio->bi_iter.bi_sector = le64_to_cpu(msg->sector);
        bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size);
        prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR ||
               usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio);
        bio_set_prio(bio, prio);
-       bio_set_dev(bio, sess_dev->rnbd_dev->bdev);
 
        submit_bio(bio);
 
        return 0;
 
-sess_dev_put:
+bio_put:
+       bio_put(bio);
        rnbd_put_sess_dev(sess_dev);
 err:
        kfree(priv);
@@ -251,7 +252,6 @@ static void destroy_sess(struct rnbd_srv_session *srv_sess)
 
 out:
        xa_destroy(&srv_sess->index_idr);
-       bioset_exit(&srv_sess->sess_bio_set);
 
        pr_info("RTRS Session %s disconnected\n", srv_sess->sessname);
 
@@ -280,16 +280,6 @@ static int create_sess(struct rtrs_srv_sess *rtrs)
                return -ENOMEM;
 
        srv_sess->queue_depth = rtrs_srv_get_queue_depth(rtrs);
-       err = bioset_init(&srv_sess->sess_bio_set, srv_sess->queue_depth,
-                         offsetof(struct rnbd_dev_blk_io, bio),
-                         BIOSET_NEED_BVECS);
-       if (err) {
-               pr_err("Allocating srv_session for path %s failed\n",
-                      pathname);
-               kfree(srv_sess);
-               return err;
-       }
-
        xa_init_flags(&srv_sess->index_idr, XA_FLAGS_ALLOC);
        INIT_LIST_HEAD(&srv_sess->sess_dev_list);
        mutex_init(&srv_sess->lock);
@@ -567,7 +557,6 @@ static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp,
                cpu_to_le32(rnbd_dev_get_discard_alignment(rnbd_dev));
        rsp->secure_discard =
                cpu_to_le16(rnbd_dev_get_secure_discard(rnbd_dev));
-       rsp->rotational = !blk_queue_nonrot(q);
        rsp->cache_policy = 0;
        if (test_bit(QUEUE_FLAG_WC, &q->queue_flags))
                rsp->cache_policy |= RNBD_WRITEBACK;
@@ -737,8 +726,7 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess,
                goto reject;
        }
 
-       rnbd_dev = rnbd_dev_open(full_path, open_flags,
-                                &srv_sess->sess_bio_set);
+       rnbd_dev = rnbd_dev_open(full_path, open_flags);
        if (IS_ERR(rnbd_dev)) {
                pr_err("Opening device '%s' on session %s failed, failed to open the block device, err: %ld\n",
                       full_path, srv_sess->sessname, PTR_ERR(rnbd_dev));