Messages in this thread | | | Date | Wed, 1 Apr 2009 20:47:31 +0900 | Subject | Re: [PATCH 2/8] block: fix SG_IO vector request data length handling | From | FUJITA Tomonori <> |
| |
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/
| |