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:4.445 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site