]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
block/rnbd-srv: Add sanity check and remove redundant assignment
authorMd Haris Iqbal <haris.iqbal@ionos.com>
Fri, 9 Aug 2024 13:53:46 +0000 (15:53 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Aug 2024 14:50:35 +0000 (08:50 -0600)
The bio->bi_iter.bi_size is updated when bio_add_page() is called. So we
do not need to assign msg->bi_size again to it, since its redudant and
can also be harmful. Instead we can use it to add a sanity check, which
checks the locally calculated bi_size, with the one sent in msg.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Link: https://lore.kernel.org/r/20240809135346.978320-1-haris.iqbal@ionos.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-srv.c

index f6e3a3c4b76cc48b9b1fbe92c5cdca361598f08f..08ce6d96d04cfa0caec13e3c34d7c7fe86b1a63d 100644 (file)
@@ -149,15 +149,22 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
                        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");
+               rnbd_srv_err_rl(sess_dev, "Failed to map data to bio\n");
                err = -EINVAL;
                goto bio_put;
        }
 
+       bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw));
+       if (bio_has_data(bio) &&
+           bio->bi_iter.bi_size != le32_to_cpu(msg->bi_size)) {
+               rnbd_srv_err_rl(sess_dev, "Datalen mismatch:  bio bi_size (%u), bi_size (%u)\n",
+                               bio->bi_iter.bi_size, msg->bi_size);
+               err = -EINVAL;
+               goto bio_put;
+       }
        bio->bi_end_io = rnbd_dev_bi_end_io;
        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);