mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
scsi: Use blk_rq_map_user_io helper
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>
This commit is contained in:
parent
557654025d
commit
6732932c83
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user