lkml.org 
[lkml]   [2009]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/5] block: fix SG_IO vector request data length handling
    Date
    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.

    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 84b7f87..82a0ca2 100644
    --- a/block/scsi_ioctl.c
    +++ b/block/scsi_ioctl.c
    @@ -290,6 +290,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);
    @@ -304,8 +305,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


    \
     
     \ /
      Last update: 2009-04-15 15:15    [W:0.037 / U:31.500 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site