提交 10c43dd4 编写于 作者: K K. Y. Srinivasan 提交者: Greg Kroah-Hartman

Staging: hv: storvsc: Fix a bug in copy_from_bounce_buffer()

Fix a bug in copy_from_bounce_buffer().
Signed-off-by: NK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: NHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 a768a76d
......@@ -880,7 +880,8 @@ static struct scatterlist *create_bounce_buffer(struct scatterlist *sgl,
/* Assume the original sgl has enough room */
static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
struct scatterlist *bounce_sgl,
unsigned int orig_sgl_count)
unsigned int orig_sgl_count,
unsigned int bounce_sgl_count)
{
int i;
int j = 0;
......@@ -921,6 +922,24 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
kunmap_atomic((void *)bounce_addr, KM_IRQ0);
j++;
/*
* It is possible that the number of elements
* in the bounce buffer may not be equal to
* the number of elements in the original
* scatter list. Handle this correctly.
*/
if (j == bounce_sgl_count) {
/*
* We are done; cleanup and return.
*/
kunmap_atomic((void *)(dest_addr -
orig_sgl[i].offset),
KM_IRQ0);
local_irq_restore(flags);
return total_copied;
}
/* if we need to use another bounce buffer */
if (destlen || i != orig_sgl_count - 1)
bounce_addr =
......@@ -1126,7 +1145,8 @@ static void storvsc_command_completion(struct hv_storvsc_request *request)
if (vm_srb->data_in == READ_TYPE)
copy_from_bounce_buffer(scsi_sglist(scmnd),
cmd_request->bounce_sgl,
scsi_sg_count(scmnd));
scsi_sg_count(scmnd),
cmd_request->bounce_sgl_count);
destroy_bounce_buffer(cmd_request->bounce_sgl,
cmd_request->bounce_sgl_count);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册