Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 249487
b: refs/heads/master
c: 29fe2c9
h: refs/heads/master
i:
  249485: 1e05600
  249483: abf32fd
  249479: f1d4179
  249471: 0e99fd1
v: v3
  • Loading branch information
K. Y. Srinivasan authored and Greg Kroah-Hartman committed May 11, 2011
1 parent 735cb6e commit 9131b0c
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 65 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a9753cbd6cc63e8fd75eab5d458370d49827c177
refs/heads/master: 29fe2c9becc4aec00ff3a647cbfce2c75a5b5aaf
129 changes: 65 additions & 64 deletions trunk/drivers/staging/hv/storvsc_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,77 @@ static struct scatterlist *create_bounce_buffer(struct scatterlist *sgl,
return NULL;
}


/* 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)
{
int i;
int j = 0;
unsigned long src, dest;
unsigned int srclen, destlen, copylen;
unsigned int total_copied = 0;
unsigned long bounce_addr = 0;
unsigned long dest_addr = 0;
unsigned long flags;

local_irq_save(flags);

for (i = 0; i < orig_sgl_count; i++) {
dest_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])),
KM_IRQ0) + orig_sgl[i].offset;
dest = dest_addr;
destlen = orig_sgl[i].length;

if (bounce_addr == 0)
bounce_addr =
(unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])),
KM_IRQ0);

while (destlen) {
src = bounce_addr + bounce_sgl[j].offset;
srclen = bounce_sgl[j].length - bounce_sgl[j].offset;

copylen = min(srclen, destlen);
memcpy((void *)dest, (void *)src, copylen);

total_copied += copylen;
bounce_sgl[j].offset += copylen;
destlen -= copylen;
dest += copylen;

if (bounce_sgl[j].offset == bounce_sgl[j].length) {
/* full */
kunmap_atomic((void *)bounce_addr, KM_IRQ0);
j++;

/* if we need to use another bounce buffer */
if (destlen || i != orig_sgl_count - 1)
bounce_addr =
(unsigned long)kmap_atomic(
sg_page((&bounce_sgl[j])), KM_IRQ0);
} else if (destlen == 0 && i == orig_sgl_count - 1) {
/* unmap the last bounce that is < PAGE_SIZE */
kunmap_atomic((void *)bounce_addr, KM_IRQ0);
}
}

kunmap_atomic((void *)(dest_addr - orig_sgl[i].offset),
KM_IRQ0);
}

local_irq_restore(flags);

return total_copied;
}

/* Static decl */
static int storvsc_probe(struct hv_device *dev);
static int storvsc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd);
static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd);
static int storvsc_remove(struct hv_device *dev);

static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
struct scatterlist *bounce_sgl,
unsigned int orig_sgl_count);
static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
struct scatterlist *bounce_sgl,
unsigned int orig_sgl_count);
Expand Down Expand Up @@ -613,67 +675,6 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
return total_copied;
}

/* 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)
{
int i;
int j = 0;
unsigned long src, dest;
unsigned int srclen, destlen, copylen;
unsigned int total_copied = 0;
unsigned long bounce_addr = 0;
unsigned long dest_addr = 0;
unsigned long flags;

local_irq_save(flags);

for (i = 0; i < orig_sgl_count; i++) {
dest_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])),
KM_IRQ0) + orig_sgl[i].offset;
dest = dest_addr;
destlen = orig_sgl[i].length;
/* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */

if (bounce_addr == 0)
bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);

while (destlen) {
src = bounce_addr + bounce_sgl[j].offset;
srclen = bounce_sgl[j].length - bounce_sgl[j].offset;

copylen = min(srclen, destlen);
memcpy((void *)dest, (void *)src, copylen);

total_copied += copylen;
bounce_sgl[j].offset += copylen;
destlen -= copylen;
dest += copylen;

if (bounce_sgl[j].offset == bounce_sgl[j].length) {
/* full */
kunmap_atomic((void *)bounce_addr, KM_IRQ0);
j++;

/* if we need to use another bounce buffer */
if (destlen || i != orig_sgl_count - 1)
bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
} else if (destlen == 0 && i == orig_sgl_count - 1) {
/* unmap the last bounce that is < PAGE_SIZE */
kunmap_atomic((void *)bounce_addr, KM_IRQ0);
}
}

kunmap_atomic((void *)(dest_addr - orig_sgl[i].offset),
KM_IRQ0);
}

local_irq_restore(flags);

return total_copied;
}

/*
* storvsc_queuecommand - Initiate command processing
*/
Expand Down

0 comments on commit 9131b0c

Please sign in to comment.