Merge branch 'kmap_atomic' of git://github.com/congwang/linux
[linux-flexiantxendom0-3.2.10.git] / drivers / scsi / storvsc_drv.c
index 695ffc3..83a1972 100644 (file)
@@ -481,6 +481,19 @@ cleanup:
        return NULL;
 }
 
+/* Disgusting wrapper functions */
+static inline unsigned long sg_kmap_atomic(struct scatterlist *sgl, int idx)
+{
+       void *addr = kmap_atomic(sg_page(sgl + idx));
+       return (unsigned long)addr;
+}
+
+static inline void sg_kunmap_atomic(unsigned long addr)
+{
+       kunmap_atomic((void *)addr);
+}
+
+
 /* Assume the original sgl has enough room */
 static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
                                            struct scatterlist *bounce_sgl,
@@ -499,15 +512,12 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
        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_addr = sg_kmap_atomic(orig_sgl,i) + 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);
+                       bounce_addr = sg_kmap_atomic(bounce_sgl,j);
 
                while (destlen) {
                        src = bounce_addr + bounce_sgl[j].offset;
@@ -523,7 +533,7 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
 
                        if (bounce_sgl[j].offset == bounce_sgl[j].length) {
                                /* full */
-                               kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+                               sg_kunmap_atomic(bounce_addr);
                                j++;
 
                                /*
@@ -537,26 +547,21 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
                                        /*
                                         * We are done; cleanup and return.
                                         */
-                                       kunmap_atomic((void *)(dest_addr -
-                                                       orig_sgl[i].offset),
-                                                       KM_IRQ0);
+                                       sg_kunmap_atomic(dest_addr - orig_sgl[i].offset);
                                        local_irq_restore(flags);
                                        return total_copied;
                                }
 
                                /* 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);
+                                       bounce_addr = sg_kmap_atomic(bounce_sgl,j);
                        } else if (destlen == 0 && i == orig_sgl_count - 1) {
                                /* unmap the last bounce that is < PAGE_SIZE */
-                               kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+                               sg_kunmap_atomic(bounce_addr);
                        }
                }
 
-               kunmap_atomic((void *)(dest_addr - orig_sgl[i].offset),
-                             KM_IRQ0);
+               sg_kunmap_atomic(dest_addr - orig_sgl[i].offset);
        }
 
        local_irq_restore(flags);
@@ -581,15 +586,12 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
        local_irq_save(flags);
 
        for (i = 0; i < orig_sgl_count; i++) {
-               src_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])),
-                               KM_IRQ0) + orig_sgl[i].offset;
+               src_addr = sg_kmap_atomic(orig_sgl,i) + orig_sgl[i].offset;
                src = src_addr;
                srclen = orig_sgl[i].length;
 
                if (bounce_addr == 0)
-                       bounce_addr =
-                       (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])),
-                                               KM_IRQ0);
+                       bounce_addr = sg_kmap_atomic(bounce_sgl,j);
 
                while (srclen) {
                        /* assume bounce offset always == 0 */
@@ -606,22 +608,20 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
 
                        if (bounce_sgl[j].length == PAGE_SIZE) {
                                /* full..move to next entry */
-                               kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+                               sg_kunmap_atomic(bounce_addr);
                                j++;
 
                                /* if we need to use another bounce buffer */
                                if (srclen || i != orig_sgl_count - 1)
-                                       bounce_addr =
-                                       (unsigned long)kmap_atomic(
-                                       sg_page((&bounce_sgl[j])), KM_IRQ0);
+                                       bounce_addr = sg_kmap_atomic(bounce_sgl,j);
 
                        } else if (srclen == 0 && i == orig_sgl_count - 1) {
                                /* unmap the last bounce that is < PAGE_SIZE */
-                               kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+                               sg_kunmap_atomic(bounce_addr);
                        }
                }
 
-               kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
+               sg_kunmap_atomic(src_addr - orig_sgl[i].offset);
        }
 
        local_irq_restore(flags);