On Fri, Jan 30, 2015 at 08:12:28AM +0000, Nicholas A. Bellinger wrote: > From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > > This patch changes vhost_scsi_map_to_sgl() parameters to accept virtio > iovec ptr + len when determing pages_nr. > > This is currently done with iov_num_pages() -> PAGE_ALIGN, so allow > the same parameters as well. > > Cc: Michael S. Tsirkin <mst@xxxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Signed-off-by: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > --- > drivers/vhost/scsi.c | 37 +++++++++++++++---------------------- > 1 file changed, 15 insertions(+), 22 deletions(-) > > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > index 9c5ac23..049e603 100644 > --- a/drivers/vhost/scsi.c > +++ b/drivers/vhost/scsi.c > @@ -220,10 +220,10 @@ static struct workqueue_struct *tcm_vhost_workqueue; > static DEFINE_MUTEX(tcm_vhost_mutex); > static LIST_HEAD(tcm_vhost_list); > > -static int iov_num_pages(struct iovec *iov) > +static int iov_num_pages(void __user *iov_base, size_t iov_len) > { > - return (PAGE_ALIGN((unsigned long)iov->iov_base + iov->iov_len) - > - ((unsigned long)iov->iov_base & PAGE_MASK)) >> PAGE_SHIFT; > + return (PAGE_ALIGN((unsigned long)iov_base + iov_len) - > + ((unsigned long)iov_base & PAGE_MASK)) >> PAGE_SHIFT; > } > > static void tcm_vhost_done_inflight(struct kref *kref) > @@ -777,25 +777,18 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct tcm_vhost_tpg *tpg, > * Returns the number of scatterlist entries used or -errno on error. > */ > static int > -vhost_scsi_map_to_sgl(struct tcm_vhost_cmd *tv_cmd, > +vhost_scsi_map_to_sgl(struct tcm_vhost_cmd *cmd, > + void __user *ptr, > + size_t len, > struct scatterlist *sgl, > - unsigned int sgl_count, > - struct iovec *iov, > - struct page **pages, > bool write) > { > - unsigned int npages = 0, pages_nr, offset, nbytes; > + unsigned int npages = 0, offset, nbytes; > + unsigned int pages_nr = iov_num_pages(ptr, len); > struct scatterlist *sg = sgl; > - void __user *ptr = iov->iov_base; > - size_t len = iov->iov_len; > + struct page **pages = cmd->tvc_upages; > int ret, i; > > - pages_nr = iov_num_pages(iov); > - if (pages_nr > sgl_count) { > - pr_err("vhost_scsi_map_to_sgl() pages_nr: %u greater than" > - " sgl_count: %u\n", pages_nr, sgl_count); > - return -ENOBUFS; > - } > if (pages_nr > TCM_VHOST_PREALLOC_UPAGES) { > pr_err("vhost_scsi_map_to_sgl() pages_nr: %u greater than" > " preallocated TCM_VHOST_PREALLOC_UPAGES: %u\n", > @@ -840,7 +833,7 @@ vhost_scsi_map_iov_to_sgl(struct tcm_vhost_cmd *cmd, > int ret, i; > > for (i = 0; i < niov; i++) > - sgl_count += iov_num_pages(&iov[i]); > + sgl_count += iov_num_pages(iov[i].iov_base, iov[i].iov_len); > A helper function for this loop seems in order as well? > if (sgl_count > TCM_VHOST_PREALLOC_SGLS) { > pr_err("vhost_scsi_map_iov_to_sgl() sgl_count: %u greater than" > @@ -856,8 +849,8 @@ vhost_scsi_map_iov_to_sgl(struct tcm_vhost_cmd *cmd, > pr_debug("Mapping iovec %p for %u pages\n", &iov[0], sgl_count); > > for (i = 0; i < niov; i++) { > - ret = vhost_scsi_map_to_sgl(cmd, sg, sgl_count, &iov[i], > - cmd->tvc_upages, write); > + ret = vhost_scsi_map_to_sgl(cmd, iov[i].iov_base, iov[i].iov_len, > + sg, write); > if (ret < 0) { > for (i = 0; i < cmd->tvc_sgl_count; i++) { > struct page *page = sg_page(&cmd->tvc_sgl[i]); > @@ -884,7 +877,7 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd, > int ret, i; > > for (i = 0; i < niov; i++) > - prot_sgl_count += iov_num_pages(&iov[i]); > + prot_sgl_count += iov_num_pages(iov[i].iov_base, iov[i].iov_len); > > if (prot_sgl_count > TCM_VHOST_PREALLOC_PROT_SGLS) { > pr_err("vhost_scsi_map_iov_to_prot() sgl_count: %u greater than" > @@ -899,8 +892,8 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd, > cmd->tvc_prot_sgl_count = prot_sgl_count; > > for (i = 0; i < niov; i++) { > - ret = vhost_scsi_map_to_sgl(cmd, prot_sg, prot_sgl_count, &iov[i], > - cmd->tvc_upages, write); > + ret = vhost_scsi_map_to_sgl(cmd, iov[i].iov_base, iov[i].iov_len, > + prot_sg, write); > if (ret < 0) { > for (i = 0; i < cmd->tvc_prot_sgl_count; i++) { > struct page *page = sg_page(&cmd->tvc_prot_sgl[i]); > -- > 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html