scsi: Use blk_rq_map_user_io helper
authorAnuj Gupta <anuj20.g@samsung.com>
Fri, 30 Sep 2022 06:27:41 +0000 (11:57 +0530)
committerJens Axboe <axboe@kernel.dk>
Fri, 30 Sep 2022 13:51:13 +0000 (07:51 -0600)
Use the new blk_rq_map_user_io helper instead of duplicating code at
various places. Additionally this also takes advantage of the on-stack
iov fast path.

Signed-off-by: Anuj Gupta <anuj20.g@samsung.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220930062749.152261-5-anuj20.g@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/scsi/scsi_ioctl.c
drivers/scsi/sg.c

index 729e309e60346f6424522240d46ab9a7c5f3217f..2d20da55fb64086ebc66d4702b37ac28c7cc1bea 100644 (file)
@@ -449,25 +449,9 @@ static int sg_io(struct scsi_device *sdev, struct sg_io_hdr *hdr, fmode_t mode)
        if (ret < 0)
                goto out_put_request;
 
-       ret = 0;
-       if (hdr->iovec_count && hdr->dxfer_len) {
-               struct iov_iter i;
-               struct iovec *iov = NULL;
-
-               ret = import_iovec(rq_data_dir(rq), hdr->dxferp,
-                                  hdr->iovec_count, 0, &iov, &i);
-               if (ret < 0)
-                       goto out_put_request;
-
-               /* SG_IO howto says that the shorter of the two wins */
-               iov_iter_truncate(&i, hdr->dxfer_len);
-
-               ret = blk_rq_map_user_iov(rq->q, rq, NULL, &i, GFP_KERNEL);
-               kfree(iov);
-       } else if (hdr->dxfer_len)
-               ret = blk_rq_map_user(rq->q, rq, NULL, hdr->dxferp,
-                                     hdr->dxfer_len, GFP_KERNEL);
-
+       ret = blk_rq_map_user_io(rq, NULL, hdr->dxferp, hdr->dxfer_len,
+                       GFP_KERNEL, hdr->iovec_count && hdr->dxfer_len,
+                       hdr->iovec_count, 0, rq_data_dir(rq));
        if (ret)
                goto out_put_request;
 
index 94c5e9a9309c8a7958e4d93d10ea9de8de80bddb..ce34a8ad53b4e9d99501e043be2d81c2476748f2 100644 (file)
@@ -1804,26 +1804,8 @@ sg_start_req(Sg_request *srp, unsigned char *cmd)
                        md->from_user = 0;
        }
 
-       if (iov_count) {
-               struct iovec *iov = NULL;
-               struct iov_iter i;
-
-               res = import_iovec(rw, hp->dxferp, iov_count, 0, &iov, &i);
-               if (res < 0)
-                       return res;
-
-               iov_iter_truncate(&i, hp->dxfer_len);
-               if (!iov_iter_count(&i)) {
-                       kfree(iov);
-                       return -EINVAL;
-               }
-
-               res = blk_rq_map_user_iov(q, rq, md, &i, GFP_ATOMIC);
-               kfree(iov);
-       } else
-               res = blk_rq_map_user(q, rq, md, hp->dxferp,
-                                     hp->dxfer_len, GFP_ATOMIC);
-
+       res = blk_rq_map_user_io(rq, md, hp->dxferp, hp->dxfer_len,
+                       GFP_ATOMIC, iov_count, iov_count, 1, rw);
        if (!res) {
                srp->bio = rq->bio;