lkml.org 
[lkml]   [2009]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH 2/8] block: fix SG_IO vector request data length handling
From
On Wed,  1 Apr 2009 20:04:38 +0900
Tejun Heo <tj@kernel.org> wrote:

> Impact: fix SG_IO behavior such that it matches the documentation
>
> SG_IO howto says that if ->dxfer_len and sum of iovec disagress, the
> shorter one wins. However, the current implementation returns -EINVAL
> for such cases. Trim iovc if it's longer than ->dxfer_len.

Is that description about sg's SG_IO?


> This patch uses iov_*() helpers which take struct iovec * by casting
> struct sg_iovec * to it. sg_iovec is always identical to iovec and
> this will be further cleaned up with later patches.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> ---
> block/scsi_ioctl.c | 13 ++++++++++++-
> 1 files changed, 12 insertions(+), 1 deletions(-)
>
> diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
> index 626ee27..c8e8868 100644
> --- a/block/scsi_ioctl.c
> +++ b/block/scsi_ioctl.c
> @@ -288,6 +288,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
>
> if (hdr->iovec_count) {
> const int size = sizeof(struct sg_iovec) * hdr->iovec_count;
> + size_t iov_data_len;
> struct sg_iovec *iov;
>
> iov = kmalloc(size, GFP_KERNEL);
> @@ -302,8 +303,18 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
> goto out;
> }
>
> + /* SG_IO howto says that the shorter of the two wins */
> + iov_data_len = iov_length((struct iovec *)iov,
> + hdr->iovec_count);
> + if (hdr->dxfer_len < iov_data_len) {
> + hdr->iovec_count = iov_shorten((struct iovec *)iov,
> + hdr->iovec_count,
> + hdr->dxfer_len);
> + iov_data_len = hdr->dxfer_len;
> + }
> +
> ret = blk_rq_map_user_iov(q, rq, NULL, iov, hdr->iovec_count,
> - hdr->dxfer_len, GFP_KERNEL);
> + iov_data_len, GFP_KERNEL);
> kfree(iov);
> } else if (hdr->dxfer_len)
> ret = blk_rq_map_user(q, rq, NULL, hdr->dxferp, hdr->dxfer_len,
> --
> 1.6.0.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/


\
 
 \ /
  Last update: 2009-04-01 13:51    [W:1.407 / U:0.004 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site