diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 22:11:06 -0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 22:11:06 -0400 | 
| commit | 69450bb5eb8e9df28281c62f98e971c9969dc4ff (patch) | |
| tree | 85991e6e8b74cb08b5013fd7e419c3df67d23e35 | |
| parent | e38f981758118d829cd40cfe9c09e3fa81e422aa (diff) | |
| parent | d6ec084200c37683278c821338f74ddf21ab80f5 (diff) | |
Merge branch 'sg' of git://git.kernel.dk/linux-2.6-block
* 'sg' of git://git.kernel.dk/linux-2.6-block:
  Add CONFIG_DEBUG_SG sg validation
  Change table chaining layout
  Update arch/ to use sg helpers
  Update swiotlb to use sg helpers
  Update net/ to use sg helpers
  Update fs/ to use sg helpers
  [SG] Update drivers to use sg helpers
  [SG] Update crypto/ to sg helpers
  [SG] Update block layer to use sg helpers
  [SG] Add helpers for manipulating SG entries
151 files changed, 671 insertions, 449 deletions
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index e1c470752ebc..ee07dceae1d4 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c  | |||
| @@ -465,7 +465,7 @@ EXPORT_SYMBOL(pci_free_consistent); | |||
| 465 | Write dma_length of each leader with the combined lengths of | 465 | Write dma_length of each leader with the combined lengths of | 
| 466 | the mergable followers. */ | 466 | the mergable followers. */ | 
| 467 | 467 | ||
| 468 | #define SG_ENT_VIRT_ADDRESS(SG) (page_address((SG)->page) + (SG)->offset) | 468 | #define SG_ENT_VIRT_ADDRESS(SG) (sg_virt((SG))) | 
| 469 | #define SG_ENT_PHYS_ADDRESS(SG) __pa(SG_ENT_VIRT_ADDRESS(SG)) | 469 | #define SG_ENT_PHYS_ADDRESS(SG) __pa(SG_ENT_VIRT_ADDRESS(SG)) | 
| 470 | 470 | ||
| 471 | static void | 471 | static void | 
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 44ab0dad4035..9d371e476552 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c  | |||
| @@ -442,7 +442,7 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 442 | BUG_ON(dir == DMA_NONE); | 442 | BUG_ON(dir == DMA_NONE); | 
| 443 | 443 | ||
| 444 | for (i = 0; i < nents; i++, sg++) { | 444 | for (i = 0; i < nents; i++, sg++) { | 
| 445 | struct page *page = sg->page; | 445 | struct page *page = sg_page(sg); | 
| 446 | unsigned int offset = sg->offset; | 446 | unsigned int offset = sg->offset; | 
| 447 | unsigned int length = sg->length; | 447 | unsigned int length = sg->length; | 
| 448 | void *ptr = page_address(page) + offset; | 448 | void *ptr = page_address(page) + offset; | 
diff --git a/arch/blackfin/kernel/dma-mapping.c b/arch/blackfin/kernel/dma-mapping.c index 94d7b119b71e..a16cb03c5291 100644 --- a/arch/blackfin/kernel/dma-mapping.c +++ b/arch/blackfin/kernel/dma-mapping.c  | |||
| @@ -160,8 +160,7 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 160 | BUG_ON(direction == DMA_NONE); | 160 | BUG_ON(direction == DMA_NONE); | 
| 161 | 161 | ||
| 162 | for (i = 0; i < nents; i++, sg++) { | 162 | for (i = 0; i < nents; i++, sg++) { | 
| 163 | sg->dma_address = (dma_addr_t)(page_address(sg->page) + | 163 | sg->dma_address = (dma_addr_t) sg_virt(sg); | 
| 164 | sg->offset); | ||
| 165 | 164 | ||
| 166 | invalidate_dcache_range(sg_dma_address(sg), | 165 | invalidate_dcache_range(sg_dma_address(sg), | 
| 167 | sg_dma_address(sg) + | 166 | sg_dma_address(sg) + | 
diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3c95f4184b99..bc859a311eaf 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c  | |||
| @@ -246,7 +246,7 @@ static int reserve_sba_gart = 1; | |||
| 246 | static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t); | 246 | static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t); | 
| 247 | static SBA_INLINE void sba_free_range(struct ioc *, dma_addr_t, size_t); | 247 | static SBA_INLINE void sba_free_range(struct ioc *, dma_addr_t, size_t); | 
| 248 | 248 | ||
| 249 | #define sba_sg_address(sg) (page_address((sg)->page) + (sg)->offset) | 249 | #define sba_sg_address(sg) sg_virt((sg)) | 
| 250 | 250 | ||
| 251 | #ifdef FULL_VALID_PDIR | 251 | #ifdef FULL_VALID_PDIR | 
| 252 | static u64 prefetch_spill_page; | 252 | static u64 prefetch_spill_page; | 
diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c index a3a558a06757..6ef9b5219930 100644 --- a/arch/ia64/hp/sim/simscsi.c +++ b/arch/ia64/hp/sim/simscsi.c  | |||
| @@ -131,7 +131,7 @@ simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset) | |||
| 131 | stat.fd = desc[sc->device->id]; | 131 | stat.fd = desc[sc->device->id]; | 
| 132 | 132 | ||
| 133 | scsi_for_each_sg(sc, sl, scsi_sg_count(sc), i) { | 133 | scsi_for_each_sg(sc, sl, scsi_sg_count(sc), i) { | 
| 134 | req.addr = __pa(page_address(sl->page) + sl->offset); | 134 | req.addr = __pa(sg_virt(sl)); | 
| 135 | req.len = sl->length; | 135 | req.len = sl->length; | 
| 136 | if (DBG) | 136 | if (DBG) | 
| 137 | printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n", | 137 | printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n", | 
| @@ -212,7 +212,7 @@ static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len) | |||
| 212 | if (!len) | 212 | if (!len) | 
| 213 | break; | 213 | break; | 
| 214 | thislen = min(len, slp->length); | 214 | thislen = min(len, slp->length); | 
| 215 | memcpy(page_address(slp->page) + slp->offset, buf, thislen); | 215 | memcpy(sg_virt(slp), buf, thislen); | 
| 216 | len -= thislen; | 216 | len -= thislen; | 
| 217 | } | 217 | } | 
| 218 | } | 218 | } | 
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index ecd8a52b9b9e..511db2fd7bff 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c  | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <asm/sn/pcidev.h> | 16 | #include <asm/sn/pcidev.h> | 
| 17 | #include <asm/sn/sn_sal.h> | 17 | #include <asm/sn/sn_sal.h> | 
| 18 | 18 | ||
| 19 | #define SG_ENT_VIRT_ADDRESS(sg) (page_address((sg)->page) + (sg)->offset) | 19 | #define SG_ENT_VIRT_ADDRESS(sg) (sg_virt((sg))) | 
| 20 | #define SG_ENT_PHYS_ADDRESS(SG) virt_to_phys(SG_ENT_VIRT_ADDRESS(SG)) | 20 | #define SG_ENT_PHYS_ADDRESS(SG) virt_to_phys(SG_ENT_VIRT_ADDRESS(SG)) | 
| 21 | 21 | ||
| 22 | /** | 22 | /** | 
diff --git a/arch/m68k/kernel/dma.c b/arch/m68k/kernel/dma.c index 9d4e4b5b6bd8..ef490e1ce600 100644 --- a/arch/m68k/kernel/dma.c +++ b/arch/m68k/kernel/dma.c  | |||
| @@ -121,7 +121,7 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 121 | int i; | 121 | int i; | 
| 122 | 122 | ||
| 123 | for (i = 0; i < nents; sg++, i++) { | 123 | for (i = 0; i < nents; sg++, i++) { | 
| 124 | sg->dma_address = page_to_phys(sg->page) + sg->offset; | 124 | sg->dma_address = sg_phys(sg); | 
| 125 | dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir); | 125 | dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir); | 
| 126 | } | 126 | } | 
| 127 | return nents; | 127 | return nents; | 
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index 98b5e5bac02e..b0b034c4654f 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c  | |||
| @@ -165,12 +165,11 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 165 | for (i = 0; i < nents; i++, sg++) { | 165 | for (i = 0; i < nents; i++, sg++) { | 
| 166 | unsigned long addr; | 166 | unsigned long addr; | 
| 167 | 167 | ||
| 168 | addr = (unsigned long) page_address(sg->page); | 168 | addr = (unsigned long) sg_virt(sg); | 
| 169 | if (!plat_device_is_coherent(dev) && addr) | 169 | if (!plat_device_is_coherent(dev) && addr) | 
| 170 | __dma_sync(addr + sg->offset, sg->length, direction); | 170 | __dma_sync(addr, sg->length, direction); | 
| 171 | sg->dma_address = plat_map_dma_mem(dev, | 171 | sg->dma_address = plat_map_dma_mem(dev, | 
| 172 | (void *)(addr + sg->offset), | 172 | (void *)addr, sg->length); | 
| 173 | sg->length); | ||
| 174 | } | 173 | } | 
| 175 | 174 | ||
| 176 | return nents; | 175 | return nents; | 
| @@ -223,10 +222,9 @@ void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | |||
| 223 | for (i = 0; i < nhwentries; i++, sg++) { | 222 | for (i = 0; i < nhwentries; i++, sg++) { | 
| 224 | if (!plat_device_is_coherent(dev) && | 223 | if (!plat_device_is_coherent(dev) && | 
| 225 | direction != DMA_TO_DEVICE) { | 224 | direction != DMA_TO_DEVICE) { | 
| 226 | addr = (unsigned long) page_address(sg->page); | 225 | addr = (unsigned long) sg_virt(sg); | 
| 227 | if (addr) | 226 | if (addr) | 
| 228 | __dma_sync(addr + sg->offset, sg->length, | 227 | __dma_sync(addr, sg->length, direction); | 
| 229 | direction); | ||
| 230 | } | 228 | } | 
| 231 | plat_unmap_dma_mem(sg->dma_address); | 229 | plat_unmap_dma_mem(sg->dma_address); | 
| 232 | } | 230 | } | 
| @@ -304,7 +302,7 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | |||
| 304 | /* Make sure that gcc doesn't leave the empty loop body. */ | 302 | /* Make sure that gcc doesn't leave the empty loop body. */ | 
| 305 | for (i = 0; i < nelems; i++, sg++) { | 303 | for (i = 0; i < nelems; i++, sg++) { | 
| 306 | if (cpu_is_noncoherent_r10000(dev)) | 304 | if (cpu_is_noncoherent_r10000(dev)) | 
| 307 | __dma_sync((unsigned long)page_address(sg->page), | 305 | __dma_sync((unsigned long)page_address(sg_page(sg)), | 
| 308 | sg->length, direction); | 306 | sg->length, direction); | 
| 309 | plat_unmap_dma_mem(sg->dma_address); | 307 | plat_unmap_dma_mem(sg->dma_address); | 
| 310 | } | 308 | } | 
| @@ -322,7 +320,7 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nele | |||
| 322 | /* Make sure that gcc doesn't leave the empty loop body. */ | 320 | /* Make sure that gcc doesn't leave the empty loop body. */ | 
| 323 | for (i = 0; i < nelems; i++, sg++) { | 321 | for (i = 0; i < nelems; i++, sg++) { | 
| 324 | if (!plat_device_is_coherent(dev)) | 322 | if (!plat_device_is_coherent(dev)) | 
| 325 | __dma_sync((unsigned long)page_address(sg->page), | 323 | __dma_sync((unsigned long)page_address(sg_page(sg)), | 
| 326 | sg->length, direction); | 324 | sg->length, direction); | 
| 327 | plat_unmap_dma_mem(sg->dma_address); | 325 | plat_unmap_dma_mem(sg->dma_address); | 
| 328 | } | 326 | } | 
diff --git a/arch/powerpc/kernel/dma_64.c b/arch/powerpc/kernel/dma_64.c index 9001104b56b0..14206e3f0819 100644 --- a/arch/powerpc/kernel/dma_64.c +++ b/arch/powerpc/kernel/dma_64.c  | |||
| @@ -161,8 +161,7 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | |||
| 161 | int i; | 161 | int i; | 
| 162 | 162 | ||
| 163 | for_each_sg(sgl, sg, nents, i) { | 163 | for_each_sg(sgl, sg, nents, i) { | 
| 164 | sg->dma_address = (page_to_phys(sg->page) + sg->offset) | | 164 | sg->dma_address = sg_phys(sg) | dma_direct_offset; | 
| 165 | dma_direct_offset; | ||
| 166 | sg->dma_length = sg->length; | 165 | sg->dma_length = sg->length; | 
| 167 | } | 166 | } | 
| 168 | 167 | ||
diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c index 289d7e935918..72fd87156b24 100644 --- a/arch/powerpc/kernel/ibmebus.c +++ b/arch/powerpc/kernel/ibmebus.c  | |||
| @@ -102,8 +102,7 @@ static int ibmebus_map_sg(struct device *dev, | |||
| 102 | int i; | 102 | int i; | 
| 103 | 103 | ||
| 104 | for_each_sg(sgl, sg, nents, i) { | 104 | for_each_sg(sgl, sg, nents, i) { | 
| 105 | sg->dma_address = (dma_addr_t)page_address(sg->page) | 105 | sg->dma_address = (dma_addr_t) sg_virt(sg); | 
| 106 | + sg->offset; | ||
| 107 | sg->dma_length = sg->length; | 106 | sg->dma_length = sg->length; | 
| 108 | } | 107 | } | 
| 109 | 108 | ||
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 306a6f75b6c5..2d0c9ef555e9 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c  | |||
| @@ -307,7 +307,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
| 307 | continue; | 307 | continue; | 
| 308 | } | 308 | } | 
| 309 | /* Allocate iommu entries for that segment */ | 309 | /* Allocate iommu entries for that segment */ | 
| 310 | vaddr = (unsigned long)page_address(s->page) + s->offset; | 310 | vaddr = (unsigned long) sg_virt(s); | 
| 311 | npages = iommu_num_pages(vaddr, slen); | 311 | npages = iommu_num_pages(vaddr, slen); | 
| 312 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); | 312 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); | 
| 313 | 313 | ||
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 07e64b48e7fc..6405f4a36763 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c  | |||
| @@ -628,9 +628,8 @@ static int ps3_sb_map_sg(struct device *_dev, struct scatterlist *sgl, | |||
| 628 | int i; | 628 | int i; | 
| 629 | 629 | ||
| 630 | for_each_sg(sgl, sg, nents, i) { | 630 | for_each_sg(sgl, sg, nents, i) { | 
| 631 | int result = ps3_dma_map(dev->d_region, | 631 | int result = ps3_dma_map(dev->d_region, sg_phys(sg), | 
| 632 | page_to_phys(sg->page) + sg->offset, sg->length, | 632 | sg->length, &sg->dma_address, 0); | 
| 633 | &sg->dma_address, 0); | ||
| 634 | 633 | ||
| 635 | if (result) { | 634 | if (result) { | 
| 636 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", | 635 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", | 
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index 9c3ed88853f3..97aa50d1e4ae 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c  | |||
| @@ -727,9 +727,8 @@ int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sgl, int nents, | |||
| 727 | BUG_ON(direction == PCI_DMA_NONE); | 727 | BUG_ON(direction == PCI_DMA_NONE); | 
| 728 | /* IIep is write-through, not flushing. */ | 728 | /* IIep is write-through, not flushing. */ | 
| 729 | for_each_sg(sgl, sg, nents, n) { | 729 | for_each_sg(sgl, sg, nents, n) { | 
| 730 | BUG_ON(page_address(sg->page) == NULL); | 730 | BUG_ON(page_address(sg_page(sg)) == NULL); | 
| 731 | sg->dvma_address = | 731 | sg->dvma_address = virt_to_phys(sg_virt(sg)); | 
| 732 | virt_to_phys(page_address(sg->page)) + sg->offset; | ||
| 733 | sg->dvma_length = sg->length; | 732 | sg->dvma_length = sg->length; | 
| 734 | } | 733 | } | 
| 735 | return nents; | 734 | return nents; | 
| @@ -748,9 +747,9 @@ void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sgl, int nents, | |||
| 748 | BUG_ON(direction == PCI_DMA_NONE); | 747 | BUG_ON(direction == PCI_DMA_NONE); | 
| 749 | if (direction != PCI_DMA_TODEVICE) { | 748 | if (direction != PCI_DMA_TODEVICE) { | 
| 750 | for_each_sg(sgl, sg, nents, n) { | 749 | for_each_sg(sgl, sg, nents, n) { | 
| 751 | BUG_ON(page_address(sg->page) == NULL); | 750 | BUG_ON(page_address(sg_page(sg)) == NULL); | 
| 752 | mmu_inval_dma_area( | 751 | mmu_inval_dma_area( | 
| 753 | (unsigned long) page_address(sg->page), | 752 | (unsigned long) page_address(sg_page(sg)), | 
| 754 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 753 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 
| 755 | } | 754 | } | 
| 756 | } | 755 | } | 
| @@ -798,9 +797,9 @@ void pci_dma_sync_sg_for_cpu(struct pci_dev *hwdev, struct scatterlist *sgl, int | |||
| 798 | BUG_ON(direction == PCI_DMA_NONE); | 797 | BUG_ON(direction == PCI_DMA_NONE); | 
| 799 | if (direction != PCI_DMA_TODEVICE) { | 798 | if (direction != PCI_DMA_TODEVICE) { | 
| 800 | for_each_sg(sgl, sg, nents, n) { | 799 | for_each_sg(sgl, sg, nents, n) { | 
| 801 | BUG_ON(page_address(sg->page) == NULL); | 800 | BUG_ON(page_address(sg_page(sg)) == NULL); | 
| 802 | mmu_inval_dma_area( | 801 | mmu_inval_dma_area( | 
| 803 | (unsigned long) page_address(sg->page), | 802 | (unsigned long) page_address(sg_page(sg)), | 
| 804 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 803 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 
| 805 | } | 804 | } | 
| 806 | } | 805 | } | 
| @@ -814,9 +813,9 @@ void pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sgl, | |||
| 814 | BUG_ON(direction == PCI_DMA_NONE); | 813 | BUG_ON(direction == PCI_DMA_NONE); | 
| 815 | if (direction != PCI_DMA_TODEVICE) { | 814 | if (direction != PCI_DMA_TODEVICE) { | 
| 816 | for_each_sg(sgl, sg, nents, n) { | 815 | for_each_sg(sgl, sg, nents, n) { | 
| 817 | BUG_ON(page_address(sg->page) == NULL); | 816 | BUG_ON(page_address(sg_page(sg)) == NULL); | 
| 818 | mmu_inval_dma_area( | 817 | mmu_inval_dma_area( | 
| 819 | (unsigned long) page_address(sg->page), | 818 | (unsigned long) page_address(sg_page(sg)), | 
| 820 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 819 | (sg->length + PAGE_SIZE-1) & PAGE_MASK); | 
| 821 | } | 820 | } | 
| 822 | } | 821 | } | 
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index 375b4db63704..1666087c5b80 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c  | |||
| @@ -144,7 +144,7 @@ static void iounit_get_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus | |||
| 144 | spin_lock_irqsave(&iounit->lock, flags); | 144 | spin_lock_irqsave(&iounit->lock, flags); | 
| 145 | while (sz != 0) { | 145 | while (sz != 0) { | 
| 146 | --sz; | 146 | --sz; | 
| 147 | sg->dvma_address = iounit_get_area(iounit, (unsigned long)page_address(sg->page) + sg->offset, sg->length); | 147 | sg->dvma_address = iounit_get_area(iounit, sg_virt(sg), sg->length); | 
| 148 | sg->dvma_length = sg->length; | 148 | sg->dvma_length = sg->length; | 
| 149 | sg = sg_next(sg); | 149 | sg = sg_next(sg); | 
| 150 | } | 150 | } | 
diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c index 283656d9f6ea..4b934270f05e 100644 --- a/arch/sparc/mm/iommu.c +++ b/arch/sparc/mm/iommu.c  | |||
| @@ -238,7 +238,7 @@ static void iommu_get_scsi_sgl_noflush(struct scatterlist *sg, int sz, struct sb | |||
| 238 | while (sz != 0) { | 238 | while (sz != 0) { | 
| 239 | --sz; | 239 | --sz; | 
| 240 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; | 240 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; | 
| 241 | sg->dvma_address = iommu_get_one(sg->page, n, sbus) + sg->offset; | 241 | sg->dvma_address = iommu_get_one(sg_page(sg), n, sbus) + sg->offset; | 
| 242 | sg->dvma_length = (__u32) sg->length; | 242 | sg->dvma_length = (__u32) sg->length; | 
| 243 | sg = sg_next(sg); | 243 | sg = sg_next(sg); | 
| 244 | } | 244 | } | 
| @@ -252,7 +252,7 @@ static void iommu_get_scsi_sgl_gflush(struct scatterlist *sg, int sz, struct sbu | |||
| 252 | while (sz != 0) { | 252 | while (sz != 0) { | 
| 253 | --sz; | 253 | --sz; | 
| 254 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; | 254 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; | 
| 255 | sg->dvma_address = iommu_get_one(sg->page, n, sbus) + sg->offset; | 255 | sg->dvma_address = iommu_get_one(sg_page(sg), n, sbus) + sg->offset; | 
| 256 | sg->dvma_length = (__u32) sg->length; | 256 | sg->dvma_length = (__u32) sg->length; | 
| 257 | sg = sg_next(sg); | 257 | sg = sg_next(sg); | 
| 258 | } | 258 | } | 
| @@ -273,7 +273,7 @@ static void iommu_get_scsi_sgl_pflush(struct scatterlist *sg, int sz, struct sbu | |||
| 273 | * XXX Is this a good assumption? | 273 | * XXX Is this a good assumption? | 
| 274 | * XXX What if someone else unmaps it here and races us? | 274 | * XXX What if someone else unmaps it here and races us? | 
| 275 | */ | 275 | */ | 
| 276 | if ((page = (unsigned long) page_address(sg->page)) != 0) { | 276 | if ((page = (unsigned long) page_address(sg_page(sg))) != 0) { | 
| 277 | for (i = 0; i < n; i++) { | 277 | for (i = 0; i < n; i++) { | 
| 278 | if (page != oldpage) { /* Already flushed? */ | 278 | if (page != oldpage) { /* Already flushed? */ | 
| 279 | flush_page_for_dma(page); | 279 | flush_page_for_dma(page); | 
| @@ -283,7 +283,7 @@ static void iommu_get_scsi_sgl_pflush(struct scatterlist *sg, int sz, struct sbu | |||
| 283 | } | 283 | } | 
| 284 | } | 284 | } | 
| 285 | 285 | ||
| 286 | sg->dvma_address = iommu_get_one(sg->page, n, sbus) + sg->offset; | 286 | sg->dvma_address = iommu_get_one(sg_page(sg), n, sbus) + sg->offset; | 
| 287 | sg->dvma_length = (__u32) sg->length; | 287 | sg->dvma_length = (__u32) sg->length; | 
| 288 | sg = sg_next(sg); | 288 | sg = sg_next(sg); | 
| 289 | } | 289 | } | 
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index ee6708fc4492..a2cc141291c7 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c  | |||
| @@ -1228,7 +1228,7 @@ static void sun4c_get_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus * | |||
| 1228 | { | 1228 | { | 
| 1229 | while (sz != 0) { | 1229 | while (sz != 0) { | 
| 1230 | --sz; | 1230 | --sz; | 
| 1231 | sg->dvma_address = (__u32)sun4c_lockarea(page_address(sg->page) + sg->offset, sg->length); | 1231 | sg->dvma_address = (__u32)sun4c_lockarea(sg_virt(sg), sg->length); | 
| 1232 | sg->dvma_length = sg->length; | 1232 | sg->dvma_length = sg->length; | 
| 1233 | sg = sg_next(sg); | 1233 | sg = sg_next(sg); | 
| 1234 | } | 1234 | } | 
diff --git a/arch/sparc64/kernel/iommu.c b/arch/sparc64/kernel/iommu.c index 29af777d7ac9..070a4846c0cb 100644 --- a/arch/sparc64/kernel/iommu.c +++ b/arch/sparc64/kernel/iommu.c  | |||
| @@ -472,8 +472,7 @@ static void dma_4u_unmap_single(struct device *dev, dma_addr_t bus_addr, | |||
| 472 | spin_unlock_irqrestore(&iommu->lock, flags); | 472 | spin_unlock_irqrestore(&iommu->lock, flags); | 
| 473 | } | 473 | } | 
| 474 | 474 | ||
| 475 | #define SG_ENT_PHYS_ADDRESS(SG) \ | 475 | #define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG)))) | 
| 476 | (__pa(page_address((SG)->page)) + (SG)->offset) | ||
| 477 | 476 | ||
| 478 | static void fill_sg(iopte_t *iopte, struct scatterlist *sg, | 477 | static void fill_sg(iopte_t *iopte, struct scatterlist *sg, | 
| 479 | int nused, int nelems, | 478 | int nused, int nelems, | 
| @@ -565,9 +564,7 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, | |||
| 565 | /* Fast path single entry scatterlists. */ | 564 | /* Fast path single entry scatterlists. */ | 
| 566 | if (nelems == 1) { | 565 | if (nelems == 1) { | 
| 567 | sglist->dma_address = | 566 | sglist->dma_address = | 
| 568 | dma_4u_map_single(dev, | 567 | dma_4u_map_single(dev, sg_virt(sglist), | 
| 569 | (page_address(sglist->page) + | ||
| 570 | sglist->offset), | ||
| 571 | sglist->length, direction); | 568 | sglist->length, direction); | 
| 572 | if (unlikely(sglist->dma_address == DMA_ERROR_CODE)) | 569 | if (unlikely(sglist->dma_address == DMA_ERROR_CODE)) | 
| 573 | return 0; | 570 | return 0; | 
diff --git a/arch/sparc64/kernel/iommu_common.c b/arch/sparc64/kernel/iommu_common.c index d7ca900ec51d..78e8277df655 100644 --- a/arch/sparc64/kernel/iommu_common.c +++ b/arch/sparc64/kernel/iommu_common.c  | |||
| @@ -73,7 +73,7 @@ static int verify_one_map(struct scatterlist *dma_sg, struct scatterlist **__sg, | |||
| 73 | 73 | ||
| 74 | daddr = dma_sg->dma_address; | 74 | daddr = dma_sg->dma_address; | 
| 75 | sglen = sg->length; | 75 | sglen = sg->length; | 
| 76 | sgaddr = (unsigned long) (page_address(sg->page) + sg->offset); | 76 | sgaddr = (unsigned long) sg_virt(sg); | 
| 77 | while (dlen > 0) { | 77 | while (dlen > 0) { | 
| 78 | unsigned long paddr; | 78 | unsigned long paddr; | 
| 79 | 79 | ||
| @@ -123,7 +123,7 @@ static int verify_one_map(struct scatterlist *dma_sg, struct scatterlist **__sg, | |||
| 123 | sg = sg_next(sg); | 123 | sg = sg_next(sg); | 
| 124 | if (--nents <= 0) | 124 | if (--nents <= 0) | 
| 125 | break; | 125 | break; | 
| 126 | sgaddr = (unsigned long) (page_address(sg->page) + sg->offset); | 126 | sgaddr = (unsigned long) sg_virt(sg); | 
| 127 | sglen = sg->length; | 127 | sglen = sg->length; | 
| 128 | } | 128 | } | 
| 129 | if (dlen < 0) { | 129 | if (dlen < 0) { | 
| @@ -191,7 +191,7 @@ void verify_sglist(struct scatterlist *sglist, int nents, iopte_t *iopte, int np | |||
| 191 | printk("sg(%d): page_addr(%p) off(%x) length(%x) " | 191 | printk("sg(%d): page_addr(%p) off(%x) length(%x) " | 
| 192 | "dma_address[%016x] dma_length[%016x]\n", | 192 | "dma_address[%016x] dma_length[%016x]\n", | 
| 193 | i, | 193 | i, | 
| 194 | page_address(sg->page), sg->offset, | 194 | page_address(sg_page(sg)), sg->offset, | 
| 195 | sg->length, | 195 | sg->length, | 
| 196 | sg->dma_address, sg->dma_length); | 196 | sg->dma_address, sg->dma_length); | 
| 197 | } | 197 | } | 
| @@ -207,15 +207,14 @@ unsigned long prepare_sg(struct scatterlist *sg, int nents) | |||
| 207 | unsigned long prev; | 207 | unsigned long prev; | 
| 208 | u32 dent_addr, dent_len; | 208 | u32 dent_addr, dent_len; | 
| 209 | 209 | ||
| 210 | prev = (unsigned long) (page_address(sg->page) + sg->offset); | 210 | prev = (unsigned long) sg_virt(sg); | 
| 211 | prev += (unsigned long) (dent_len = sg->length); | 211 | prev += (unsigned long) (dent_len = sg->length); | 
| 212 | dent_addr = (u32) ((unsigned long)(page_address(sg->page) + sg->offset) | 212 | dent_addr = (u32) ((unsigned long)(sg_virt(sg)) & (IO_PAGE_SIZE - 1UL)); | 
| 213 | & (IO_PAGE_SIZE - 1UL)); | ||
| 214 | while (--nents) { | 213 | while (--nents) { | 
| 215 | unsigned long addr; | 214 | unsigned long addr; | 
| 216 | 215 | ||
| 217 | sg = sg_next(sg); | 216 | sg = sg_next(sg); | 
| 218 | addr = (unsigned long) (page_address(sg->page) + sg->offset); | 217 | addr = (unsigned long) sg_virt(sg); | 
| 219 | if (! VCONTIG(prev, addr)) { | 218 | if (! VCONTIG(prev, addr)) { | 
| 220 | dma_sg->dma_address = dent_addr; | 219 | dma_sg->dma_address = dent_addr; | 
| 221 | dma_sg->dma_length = dent_len; | 220 | dma_sg->dma_length = dent_len; | 
diff --git a/arch/sparc64/kernel/ldc.c b/arch/sparc64/kernel/ldc.c index 85a2be0b0962..c8313cb60f0a 100644 --- a/arch/sparc64/kernel/ldc.c +++ b/arch/sparc64/kernel/ldc.c  | |||
| @@ -2057,7 +2057,7 @@ static void fill_cookies(struct cookie_state *sp, unsigned long pa, | |||
| 2057 | 2057 | ||
| 2058 | static int sg_count_one(struct scatterlist *sg) | 2058 | static int sg_count_one(struct scatterlist *sg) | 
| 2059 | { | 2059 | { | 
| 2060 | unsigned long base = page_to_pfn(sg->page) << PAGE_SHIFT; | 2060 | unsigned long base = page_to_pfn(sg_page(sg)) << PAGE_SHIFT; | 
| 2061 | long len = sg->length; | 2061 | long len = sg->length; | 
| 2062 | 2062 | ||
| 2063 | if ((sg->offset | len) & (8UL - 1)) | 2063 | if ((sg->offset | len) & (8UL - 1)) | 
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c index fe46ace3e59f..8c4875bdb4a8 100644 --- a/arch/sparc64/kernel/pci_sun4v.c +++ b/arch/sparc64/kernel/pci_sun4v.c  | |||
| @@ -365,8 +365,7 @@ static void dma_4v_unmap_single(struct device *dev, dma_addr_t bus_addr, | |||
| 365 | spin_unlock_irqrestore(&iommu->lock, flags); | 365 | spin_unlock_irqrestore(&iommu->lock, flags); | 
| 366 | } | 366 | } | 
| 367 | 367 | ||
| 368 | #define SG_ENT_PHYS_ADDRESS(SG) \ | 368 | #define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG)))) | 
| 369 | (__pa(page_address((SG)->page)) + (SG)->offset) | ||
| 370 | 369 | ||
| 371 | static long fill_sg(long entry, struct device *dev, | 370 | static long fill_sg(long entry, struct device *dev, | 
| 372 | struct scatterlist *sg, | 371 | struct scatterlist *sg, | 
| @@ -477,9 +476,7 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, | |||
| 477 | /* Fast path single entry scatterlists. */ | 476 | /* Fast path single entry scatterlists. */ | 
| 478 | if (nelems == 1) { | 477 | if (nelems == 1) { | 
| 479 | sglist->dma_address = | 478 | sglist->dma_address = | 
| 480 | dma_4v_map_single(dev, | 479 | dma_4v_map_single(dev, sg_virt(sglist), | 
| 481 | (page_address(sglist->page) + | ||
| 482 | sglist->offset), | ||
| 483 | sglist->length, direction); | 480 | sglist->length, direction); | 
| 484 | if (unlikely(sglist->dma_address == DMA_ERROR_CODE)) | 481 | if (unlikely(sglist->dma_address == DMA_ERROR_CODE)) | 
| 485 | return 0; | 482 | return 0; | 
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 25b248a02507..3a8cd3dfb51c 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c  | |||
| @@ -1115,7 +1115,7 @@ static void do_ubd_request(struct request_queue *q) | |||
| 1115 | } | 1115 | } | 
| 1116 | prepare_request(req, io_req, | 1116 | prepare_request(req, io_req, | 
| 1117 | (unsigned long long) req->sector << 9, | 1117 | (unsigned long long) req->sector << 9, | 
| 1118 | sg->offset, sg->length, sg->page); | 1118 | sg->offset, sg->length, sg_page(sg)); | 
| 1119 | 1119 | ||
| 1120 | last_sectors = sg->length >> 9; | 1120 | last_sectors = sg->length >> 9; | 
| 1121 | n = os_write_file(thread_fd, &io_req, | 1121 | n = os_write_file(thread_fd, &io_req, | 
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 5098f58063a5..1a20fe31338b 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c  | |||
| @@ -411,8 +411,10 @@ static int calgary_nontranslate_map_sg(struct device* dev, | |||
| 411 | int i; | 411 | int i; | 
| 412 | 412 | ||
| 413 | for_each_sg(sg, s, nelems, i) { | 413 | for_each_sg(sg, s, nelems, i) { | 
| 414 | BUG_ON(!s->page); | 414 | struct page *p = sg_page(s); | 
| 415 | s->dma_address = virt_to_bus(page_address(s->page) +s->offset); | 415 | |
| 416 | BUG_ON(!p); | ||
| 417 | s->dma_address = virt_to_bus(sg_virt(s)); | ||
| 416 | s->dma_length = s->length; | 418 | s->dma_length = s->length; | 
| 417 | } | 419 | } | 
| 418 | return nelems; | 420 | return nelems; | 
| @@ -432,9 +434,9 @@ static int calgary_map_sg(struct device *dev, struct scatterlist *sg, | |||
| 432 | return calgary_nontranslate_map_sg(dev, sg, nelems, direction); | 434 | return calgary_nontranslate_map_sg(dev, sg, nelems, direction); | 
| 433 | 435 | ||
| 434 | for_each_sg(sg, s, nelems, i) { | 436 | for_each_sg(sg, s, nelems, i) { | 
| 435 | BUG_ON(!s->page); | 437 | BUG_ON(!sg_page(s)); | 
| 436 | 438 | ||
| 437 | vaddr = (unsigned long)page_address(s->page) + s->offset; | 439 | vaddr = (unsigned long) sg_virt(s); | 
| 438 | npages = num_dma_pages(vaddr, s->length); | 440 | npages = num_dma_pages(vaddr, s->length); | 
| 439 | 441 | ||
| 440 | entry = iommu_range_alloc(tbl, npages); | 442 | entry = iommu_range_alloc(tbl, npages); | 
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 5cdfab65e93f..c56e9ee64964 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c  | |||
| @@ -302,7 +302,7 @@ static int dma_map_sg_nonforce(struct device *dev, struct scatterlist *sg, | |||
| 302 | #endif | 302 | #endif | 
| 303 | 303 | ||
| 304 | for_each_sg(sg, s, nents, i) { | 304 | for_each_sg(sg, s, nents, i) { | 
| 305 | unsigned long addr = page_to_phys(s->page) + s->offset; | 305 | unsigned long addr = sg_phys(s); | 
| 306 | if (nonforced_iommu(dev, addr, s->length)) { | 306 | if (nonforced_iommu(dev, addr, s->length)) { | 
| 307 | addr = dma_map_area(dev, addr, s->length, dir); | 307 | addr = dma_map_area(dev, addr, s->length, dir); | 
| 308 | if (addr == bad_dma_address) { | 308 | if (addr == bad_dma_address) { | 
| @@ -397,7 +397,7 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 397 | start_sg = sgmap = sg; | 397 | start_sg = sgmap = sg; | 
| 398 | ps = NULL; /* shut up gcc */ | 398 | ps = NULL; /* shut up gcc */ | 
| 399 | for_each_sg(sg, s, nents, i) { | 399 | for_each_sg(sg, s, nents, i) { | 
| 400 | dma_addr_t addr = page_to_phys(s->page) + s->offset; | 400 | dma_addr_t addr = sg_phys(s); | 
| 401 | s->dma_address = addr; | 401 | s->dma_address = addr; | 
| 402 | BUG_ON(s->length == 0); | 402 | BUG_ON(s->length == 0); | 
| 403 | 403 | ||
diff --git a/arch/x86/kernel/pci-nommu_64.c b/arch/x86/kernel/pci-nommu_64.c index e85d4360360c..faf70bdca335 100644 --- a/arch/x86/kernel/pci-nommu_64.c +++ b/arch/x86/kernel/pci-nommu_64.c  | |||
| @@ -62,8 +62,8 @@ static int nommu_map_sg(struct device *hwdev, struct scatterlist *sg, | |||
| 62 | int i; | 62 | int i; | 
| 63 | 63 | ||
| 64 | for_each_sg(sg, s, nents, i) { | 64 | for_each_sg(sg, s, nents, i) { | 
| 65 | BUG_ON(!s->page); | 65 | BUG_ON(!sg_page(s)); | 
| 66 | s->dma_address = virt_to_bus(page_address(s->page) +s->offset); | 66 | s->dma_address = virt_to_bus(sg_virt(s)); | 
| 67 | if (!check_addr("map_sg", hwdev, s->dma_address, s->length)) | 67 | if (!check_addr("map_sg", hwdev, s->dma_address, s->length)) | 
| 68 | return 0; | 68 | return 0; | 
| 69 | s->dma_length = s->length; | 69 | s->dma_length = s->length; | 
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 8025d646ab30..61c2e396f2fa 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c  | |||
| @@ -1354,8 +1354,9 @@ new_segment: | |||
| 1354 | else | 1354 | else | 
| 1355 | sg = sg_next(sg); | 1355 | sg = sg_next(sg); | 
| 1356 | 1356 | ||
| 1357 | memset(sg, 0, sizeof(*sg)); | 1357 | sg_dma_len(sg) = 0; | 
| 1358 | sg->page = bvec->bv_page; | 1358 | sg_dma_address(sg) = 0; | 
| 1359 | sg_set_page(sg, bvec->bv_page); | ||
| 1359 | sg->length = nbytes; | 1360 | sg->length = nbytes; | 
| 1360 | sg->offset = bvec->bv_offset; | 1361 | sg->offset = bvec->bv_offset; | 
| 1361 | nsegs++; | 1362 | nsegs++; | 
| @@ -1363,6 +1364,9 @@ new_segment: | |||
| 1363 | bvprv = bvec; | 1364 | bvprv = bvec; | 
| 1364 | } /* segments in rq */ | 1365 | } /* segments in rq */ | 
| 1365 | 1366 | ||
| 1367 | if (sg) | ||
| 1368 | __sg_mark_end(sg); | ||
| 1369 | |||
| 1366 | return nsegs; | 1370 | return nsegs; | 
| 1367 | } | 1371 | } | 
| 1368 | 1372 | ||
diff --git a/crypto/digest.c b/crypto/digest.c index e56de6748b15..8871dec8cae7 100644 --- a/crypto/digest.c +++ b/crypto/digest.c  | |||
| @@ -41,7 +41,7 @@ static int update2(struct hash_desc *desc, | |||
| 41 | return 0; | 41 | return 0; | 
| 42 | 42 | ||
| 43 | for (;;) { | 43 | for (;;) { | 
| 44 | struct page *pg = sg->page; | 44 | struct page *pg = sg_page(sg); | 
| 45 | unsigned int offset = sg->offset; | 45 | unsigned int offset = sg->offset; | 
| 46 | unsigned int l = sg->length; | 46 | unsigned int l = sg->length; | 
| 47 | 47 | ||
diff --git a/crypto/hmac.c b/crypto/hmac.c index 8802fb6dd5a6..e4eb6ac53b5c 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c  | |||
| @@ -159,7 +159,8 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg, | |||
| 159 | desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 159 | desc.flags = pdesc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 
| 160 | 160 | ||
| 161 | sg_set_buf(sg1, ipad, bs); | 161 | sg_set_buf(sg1, ipad, bs); | 
| 162 | sg1[1].page = (void *)sg; | 162 | |
| 163 | sg_set_page(&sg[1], (void *) sg); | ||
| 163 | sg1[1].length = 0; | 164 | sg1[1].length = 0; | 
| 164 | sg_set_buf(sg2, opad, bs + ds); | 165 | sg_set_buf(sg2, opad, bs + ds); | 
| 165 | 166 | ||
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c index d6852c33cfb7..b9bbda0bb9f9 100644 --- a/crypto/scatterwalk.c +++ b/crypto/scatterwalk.c  | |||
| @@ -54,7 +54,7 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out, | |||
| 54 | if (out) { | 54 | if (out) { | 
| 55 | struct page *page; | 55 | struct page *page; | 
| 56 | 56 | ||
| 57 | page = walk->sg->page + ((walk->offset - 1) >> PAGE_SHIFT); | 57 | page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT); | 
| 58 | flush_dcache_page(page); | 58 | flush_dcache_page(page); | 
| 59 | } | 59 | } | 
| 60 | 60 | ||
diff --git a/crypto/scatterwalk.h b/crypto/scatterwalk.h index 9c73e37a42ce..87ed681cceba 100644 --- a/crypto/scatterwalk.h +++ b/crypto/scatterwalk.h  | |||
| @@ -22,13 +22,13 @@ | |||
| 22 | 22 | ||
| 23 | static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg) | 23 | static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg) | 
| 24 | { | 24 | { | 
| 25 | return (++sg)->length ? sg : (void *)sg->page; | 25 | return (++sg)->length ? sg : (void *) sg_page(sg); | 
| 26 | } | 26 | } | 
| 27 | 27 | ||
| 28 | static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in, | 28 | static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in, | 
| 29 | struct scatter_walk *walk_out) | 29 | struct scatter_walk *walk_out) | 
| 30 | { | 30 | { | 
| 31 | return !(((walk_in->sg->page - walk_out->sg->page) << PAGE_SHIFT) + | 31 | return !(((sg_page(walk_in->sg) - sg_page(walk_out->sg)) << PAGE_SHIFT) + | 
| 32 | (int)(walk_in->offset - walk_out->offset)); | 32 | (int)(walk_in->offset - walk_out->offset)); | 
| 33 | } | 33 | } | 
| 34 | 34 | ||
| @@ -60,7 +60,7 @@ static inline unsigned int scatterwalk_aligned(struct scatter_walk *walk, | |||
| 60 | 60 | ||
| 61 | static inline struct page *scatterwalk_page(struct scatter_walk *walk) | 61 | static inline struct page *scatterwalk_page(struct scatter_walk *walk) | 
| 62 | { | 62 | { | 
| 63 | return walk->sg->page + (walk->offset >> PAGE_SHIFT); | 63 | return sg_page(walk->sg) + (walk->offset >> PAGE_SHIFT); | 
| 64 | } | 64 | } | 
| 65 | 65 | ||
| 66 | static inline void scatterwalk_unmap(void *vaddr, int out) | 66 | static inline void scatterwalk_unmap(void *vaddr, int out) | 
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 18d489c8b935..d741c63af42c 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c  | |||
| @@ -317,7 +317,7 @@ static void test_cipher(char *algo, int enc, | |||
| 317 | goto out; | 317 | goto out; | 
| 318 | } | 318 | } | 
| 319 | 319 | ||
| 320 | q = kmap(sg[0].page) + sg[0].offset; | 320 | q = kmap(sg_page(&sg[0])) + sg[0].offset; | 
| 321 | hexdump(q, cipher_tv[i].rlen); | 321 | hexdump(q, cipher_tv[i].rlen); | 
| 322 | 322 | ||
| 323 | printk("%s\n", | 323 | printk("%s\n", | 
| @@ -390,7 +390,7 @@ static void test_cipher(char *algo, int enc, | |||
| 390 | temp = 0; | 390 | temp = 0; | 
| 391 | for (k = 0; k < cipher_tv[i].np; k++) { | 391 | for (k = 0; k < cipher_tv[i].np; k++) { | 
| 392 | printk("page %u\n", k); | 392 | printk("page %u\n", k); | 
| 393 | q = kmap(sg[k].page) + sg[k].offset; | 393 | q = kmap(sg_page(&sg[k])) + sg[k].offset; | 
| 394 | hexdump(q, cipher_tv[i].tap[k]); | 394 | hexdump(q, cipher_tv[i].tap[k]); | 
| 395 | printk("%s\n", | 395 | printk("%s\n", | 
| 396 | memcmp(q, cipher_tv[i].result + temp, | 396 | memcmp(q, cipher_tv[i].result + temp, | 
diff --git a/crypto/xcbc.c b/crypto/xcbc.c index 9f502b86e0ea..ac68f3b62fde 100644 --- a/crypto/xcbc.c +++ b/crypto/xcbc.c  | |||
| @@ -120,7 +120,7 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, | |||
| 120 | 120 | ||
| 121 | do { | 121 | do { | 
| 122 | 122 | ||
| 123 | struct page *pg = sg[i].page; | 123 | struct page *pg = sg_page(&sg[i]); | 
| 124 | unsigned int offset = sg[i].offset; | 124 | unsigned int offset = sg[i].offset; | 
| 125 | unsigned int slen = sg[i].length; | 125 | unsigned int slen = sg[i].length; | 
| 126 | 126 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 629eadbd0ec0..69092bce1ada 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c  | |||
| @@ -4296,7 +4296,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc) | |||
| 4296 | sg_last(sg, qc->orig_n_elem)->length += qc->pad_len; | 4296 | sg_last(sg, qc->orig_n_elem)->length += qc->pad_len; | 
| 4297 | if (pad_buf) { | 4297 | if (pad_buf) { | 
| 4298 | struct scatterlist *psg = &qc->pad_sgent; | 4298 | struct scatterlist *psg = &qc->pad_sgent; | 
| 4299 | void *addr = kmap_atomic(psg->page, KM_IRQ0); | 4299 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | 
| 4300 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); | 4300 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); | 
| 4301 | kunmap_atomic(addr, KM_IRQ0); | 4301 | kunmap_atomic(addr, KM_IRQ0); | 
| 4302 | } | 4302 | } | 
| @@ -4686,11 +4686,11 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
| 4686 | * data in this function or read data in ata_sg_clean. | 4686 | * data in this function or read data in ata_sg_clean. | 
| 4687 | */ | 4687 | */ | 
| 4688 | offset = lsg->offset + lsg->length - qc->pad_len; | 4688 | offset = lsg->offset + lsg->length - qc->pad_len; | 
| 4689 | psg->page = nth_page(lsg->page, offset >> PAGE_SHIFT); | 4689 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT)); | 
| 4690 | psg->offset = offset_in_page(offset); | 4690 | psg->offset = offset_in_page(offset); | 
| 4691 | 4691 | ||
| 4692 | if (qc->tf.flags & ATA_TFLAG_WRITE) { | 4692 | if (qc->tf.flags & ATA_TFLAG_WRITE) { | 
| 4693 | void *addr = kmap_atomic(psg->page, KM_IRQ0); | 4693 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | 
| 4694 | memcpy(pad_buf, addr + psg->offset, qc->pad_len); | 4694 | memcpy(pad_buf, addr + psg->offset, qc->pad_len); | 
| 4695 | kunmap_atomic(addr, KM_IRQ0); | 4695 | kunmap_atomic(addr, KM_IRQ0); | 
| 4696 | } | 4696 | } | 
| @@ -4836,7 +4836,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
| 4836 | if (qc->curbytes == qc->nbytes - qc->sect_size) | 4836 | if (qc->curbytes == qc->nbytes - qc->sect_size) | 
| 4837 | ap->hsm_task_state = HSM_ST_LAST; | 4837 | ap->hsm_task_state = HSM_ST_LAST; | 
| 4838 | 4838 | ||
| 4839 | page = qc->cursg->page; | 4839 | page = sg_page(qc->cursg); | 
| 4840 | offset = qc->cursg->offset + qc->cursg_ofs; | 4840 | offset = qc->cursg->offset + qc->cursg_ofs; | 
| 4841 | 4841 | ||
| 4842 | /* get the current page and offset */ | 4842 | /* get the current page and offset */ | 
| @@ -4988,7 +4988,7 @@ next_sg: | |||
| 4988 | 4988 | ||
| 4989 | sg = qc->cursg; | 4989 | sg = qc->cursg; | 
| 4990 | 4990 | ||
| 4991 | page = sg->page; | 4991 | page = sg_page(sg); | 
| 4992 | offset = sg->offset + qc->cursg_ofs; | 4992 | offset = sg->offset + qc->cursg_ofs; | 
| 4993 | 4993 | ||
| 4994 | /* get the current page and offset */ | 4994 | /* get the current page and offset */ | 
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 9fbb39cd0f58..5b758b9ad0b8 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c  | |||
| @@ -1544,7 +1544,7 @@ static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out) | |||
| 1544 | struct scatterlist *sg = scsi_sglist(cmd); | 1544 | struct scatterlist *sg = scsi_sglist(cmd); | 
| 1545 | 1545 | ||
| 1546 | if (sg) { | 1546 | if (sg) { | 
| 1547 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1547 | buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1548 | buflen = sg->length; | 1548 | buflen = sg->length; | 
| 1549 | } else { | 1549 | } else { | 
| 1550 | buf = NULL; | 1550 | buf = NULL; | 
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 84d6aa500e26..53505422867c 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c  | |||
| @@ -345,6 +345,7 @@ static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller) | |||
| 345 | Command->V1.ScatterGatherList = | 345 | Command->V1.ScatterGatherList = | 
| 346 | (DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU; | 346 | (DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU; | 
| 347 | Command->V1.ScatterGatherListDMA = ScatterGatherDMA; | 347 | Command->V1.ScatterGatherListDMA = ScatterGatherDMA; | 
| 348 | sg_init_table(Command->cmd_sglist, DAC960_V1_ScatterGatherLimit); | ||
| 348 | } else { | 349 | } else { | 
| 349 | Command->cmd_sglist = Command->V2.ScatterList; | 350 | Command->cmd_sglist = Command->V2.ScatterList; | 
| 350 | Command->V2.ScatterGatherList = | 351 | Command->V2.ScatterGatherList = | 
| @@ -353,6 +354,7 @@ static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller) | |||
| 353 | Command->V2.RequestSense = | 354 | Command->V2.RequestSense = | 
| 354 | (DAC960_SCSI_RequestSense_T *)RequestSenseCPU; | 355 | (DAC960_SCSI_RequestSense_T *)RequestSenseCPU; | 
| 355 | Command->V2.RequestSenseDMA = RequestSenseDMA; | 356 | Command->V2.RequestSenseDMA = RequestSenseDMA; | 
| 357 | sg_init_table(Command->cmd_sglist, DAC960_V2_ScatterGatherLimit); | ||
| 356 | } | 358 | } | 
| 357 | } | 359 | } | 
| 358 | return true; | 360 | return true; | 
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 7c2cfde08f18..5a6fe17fc638 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c  | |||
| @@ -2610,7 +2610,7 @@ static void do_cciss_request(struct request_queue *q) | |||
| 2610 | (int)creq->nr_sectors); | 2610 | (int)creq->nr_sectors); | 
| 2611 | #endif /* CCISS_DEBUG */ | 2611 | #endif /* CCISS_DEBUG */ | 
| 2612 | 2612 | ||
| 2613 | memset(tmp_sg, 0, sizeof(tmp_sg)); | 2613 | sg_init_table(tmp_sg, MAXSGENTRIES); | 
| 2614 | seg = blk_rq_map_sg(q, creq, tmp_sg); | 2614 | seg = blk_rq_map_sg(q, creq, tmp_sg); | 
| 2615 | 2615 | ||
| 2616 | /* get the DMA records for the setup */ | 2616 | /* get the DMA records for the setup */ | 
| @@ -2621,7 +2621,7 @@ static void do_cciss_request(struct request_queue *q) | |||
| 2621 | 2621 | ||
| 2622 | for (i = 0; i < seg; i++) { | 2622 | for (i = 0; i < seg; i++) { | 
| 2623 | c->SG[i].Len = tmp_sg[i].length; | 2623 | c->SG[i].Len = tmp_sg[i].length; | 
| 2624 | temp64.val = (__u64) pci_map_page(h->pdev, tmp_sg[i].page, | 2624 | temp64.val = (__u64) pci_map_page(h->pdev, sg_page(&tmp_sg[i]), | 
| 2625 | tmp_sg[i].offset, | 2625 | tmp_sg[i].offset, | 
| 2626 | tmp_sg[i].length, dir); | 2626 | tmp_sg[i].length, dir); | 
| 2627 | c->SG[i].Addr.lower = temp64.val32.lower; | 2627 | c->SG[i].Addr.lower = temp64.val32.lower; | 
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 568603d3043e..efab27fa1083 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c  | |||
| @@ -918,6 +918,7 @@ queue_next: | |||
| 918 | DBGPX( | 918 | DBGPX( | 
| 919 | printk("sector=%d, nr_sectors=%d\n", creq->sector, creq->nr_sectors); | 919 | printk("sector=%d, nr_sectors=%d\n", creq->sector, creq->nr_sectors); | 
| 920 | ); | 920 | ); | 
| 921 | sg_init_table(tmp_sg, SG_MAX); | ||
| 921 | seg = blk_rq_map_sg(q, creq, tmp_sg); | 922 | seg = blk_rq_map_sg(q, creq, tmp_sg); | 
| 922 | 923 | ||
| 923 | /* Now do all the DMA Mappings */ | 924 | /* Now do all the DMA Mappings */ | 
| @@ -929,7 +930,7 @@ DBGPX( | |||
| 929 | { | 930 | { | 
| 930 | c->req.sg[i].size = tmp_sg[i].length; | 931 | c->req.sg[i].size = tmp_sg[i].length; | 
| 931 | c->req.sg[i].addr = (__u32) pci_map_page(h->pci_dev, | 932 | c->req.sg[i].addr = (__u32) pci_map_page(h->pci_dev, | 
| 932 | tmp_sg[i].page, | 933 | sg_page(&tmp_sg[i]), | 
| 933 | tmp_sg[i].offset, | 934 | tmp_sg[i].offset, | 
| 934 | tmp_sg[i].length, dir); | 935 | tmp_sg[i].length, dir); | 
| 935 | } | 936 | } | 
diff --git a/drivers/block/cryptoloop.c b/drivers/block/cryptoloop.c index 40535036e893..1b58b010797f 100644 --- a/drivers/block/cryptoloop.c +++ b/drivers/block/cryptoloop.c  | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/crypto.h> | 26 | #include <linux/crypto.h> | 
| 27 | #include <linux/blkdev.h> | 27 | #include <linux/blkdev.h> | 
| 28 | #include <linux/loop.h> | 28 | #include <linux/loop.h> | 
| 29 | #include <linux/scatterlist.h> | ||
| 29 | #include <asm/semaphore.h> | 30 | #include <asm/semaphore.h> | 
| 30 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> | 
| 31 | 32 | ||
| @@ -119,14 +120,17 @@ cryptoloop_transfer(struct loop_device *lo, int cmd, | |||
| 119 | .tfm = tfm, | 120 | .tfm = tfm, | 
| 120 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP, | 121 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP, | 
| 121 | }; | 122 | }; | 
| 122 | struct scatterlist sg_out = { NULL, }; | 123 | struct scatterlist sg_out; | 
| 123 | struct scatterlist sg_in = { NULL, }; | 124 | struct scatterlist sg_in; | 
| 124 | 125 | ||
| 125 | encdec_cbc_t encdecfunc; | 126 | encdec_cbc_t encdecfunc; | 
| 126 | struct page *in_page, *out_page; | 127 | struct page *in_page, *out_page; | 
| 127 | unsigned in_offs, out_offs; | 128 | unsigned in_offs, out_offs; | 
| 128 | int err; | 129 | int err; | 
| 129 | 130 | ||
| 131 | sg_init_table(&sg_out, 1); | ||
| 132 | sg_init_table(&sg_in, 1); | ||
| 133 | |||
| 130 | if (cmd == READ) { | 134 | if (cmd == READ) { | 
| 131 | in_page = raw_page; | 135 | in_page = raw_page; | 
| 132 | in_offs = raw_off; | 136 | in_offs = raw_off; | 
| @@ -146,11 +150,11 @@ cryptoloop_transfer(struct loop_device *lo, int cmd, | |||
| 146 | u32 iv[4] = { 0, }; | 150 | u32 iv[4] = { 0, }; | 
| 147 | iv[0] = cpu_to_le32(IV & 0xffffffff); | 151 | iv[0] = cpu_to_le32(IV & 0xffffffff); | 
| 148 | 152 | ||
| 149 | sg_in.page = in_page; | 153 | sg_set_page(&sg_in, in_page); | 
| 150 | sg_in.offset = in_offs; | 154 | sg_in.offset = in_offs; | 
| 151 | sg_in.length = sz; | 155 | sg_in.length = sz; | 
| 152 | 156 | ||
| 153 | sg_out.page = out_page; | 157 | sg_set_page(&sg_out, out_page); | 
| 154 | sg_out.offset = out_offs; | 158 | sg_out.offset = out_offs; | 
| 155 | sg_out.length = sz; | 159 | sg_out.length = sz; | 
| 156 | 160 | ||
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c index 317a790c153b..7276f7d207c2 100644 --- a/drivers/block/sunvdc.c +++ b/drivers/block/sunvdc.c  | |||
| @@ -388,6 +388,7 @@ static int __send_request(struct request *req) | |||
| 388 | op = VD_OP_BWRITE; | 388 | op = VD_OP_BWRITE; | 
| 389 | } | 389 | } | 
| 390 | 390 | ||
| 391 | sg_init_table(sg, port->ring_cookies); | ||
| 391 | nsg = blk_rq_map_sg(req->q, req, sg); | 392 | nsg = blk_rq_map_sg(req->q, req, sg); | 
| 392 | 393 | ||
| 393 | len = 0; | 394 | len = 0; | 
diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c index 402209fec59a..282a69558e8a 100644 --- a/drivers/block/sx8.c +++ b/drivers/block/sx8.c  | |||
| @@ -522,6 +522,7 @@ static struct carm_request *carm_get_request(struct carm_host *host) | |||
| 522 | host->n_msgs++; | 522 | host->n_msgs++; | 
| 523 | 523 | ||
| 524 | assert(host->n_msgs <= CARM_MAX_REQ); | 524 | assert(host->n_msgs <= CARM_MAX_REQ); | 
| 525 | sg_init_table(crq->sg, CARM_MAX_REQ_SG); | ||
| 525 | return crq; | 526 | return crq; | 
| 526 | } | 527 | } | 
| 527 | 528 | ||
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index c57dd2b3a0c8..14143f2c484d 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c  | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/usb_usual.h> | 25 | #include <linux/usb_usual.h> | 
| 26 | #include <linux/blkdev.h> | 26 | #include <linux/blkdev.h> | 
| 27 | #include <linux/timer.h> | 27 | #include <linux/timer.h> | 
| 28 | #include <linux/scatterlist.h> | ||
| 28 | #include <scsi/scsi.h> | 29 | #include <scsi/scsi.h> | 
| 29 | 30 | ||
| 30 | #define DRV_NAME "ub" | 31 | #define DRV_NAME "ub" | 
| @@ -656,6 +657,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
| 656 | if ((cmd = ub_get_cmd(lun)) == NULL) | 657 | if ((cmd = ub_get_cmd(lun)) == NULL) | 
| 657 | return -1; | 658 | return -1; | 
| 658 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); | 659 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); | 
| 660 | sg_init_table(cmd->sgv, UB_MAX_REQ_SG); | ||
| 659 | 661 | ||
| 660 | blkdev_dequeue_request(rq); | 662 | blkdev_dequeue_request(rq); | 
| 661 | 663 | ||
| @@ -1309,9 +1311,8 @@ static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1309 | else | 1311 | else | 
| 1310 | pipe = sc->send_bulk_pipe; | 1312 | pipe = sc->send_bulk_pipe; | 
| 1311 | sc->last_pipe = pipe; | 1313 | sc->last_pipe = pipe; | 
| 1312 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | 1314 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, sg_virt(sg), | 
| 1313 | page_address(sg->page) + sg->offset, sg->length, | 1315 | sg->length, ub_urb_complete, sc); | 
| 1314 | ub_urb_complete, sc); | ||
| 1315 | sc->work_urb.actual_length = 0; | 1316 | sc->work_urb.actual_length = 0; | 
| 1316 | sc->work_urb.error_count = 0; | 1317 | sc->work_urb.error_count = 0; | 
| 1317 | sc->work_urb.status = 0; | 1318 | sc->work_urb.status = 0; | 
| @@ -1427,7 +1428,7 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1427 | scmd->state = UB_CMDST_INIT; | 1428 | scmd->state = UB_CMDST_INIT; | 
| 1428 | scmd->nsg = 1; | 1429 | scmd->nsg = 1; | 
| 1429 | sg = &scmd->sgv[0]; | 1430 | sg = &scmd->sgv[0]; | 
| 1430 | sg->page = virt_to_page(sc->top_sense); | 1431 | sg_set_page(sg, virt_to_page(sc->top_sense)); | 
| 1431 | sg->offset = (unsigned long)sc->top_sense & (PAGE_SIZE-1); | 1432 | sg->offset = (unsigned long)sc->top_sense & (PAGE_SIZE-1); | 
| 1432 | sg->length = UB_SENSE_SIZE; | 1433 | sg->length = UB_SENSE_SIZE; | 
| 1433 | scmd->len = UB_SENSE_SIZE; | 1434 | scmd->len = UB_SENSE_SIZE; | 
| @@ -1863,7 +1864,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | |||
| 1863 | cmd->state = UB_CMDST_INIT; | 1864 | cmd->state = UB_CMDST_INIT; | 
| 1864 | cmd->nsg = 1; | 1865 | cmd->nsg = 1; | 
| 1865 | sg = &cmd->sgv[0]; | 1866 | sg = &cmd->sgv[0]; | 
| 1866 | sg->page = virt_to_page(p); | 1867 | sg_set_page(sg, virt_to_page(p)); | 
| 1867 | sg->offset = (unsigned long)p & (PAGE_SIZE-1); | 1868 | sg->offset = (unsigned long)p & (PAGE_SIZE-1); | 
| 1868 | sg->length = 8; | 1869 | sg->length = 8; | 
| 1869 | cmd->len = 8; | 1870 | cmd->len = 8; | 
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index e824b672e05a..ab5d404faa11 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c  | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <linux/dma-mapping.h> | 41 | #include <linux/dma-mapping.h> | 
| 42 | #include <linux/completion.h> | 42 | #include <linux/completion.h> | 
| 43 | #include <linux/device.h> | 43 | #include <linux/device.h> | 
| 44 | #include <linux/scatterlist.h> | ||
| 44 | 45 | ||
| 45 | #include <asm/uaccess.h> | 46 | #include <asm/uaccess.h> | 
| 46 | #include <asm/vio.h> | 47 | #include <asm/vio.h> | 
| @@ -270,6 +271,7 @@ static int send_request(struct request *req) | |||
| 270 | d = req->rq_disk->private_data; | 271 | d = req->rq_disk->private_data; | 
| 271 | 272 | ||
| 272 | /* Now build the scatter-gather list */ | 273 | /* Now build the scatter-gather list */ | 
| 274 | sg_init_table(sg, VIOMAXBLOCKDMA); | ||
| 273 | nsg = blk_rq_map_sg(req->q, req, sg); | 275 | nsg = blk_rq_map_sg(req->q, req, sg); | 
| 274 | nsg = dma_map_sg(d->dev, sg, nsg, direction); | 276 | nsg = dma_map_sg(d->dev, sg, nsg, direction); | 
| 275 | 277 | ||
diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c index ff20377b4c82..e196aefa2070 100644 --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c  | |||
| @@ -935,11 +935,11 @@ static int cris_ide_build_dmatable (ide_drive_t *drive) | |||
| 935 | * than two possibly non-adjacent physical 4kB pages. | 935 | * than two possibly non-adjacent physical 4kB pages. | 
| 936 | */ | 936 | */ | 
| 937 | /* group sequential buffers into one large buffer */ | 937 | /* group sequential buffers into one large buffer */ | 
| 938 | addr = page_to_phys(sg->page) + sg->offset; | 938 | addr = sg_phys(sg); | 
| 939 | size = sg_dma_len(sg); | 939 | size = sg_dma_len(sg); | 
| 940 | while (--i) { | 940 | while (--i) { | 
| 941 | sg = sg_next(sg); | 941 | sg = sg_next(sg); | 
| 942 | if ((addr + size) != page_to_phys(sg->page) + sg->offset) | 942 | if ((addr + size) != sg_phys(sg)) | 
| 943 | break; | 943 | break; | 
| 944 | size += sg_dma_len(sg); | 944 | size += sg_dma_len(sg); | 
| 945 | } | 945 | } | 
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index d5146c57e5b3..ec55a173c08a 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c  | |||
| @@ -1317,12 +1317,14 @@ static int hwif_init(ide_hwif_t *hwif) | |||
| 1317 | if (!hwif->sg_max_nents) | 1317 | if (!hwif->sg_max_nents) | 
| 1318 | hwif->sg_max_nents = PRD_ENTRIES; | 1318 | hwif->sg_max_nents = PRD_ENTRIES; | 
| 1319 | 1319 | ||
| 1320 | hwif->sg_table = kzalloc(sizeof(struct scatterlist)*hwif->sg_max_nents, | 1320 | hwif->sg_table = kmalloc(sizeof(struct scatterlist)*hwif->sg_max_nents, | 
| 1321 | GFP_KERNEL); | 1321 | GFP_KERNEL); | 
| 1322 | if (!hwif->sg_table) { | 1322 | if (!hwif->sg_table) { | 
| 1323 | printk(KERN_ERR "%s: unable to allocate SG table.\n", hwif->name); | 1323 | printk(KERN_ERR "%s: unable to allocate SG table.\n", hwif->name); | 
| 1324 | goto out; | 1324 | goto out; | 
| 1325 | } | 1325 | } | 
| 1326 | |||
| 1327 | sg_init_table(hwif->sg_table, hwif->sg_max_nents); | ||
| 1326 | 1328 | ||
| 1327 | if (init_irq(hwif) == 0) | 1329 | if (init_irq(hwif) == 0) | 
| 1328 | goto done; | 1330 | goto done; | 
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 73ef6bf5fbcc..d066546f2831 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c  | |||
| @@ -261,7 +261,7 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) | |||
| 261 | hwif->cursg = sg; | 261 | hwif->cursg = sg; | 
| 262 | } | 262 | } | 
| 263 | 263 | ||
| 264 | page = cursg->page; | 264 | page = sg_page(cursg); | 
| 265 | offset = cursg->offset + hwif->cursg_ofs * SECTOR_SIZE; | 265 | offset = cursg->offset + hwif->cursg_ofs * SECTOR_SIZE; | 
| 266 | 266 | ||
| 267 | /* get the current page and offset */ | 267 | /* get the current page and offset */ | 
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index 1de58566e5b6..a4ce3ba15d61 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c  | |||
| @@ -276,8 +276,7 @@ static int auide_build_dmatable(ide_drive_t *drive) | |||
| 276 | 276 | ||
| 277 | if (iswrite) { | 277 | if (iswrite) { | 
| 278 | if(!put_source_flags(ahwif->tx_chan, | 278 | if(!put_source_flags(ahwif->tx_chan, | 
| 279 | (void*)(page_address(sg->page) | 279 | (void*) sg_virt(sg), | 
| 280 | + sg->offset), | ||
| 281 | tc, flags)) { | 280 | tc, flags)) { | 
| 282 | printk(KERN_ERR "%s failed %d\n", | 281 | printk(KERN_ERR "%s failed %d\n", | 
| 283 | __FUNCTION__, __LINE__); | 282 | __FUNCTION__, __LINE__); | 
| @@ -285,8 +284,7 @@ static int auide_build_dmatable(ide_drive_t *drive) | |||
| 285 | } else | 284 | } else | 
| 286 | { | 285 | { | 
| 287 | if(!put_dest_flags(ahwif->rx_chan, | 286 | if(!put_dest_flags(ahwif->rx_chan, | 
| 288 | (void*)(page_address(sg->page) | 287 | (void*) sg_virt(sg), | 
| 289 | + sg->offset), | ||
| 290 | tc, flags)) { | 288 | tc, flags)) { | 
| 291 | printk(KERN_ERR "%s failed %d\n", | 289 | printk(KERN_ERR "%s failed %d\n", | 
| 292 | __FUNCTION__, __LINE__); | 290 | __FUNCTION__, __LINE__); | 
diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c index 45d605581922..25e113b50d86 100644 --- a/drivers/ieee1394/dma.c +++ b/drivers/ieee1394/dma.c  | |||
| @@ -111,7 +111,7 @@ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, | |||
| 111 | unsigned long va = | 111 | unsigned long va = | 
| 112 | (unsigned long)dma->kvirt + (i << PAGE_SHIFT); | 112 | (unsigned long)dma->kvirt + (i << PAGE_SHIFT); | 
| 113 | 113 | ||
| 114 | dma->sglist[i].page = vmalloc_to_page((void *)va); | 114 | sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va)); | 
| 115 | dma->sglist[i].length = PAGE_SIZE; | 115 | dma->sglist[i].length = PAGE_SIZE; | 
| 116 | } | 116 | } | 
| 117 | 117 | ||
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 1b353b964b33..d5dfe11aa5c6 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c  | |||
| @@ -1466,7 +1466,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, | |||
| 1466 | cmd->dma_size = sgpnt[0].length; | 1466 | cmd->dma_size = sgpnt[0].length; | 
| 1467 | cmd->dma_type = CMD_DMA_PAGE; | 1467 | cmd->dma_type = CMD_DMA_PAGE; | 
| 1468 | cmd->cmd_dma = dma_map_page(hi->host->device.parent, | 1468 | cmd->cmd_dma = dma_map_page(hi->host->device.parent, | 
| 1469 | sgpnt[0].page, sgpnt[0].offset, | 1469 | sg_page(&sgpnt[0]), sgpnt[0].offset, | 
| 1470 | cmd->dma_size, cmd->dma_dir); | 1470 | cmd->dma_size, cmd->dma_dir); | 
| 1471 | 1471 | ||
| 1472 | orb->data_descriptor_lo = cmd->cmd_dma; | 1472 | orb->data_descriptor_lo = cmd->cmd_dma; | 
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 2f54e29dc7a6..14159ff29408 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c  | |||
| @@ -55,9 +55,11 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d | |||
| 55 | ib_dma_unmap_sg(dev, chunk->page_list, | 55 | ib_dma_unmap_sg(dev, chunk->page_list, | 
| 56 | chunk->nents, DMA_BIDIRECTIONAL); | 56 | chunk->nents, DMA_BIDIRECTIONAL); | 
| 57 | for (i = 0; i < chunk->nents; ++i) { | 57 | for (i = 0; i < chunk->nents; ++i) { | 
| 58 | struct page *page = sg_page(&chunk->page_list[i]); | ||
| 59 | |||
| 58 | if (umem->writable && dirty) | 60 | if (umem->writable && dirty) | 
| 59 | set_page_dirty_lock(chunk->page_list[i].page); | 61 | set_page_dirty_lock(page); | 
| 60 | put_page(chunk->page_list[i].page); | 62 | put_page(page); | 
| 61 | } | 63 | } | 
| 62 | 64 | ||
| 63 | kfree(chunk); | 65 | kfree(chunk); | 
| @@ -164,11 +166,12 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
| 164 | } | 166 | } | 
| 165 | 167 | ||
| 166 | chunk->nents = min_t(int, ret, IB_UMEM_MAX_PAGE_CHUNK); | 168 | chunk->nents = min_t(int, ret, IB_UMEM_MAX_PAGE_CHUNK); | 
| 169 | sg_init_table(chunk->page_list, chunk->nents); | ||
| 167 | for (i = 0; i < chunk->nents; ++i) { | 170 | for (i = 0; i < chunk->nents; ++i) { | 
| 168 | if (vma_list && | 171 | if (vma_list && | 
| 169 | !is_vm_hugetlb_page(vma_list[i + off])) | 172 | !is_vm_hugetlb_page(vma_list[i + off])) | 
| 170 | umem->hugetlb = 0; | 173 | umem->hugetlb = 0; | 
| 171 | chunk->page_list[i].page = page_list[i + off]; | 174 | sg_set_page(&chunk->page_list[i], page_list[i + off]); | 
| 172 | chunk->page_list[i].offset = 0; | 175 | chunk->page_list[i].offset = 0; | 
| 173 | chunk->page_list[i].length = PAGE_SIZE; | 176 | chunk->page_list[i].length = PAGE_SIZE; | 
| 174 | } | 177 | } | 
| @@ -179,7 +182,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
| 179 | DMA_BIDIRECTIONAL); | 182 | DMA_BIDIRECTIONAL); | 
| 180 | if (chunk->nmap <= 0) { | 183 | if (chunk->nmap <= 0) { | 
| 181 | for (i = 0; i < chunk->nents; ++i) | 184 | for (i = 0; i < chunk->nents; ++i) | 
| 182 | put_page(chunk->page_list[i].page); | 185 | put_page(sg_page(&chunk->page_list[i])); | 
| 183 | kfree(chunk); | 186 | kfree(chunk); | 
| 184 | 187 | ||
| 185 | ret = -ENOMEM; | 188 | ret = -ENOMEM; | 
diff --git a/drivers/infiniband/hw/ipath/ipath_dma.c b/drivers/infiniband/hw/ipath/ipath_dma.c index 22709a4f8fc8..e90a0ea538a0 100644 --- a/drivers/infiniband/hw/ipath/ipath_dma.c +++ b/drivers/infiniband/hw/ipath/ipath_dma.c  | |||
| @@ -108,7 +108,7 @@ static int ipath_map_sg(struct ib_device *dev, struct scatterlist *sgl, | |||
| 108 | BUG_ON(!valid_dma_direction(direction)); | 108 | BUG_ON(!valid_dma_direction(direction)); | 
| 109 | 109 | ||
| 110 | for_each_sg(sgl, sg, nents, i) { | 110 | for_each_sg(sgl, sg, nents, i) { | 
| 111 | addr = (u64) page_address(sg->page); | 111 | addr = (u64) page_address(sg_page(sg)); | 
| 112 | /* TODO: handle highmem pages */ | 112 | /* TODO: handle highmem pages */ | 
| 113 | if (!addr) { | 113 | if (!addr) { | 
| 114 | ret = 0; | 114 | ret = 0; | 
| @@ -127,7 +127,7 @@ static void ipath_unmap_sg(struct ib_device *dev, | |||
| 127 | 127 | ||
| 128 | static u64 ipath_sg_dma_address(struct ib_device *dev, struct scatterlist *sg) | 128 | static u64 ipath_sg_dma_address(struct ib_device *dev, struct scatterlist *sg) | 
| 129 | { | 129 | { | 
| 130 | u64 addr = (u64) page_address(sg->page); | 130 | u64 addr = (u64) page_address(sg_page(sg)); | 
| 131 | 131 | ||
| 132 | if (addr) | 132 | if (addr) | 
| 133 | addr += sg->offset; | 133 | addr += sg->offset; | 
diff --git a/drivers/infiniband/hw/ipath/ipath_mr.c b/drivers/infiniband/hw/ipath/ipath_mr.c index e442470a2375..db4ba92f79fc 100644 --- a/drivers/infiniband/hw/ipath/ipath_mr.c +++ b/drivers/infiniband/hw/ipath/ipath_mr.c  | |||
| @@ -225,7 +225,7 @@ struct ib_mr *ipath_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
| 225 | for (i = 0; i < chunk->nents; i++) { | 225 | for (i = 0; i < chunk->nents; i++) { | 
| 226 | void *vaddr; | 226 | void *vaddr; | 
| 227 | 227 | ||
| 228 | vaddr = page_address(chunk->page_list[i].page); | 228 | vaddr = page_address(sg_page(&chunk->page_list[i])); | 
| 229 | if (!vaddr) { | 229 | if (!vaddr) { | 
| 230 | ret = ERR_PTR(-EINVAL); | 230 | ret = ERR_PTR(-EINVAL); | 
| 231 | goto bail; | 231 | goto bail; | 
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c index e61f3e626980..007b38157fc4 100644 --- a/drivers/infiniband/hw/mthca/mthca_memfree.c +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c  | |||
| @@ -71,7 +71,7 @@ static void mthca_free_icm_pages(struct mthca_dev *dev, struct mthca_icm_chunk * | |||
| 71 | PCI_DMA_BIDIRECTIONAL); | 71 | PCI_DMA_BIDIRECTIONAL); | 
| 72 | 72 | ||
| 73 | for (i = 0; i < chunk->npages; ++i) | 73 | for (i = 0; i < chunk->npages; ++i) | 
| 74 | __free_pages(chunk->mem[i].page, | 74 | __free_pages(sg_page(&chunk->mem[i]), | 
| 75 | get_order(chunk->mem[i].length)); | 75 | get_order(chunk->mem[i].length)); | 
| 76 | } | 76 | } | 
| 77 | 77 | ||
| @@ -81,7 +81,7 @@ static void mthca_free_icm_coherent(struct mthca_dev *dev, struct mthca_icm_chun | |||
| 81 | 81 | ||
| 82 | for (i = 0; i < chunk->npages; ++i) { | 82 | for (i = 0; i < chunk->npages; ++i) { | 
| 83 | dma_free_coherent(&dev->pdev->dev, chunk->mem[i].length, | 83 | dma_free_coherent(&dev->pdev->dev, chunk->mem[i].length, | 
| 84 | lowmem_page_address(chunk->mem[i].page), | 84 | lowmem_page_address(sg_page(&chunk->mem[i])), | 
| 85 | sg_dma_address(&chunk->mem[i])); | 85 | sg_dma_address(&chunk->mem[i])); | 
| 86 | } | 86 | } | 
| 87 | } | 87 | } | 
| @@ -107,10 +107,13 @@ void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm, int coherent) | |||
| 107 | 107 | ||
| 108 | static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) | 108 | static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) | 
| 109 | { | 109 | { | 
| 110 | mem->page = alloc_pages(gfp_mask, order); | 110 | struct page *page; | 
| 111 | if (!mem->page) | 111 | |
| 112 | page = alloc_pages(gfp_mask, order); | ||
| 113 | if (!page) | ||
| 112 | return -ENOMEM; | 114 | return -ENOMEM; | 
| 113 | 115 | ||
| 116 | sg_set_page(mem, page); | ||
| 114 | mem->length = PAGE_SIZE << order; | 117 | mem->length = PAGE_SIZE << order; | 
| 115 | mem->offset = 0; | 118 | mem->offset = 0; | 
| 116 | return 0; | 119 | return 0; | 
| @@ -157,6 +160,7 @@ struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages, | |||
| 157 | if (!chunk) | 160 | if (!chunk) | 
| 158 | goto fail; | 161 | goto fail; | 
| 159 | 162 | ||
| 163 | sg_init_table(chunk->mem, MTHCA_ICM_CHUNK_LEN); | ||
| 160 | chunk->npages = 0; | 164 | chunk->npages = 0; | 
| 161 | chunk->nsg = 0; | 165 | chunk->nsg = 0; | 
| 162 | list_add_tail(&chunk->list, &icm->chunk_list); | 166 | list_add_tail(&chunk->list, &icm->chunk_list); | 
| @@ -304,7 +308,7 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj, dma_addr_t *dma_h | |||
| 304 | * so if we found the page, dma_handle has already | 308 | * so if we found the page, dma_handle has already | 
| 305 | * been assigned to. */ | 309 | * been assigned to. */ | 
| 306 | if (chunk->mem[i].length > offset) { | 310 | if (chunk->mem[i].length > offset) { | 
| 307 | page = chunk->mem[i].page; | 311 | page = sg_page(&chunk->mem[i]); | 
| 308 | goto out; | 312 | goto out; | 
| 309 | } | 313 | } | 
| 310 | offset -= chunk->mem[i].length; | 314 | offset -= chunk->mem[i].length; | 
| @@ -445,6 +449,7 @@ static u64 mthca_uarc_virt(struct mthca_dev *dev, struct mthca_uar *uar, int pag | |||
| 445 | int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, | 449 | int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, | 
| 446 | struct mthca_user_db_table *db_tab, int index, u64 uaddr) | 450 | struct mthca_user_db_table *db_tab, int index, u64 uaddr) | 
| 447 | { | 451 | { | 
| 452 | struct page *pages[1]; | ||
| 448 | int ret = 0; | 453 | int ret = 0; | 
| 449 | u8 status; | 454 | u8 status; | 
| 450 | int i; | 455 | int i; | 
| @@ -472,16 +477,17 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, | |||
| 472 | } | 477 | } | 
| 473 | 478 | ||
| 474 | ret = get_user_pages(current, current->mm, uaddr & PAGE_MASK, 1, 1, 0, | 479 | ret = get_user_pages(current, current->mm, uaddr & PAGE_MASK, 1, 1, 0, | 
| 475 | &db_tab->page[i].mem.page, NULL); | 480 | pages, NULL); | 
| 476 | if (ret < 0) | 481 | if (ret < 0) | 
| 477 | goto out; | 482 | goto out; | 
| 478 | 483 | ||
| 484 | sg_set_page(&db_tab->page[i].mem, pages[0]); | ||
| 479 | db_tab->page[i].mem.length = MTHCA_ICM_PAGE_SIZE; | 485 | db_tab->page[i].mem.length = MTHCA_ICM_PAGE_SIZE; | 
| 480 | db_tab->page[i].mem.offset = uaddr & ~PAGE_MASK; | 486 | db_tab->page[i].mem.offset = uaddr & ~PAGE_MASK; | 
| 481 | 487 | ||
| 482 | ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 488 | ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 
| 483 | if (ret < 0) { | 489 | if (ret < 0) { | 
| 484 | put_page(db_tab->page[i].mem.page); | 490 | put_page(pages[0]); | 
| 485 | goto out; | 491 | goto out; | 
| 486 | } | 492 | } | 
| 487 | 493 | ||
| @@ -491,7 +497,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar, | |||
| 491 | ret = -EINVAL; | 497 | ret = -EINVAL; | 
| 492 | if (ret) { | 498 | if (ret) { | 
| 493 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 499 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 
| 494 | put_page(db_tab->page[i].mem.page); | 500 | put_page(sg_page(&db_tab->page[i].mem)); | 
| 495 | goto out; | 501 | goto out; | 
| 496 | } | 502 | } | 
| 497 | 503 | ||
| @@ -557,7 +563,7 @@ void mthca_cleanup_user_db_tab(struct mthca_dev *dev, struct mthca_uar *uar, | |||
| 557 | if (db_tab->page[i].uvirt) { | 563 | if (db_tab->page[i].uvirt) { | 
| 558 | mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, uar, i), 1, &status); | 564 | mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, uar, i), 1, &status); | 
| 559 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 565 | pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE); | 
| 560 | put_page(db_tab->page[i].mem.page); | 566 | put_page(sg_page(&db_tab->page[i].mem)); | 
| 561 | } | 567 | } | 
| 562 | } | 568 | } | 
| 563 | 569 | ||
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index f3529b6f0a33..d68798061795 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c  | |||
| @@ -131,7 +131,7 @@ static int iser_start_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask, | |||
| 131 | 131 | ||
| 132 | p = mem; | 132 | p = mem; | 
| 133 | for_each_sg(sgl, sg, data->size, i) { | 133 | for_each_sg(sgl, sg, data->size, i) { | 
| 134 | from = kmap_atomic(sg->page, KM_USER0); | 134 | from = kmap_atomic(sg_page(sg), KM_USER0); | 
| 135 | memcpy(p, | 135 | memcpy(p, | 
| 136 | from + sg->offset, | 136 | from + sg->offset, | 
| 137 | sg->length); | 137 | sg->length); | 
| @@ -191,7 +191,7 @@ void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask, | |||
| 191 | 191 | ||
| 192 | p = mem; | 192 | p = mem; | 
| 193 | for_each_sg(sgl, sg, sg_size, i) { | 193 | for_each_sg(sgl, sg, sg_size, i) { | 
| 194 | to = kmap_atomic(sg->page, KM_SOFTIRQ0); | 194 | to = kmap_atomic(sg_page(sg), KM_SOFTIRQ0); | 
| 195 | memcpy(to + sg->offset, | 195 | memcpy(to + sg->offset, | 
| 196 | p, | 196 | p, | 
| 197 | sg->length); | 197 | sg->length); | 
| @@ -300,7 +300,7 @@ static unsigned int iser_data_buf_aligned_len(struct iser_data_buf *data, | |||
| 300 | for_each_sg(sgl, sg, data->dma_nents, i) { | 300 | for_each_sg(sgl, sg, data->dma_nents, i) { | 
| 301 | /* iser_dbg("Checking sg iobuf [%d]: phys=0x%08lX " | 301 | /* iser_dbg("Checking sg iobuf [%d]: phys=0x%08lX " | 
| 302 | "offset: %ld sz: %ld\n", i, | 302 | "offset: %ld sz: %ld\n", i, | 
| 303 | (unsigned long)page_to_phys(sg->page), | 303 | (unsigned long)sg_phys(sg), | 
| 304 | (unsigned long)sg->offset, | 304 | (unsigned long)sg->offset, | 
| 305 | (unsigned long)sg->length); */ | 305 | (unsigned long)sg->length); */ | 
| 306 | end_addr = ib_sg_dma_address(ibdev, sg) + | 306 | end_addr = ib_sg_dma_address(ibdev, sg) + | 
| @@ -336,7 +336,7 @@ static void iser_data_buf_dump(struct iser_data_buf *data, | |||
| 336 | iser_err("sg[%d] dma_addr:0x%lX page:0x%p " | 336 | iser_err("sg[%d] dma_addr:0x%lX page:0x%p " | 
| 337 | "off:0x%x sz:0x%x dma_len:0x%x\n", | 337 | "off:0x%x sz:0x%x dma_len:0x%x\n", | 
| 338 | i, (unsigned long)ib_sg_dma_address(ibdev, sg), | 338 | i, (unsigned long)ib_sg_dma_address(ibdev, sg), | 
| 339 | sg->page, sg->offset, | 339 | sg_page(sg), sg->offset, | 
| 340 | sg->length, ib_sg_dma_len(ibdev, sg)); | 340 | sg->length, ib_sg_dma_len(ibdev, sg)); | 
| 341 | } | 341 | } | 
| 342 | 342 | ||
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 0eb5416798bd..ac54f697c508 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c  | |||
| @@ -348,16 +348,17 @@ static int crypt_convert(struct crypt_config *cc, | |||
| 348 | ctx->idx_out < ctx->bio_out->bi_vcnt) { | 348 | ctx->idx_out < ctx->bio_out->bi_vcnt) { | 
| 349 | struct bio_vec *bv_in = bio_iovec_idx(ctx->bio_in, ctx->idx_in); | 349 | struct bio_vec *bv_in = bio_iovec_idx(ctx->bio_in, ctx->idx_in); | 
| 350 | struct bio_vec *bv_out = bio_iovec_idx(ctx->bio_out, ctx->idx_out); | 350 | struct bio_vec *bv_out = bio_iovec_idx(ctx->bio_out, ctx->idx_out); | 
| 351 | struct scatterlist sg_in = { | 351 | struct scatterlist sg_in, sg_out; | 
| 352 | .page = bv_in->bv_page, | 352 | |
| 353 | .offset = bv_in->bv_offset + ctx->offset_in, | 353 | sg_init_table(&sg_in, 1); | 
| 354 | .length = 1 << SECTOR_SHIFT | 354 | sg_set_page(&sg_in, bv_in->bv_page); | 
| 355 | }; | 355 | sg_in.offset = bv_in->bv_offset + ctx->offset_in; | 
| 356 | struct scatterlist sg_out = { | 356 | sg_in.length = 1 << SECTOR_SHIFT; | 
| 357 | .page = bv_out->bv_page, | 357 | |
| 358 | .offset = bv_out->bv_offset + ctx->offset_out, | 358 | sg_init_table(&sg_out, 1); | 
| 359 | .length = 1 << SECTOR_SHIFT | 359 | sg_set_page(&sg_out, bv_out->bv_page); | 
| 360 | }; | 360 | sg_out.offset = bv_out->bv_offset + ctx->offset_out; | 
| 361 | sg_out.length = 1 << SECTOR_SHIFT; | ||
| 361 | 362 | ||
| 362 | ctx->offset_in += sg_in.length; | 363 | ctx->offset_in += sg_in.length; | 
| 363 | if (ctx->offset_in >= bv_in->bv_len) { | 364 | if (ctx->offset_in >= bv_in->bv_len) { | 
diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c index 365a22118a09..2b1f8b4be00a 100644 --- a/drivers/media/common/saa7146_core.c +++ b/drivers/media/common/saa7146_core.c  | |||
| @@ -112,12 +112,13 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages) | |||
| 112 | sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL); | 112 | sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL); | 
| 113 | if (NULL == sglist) | 113 | if (NULL == sglist) | 
| 114 | return NULL; | 114 | return NULL; | 
| 115 | sg_init_table(sglist, nr_pages); | ||
| 115 | for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) { | 116 | for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) { | 
| 116 | pg = vmalloc_to_page(virt); | 117 | pg = vmalloc_to_page(virt); | 
| 117 | if (NULL == pg) | 118 | if (NULL == pg) | 
| 118 | goto err; | 119 | goto err; | 
| 119 | BUG_ON(PageHighMem(pg)); | 120 | BUG_ON(PageHighMem(pg)); | 
| 120 | sglist[i].page = pg; | 121 | sg_set_page(&sglist[i], pg); | 
| 121 | sglist[i].length = PAGE_SIZE; | 122 | sglist[i].length = PAGE_SIZE; | 
| 122 | } | 123 | } | 
| 123 | return sglist; | 124 | return sglist; | 
diff --git a/drivers/media/video/ivtv/ivtv-udma.c b/drivers/media/video/ivtv/ivtv-udma.c index c4626d1cdf41..912b424e5204 100644 --- a/drivers/media/video/ivtv/ivtv-udma.c +++ b/drivers/media/video/ivtv/ivtv-udma.c  | |||
| @@ -63,10 +63,10 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info | |||
| 63 | memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len); | 63 | memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len); | 
| 64 | kunmap_atomic(src, KM_BOUNCE_READ); | 64 | kunmap_atomic(src, KM_BOUNCE_READ); | 
| 65 | local_irq_restore(flags); | 65 | local_irq_restore(flags); | 
| 66 | dma->SGlist[map_offset].page = dma->bouncemap[map_offset]; | 66 | sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset]); | 
| 67 | } | 67 | } | 
| 68 | else { | 68 | else { | 
| 69 | dma->SGlist[map_offset].page = dma->map[map_offset]; | 69 | sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset]); | 
| 70 | } | 70 | } | 
| 71 | offset = 0; | 71 | offset = 0; | 
| 72 | map_offset++; | 72 | map_offset++; | 
diff --git a/drivers/media/video/videobuf-dma-sg.c b/drivers/media/video/videobuf-dma-sg.c index 3eb6123227b2..0a18286279d3 100644 --- a/drivers/media/video/videobuf-dma-sg.c +++ b/drivers/media/video/videobuf-dma-sg.c  | |||
| @@ -60,12 +60,13 @@ videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages) | |||
| 60 | sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL); | 60 | sglist = kcalloc(nr_pages, sizeof(struct scatterlist), GFP_KERNEL); | 
| 61 | if (NULL == sglist) | 61 | if (NULL == sglist) | 
| 62 | return NULL; | 62 | return NULL; | 
| 63 | sg_init_table(sglist, nr_pages); | ||
| 63 | for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) { | 64 | for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) { | 
| 64 | pg = vmalloc_to_page(virt); | 65 | pg = vmalloc_to_page(virt); | 
| 65 | if (NULL == pg) | 66 | if (NULL == pg) | 
| 66 | goto err; | 67 | goto err; | 
| 67 | BUG_ON(PageHighMem(pg)); | 68 | BUG_ON(PageHighMem(pg)); | 
| 68 | sglist[i].page = pg; | 69 | sg_set_page(&sglist[i], pg); | 
| 69 | sglist[i].length = PAGE_SIZE; | 70 | sglist[i].length = PAGE_SIZE; | 
| 70 | } | 71 | } | 
| 71 | return sglist; | 72 | return sglist; | 
| @@ -86,13 +87,14 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset) | |||
| 86 | sglist = kcalloc(nr_pages, sizeof(*sglist), GFP_KERNEL); | 87 | sglist = kcalloc(nr_pages, sizeof(*sglist), GFP_KERNEL); | 
| 87 | if (NULL == sglist) | 88 | if (NULL == sglist) | 
| 88 | return NULL; | 89 | return NULL; | 
| 90 | sg_init_table(sglist, nr_pages); | ||
| 89 | 91 | ||
| 90 | if (NULL == pages[0]) | 92 | if (NULL == pages[0]) | 
| 91 | goto nopage; | 93 | goto nopage; | 
| 92 | if (PageHighMem(pages[0])) | 94 | if (PageHighMem(pages[0])) | 
| 93 | /* DMA to highmem pages might not work */ | 95 | /* DMA to highmem pages might not work */ | 
| 94 | goto highmem; | 96 | goto highmem; | 
| 95 | sglist[0].page = pages[0]; | 97 | sg_set_page(&sglist[0], pages[0]); | 
| 96 | sglist[0].offset = offset; | 98 | sglist[0].offset = offset; | 
| 97 | sglist[0].length = PAGE_SIZE - offset; | 99 | sglist[0].length = PAGE_SIZE - offset; | 
| 98 | for (i = 1; i < nr_pages; i++) { | 100 | for (i = 1; i < nr_pages; i++) { | 
| @@ -100,7 +102,7 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset) | |||
| 100 | goto nopage; | 102 | goto nopage; | 
| 101 | if (PageHighMem(pages[i])) | 103 | if (PageHighMem(pages[i])) | 
| 102 | goto highmem; | 104 | goto highmem; | 
| 103 | sglist[i].page = pages[i]; | 105 | sg_set_page(&sglist[i], pages[i]); | 
| 104 | sglist[i].length = PAGE_SIZE; | 106 | sglist[i].length = PAGE_SIZE; | 
| 105 | } | 107 | } | 
| 106 | return sglist; | 108 | return sglist; | 
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index a5d0354bbbda..9203a0b221b3 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c  | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/blkdev.h> | 13 | #include <linux/blkdev.h> | 
| 14 | #include <linux/freezer.h> | 14 | #include <linux/freezer.h> | 
| 15 | #include <linux/kthread.h> | 15 | #include <linux/kthread.h> | 
| 16 | #include <linux/scatterlist.h> | ||
| 16 | 17 | ||
| 17 | #include <linux/mmc/card.h> | 18 | #include <linux/mmc/card.h> | 
| 18 | #include <linux/mmc/host.h> | 19 | #include <linux/mmc/host.h> | 
| @@ -153,19 +154,21 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock | |||
| 153 | blk_queue_max_hw_segments(mq->queue, bouncesz / 512); | 154 | blk_queue_max_hw_segments(mq->queue, bouncesz / 512); | 
| 154 | blk_queue_max_segment_size(mq->queue, bouncesz); | 155 | blk_queue_max_segment_size(mq->queue, bouncesz); | 
| 155 | 156 | ||
| 156 | mq->sg = kzalloc(sizeof(struct scatterlist), | 157 | mq->sg = kmalloc(sizeof(struct scatterlist), | 
| 157 | GFP_KERNEL); | 158 | GFP_KERNEL); | 
| 158 | if (!mq->sg) { | 159 | if (!mq->sg) { | 
| 159 | ret = -ENOMEM; | 160 | ret = -ENOMEM; | 
| 160 | goto cleanup_queue; | 161 | goto cleanup_queue; | 
| 161 | } | 162 | } | 
| 163 | sg_init_table(mq->sg, 1); | ||
| 162 | 164 | ||
| 163 | mq->bounce_sg = kzalloc(sizeof(struct scatterlist) * | 165 | mq->bounce_sg = kmalloc(sizeof(struct scatterlist) * | 
| 164 | bouncesz / 512, GFP_KERNEL); | 166 | bouncesz / 512, GFP_KERNEL); | 
| 165 | if (!mq->bounce_sg) { | 167 | if (!mq->bounce_sg) { | 
| 166 | ret = -ENOMEM; | 168 | ret = -ENOMEM; | 
| 167 | goto cleanup_queue; | 169 | goto cleanup_queue; | 
| 168 | } | 170 | } | 
| 171 | sg_init_table(mq->bounce_sg, bouncesz / 512); | ||
| 169 | } | 172 | } | 
| 170 | } | 173 | } | 
| 171 | #endif | 174 | #endif | 
| @@ -302,12 +305,12 @@ static void copy_sg(struct scatterlist *dst, unsigned int dst_len, | |||
| 302 | BUG_ON(dst_len == 0); | 305 | BUG_ON(dst_len == 0); | 
| 303 | 306 | ||
| 304 | if (dst_size == 0) { | 307 | if (dst_size == 0) { | 
| 305 | dst_buf = page_address(dst->page) + dst->offset; | 308 | dst_buf = sg_virt(dst); | 
| 306 | dst_size = dst->length; | 309 | dst_size = dst->length; | 
| 307 | } | 310 | } | 
| 308 | 311 | ||
| 309 | if (src_size == 0) { | 312 | if (src_size == 0) { | 
| 310 | src_buf = page_address(src->page) + src->offset; | 313 | src_buf = sg_virt(dst); | 
| 311 | src_size = src->length; | 314 | src_size = src->length; | 
| 312 | } | 315 | } | 
| 313 | 316 | ||
| @@ -353,9 +356,7 @@ unsigned int mmc_queue_map_sg(struct mmc_queue *mq) | |||
| 353 | return 1; | 356 | return 1; | 
| 354 | } | 357 | } | 
| 355 | 358 | ||
| 356 | mq->sg[0].page = virt_to_page(mq->bounce_buf); | 359 | sg_init_one(mq->sg, mq->bounce_buf, 0); | 
| 357 | mq->sg[0].offset = offset_in_page(mq->bounce_buf); | ||
| 358 | mq->sg[0].length = 0; | ||
| 359 | 360 | ||
| 360 | while (sg_len) { | 361 | while (sg_len) { | 
| 361 | mq->sg[0].length += mq->bounce_sg[sg_len - 1].length; | 362 | mq->sg[0].length += mq->bounce_sg[sg_len - 1].length; | 
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index 7a452c2ad1f9..b1edcefdd4f9 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c  | |||
| @@ -149,7 +149,7 @@ static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data | |||
| 149 | 149 | ||
| 150 | sg = &data->sg[i]; | 150 | sg = &data->sg[i]; | 
| 151 | 151 | ||
| 152 | sgbuffer = kmap_atomic(sg->page, KM_BIO_SRC_IRQ) + sg->offset; | 152 | sgbuffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset; | 
| 153 | amount = min(size, sg->length); | 153 | amount = min(size, sg->length); | 
| 154 | size -= amount; | 154 | size -= amount; | 
| 155 | 155 | ||
| @@ -226,7 +226,7 @@ static void at91_mci_pre_dma_read(struct at91mci_host *host) | |||
| 226 | sg = &data->sg[host->transfer_index++]; | 226 | sg = &data->sg[host->transfer_index++]; | 
| 227 | pr_debug("sg = %p\n", sg); | 227 | pr_debug("sg = %p\n", sg); | 
| 228 | 228 | ||
| 229 | sg->dma_address = dma_map_page(NULL, sg->page, sg->offset, sg->length, DMA_FROM_DEVICE); | 229 | sg->dma_address = dma_map_page(NULL, sg_page(sg), sg->offset, sg->length, DMA_FROM_DEVICE); | 
| 230 | 230 | ||
| 231 | pr_debug("dma address = %08X, length = %d\n", sg->dma_address, sg->length); | 231 | pr_debug("dma address = %08X, length = %d\n", sg->dma_address, sg->length); | 
| 232 | 232 | ||
| @@ -283,7 +283,7 @@ static void at91_mci_post_dma_read(struct at91mci_host *host) | |||
| 283 | int index; | 283 | int index; | 
| 284 | 284 | ||
| 285 | /* Swap the contents of the buffer */ | 285 | /* Swap the contents of the buffer */ | 
| 286 | buffer = kmap_atomic(sg->page, KM_BIO_SRC_IRQ) + sg->offset; | 286 | buffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset; | 
| 287 | pr_debug("buffer = %p, length = %d\n", buffer, sg->length); | 287 | pr_debug("buffer = %p, length = %d\n", buffer, sg->length); | 
| 288 | 288 | ||
| 289 | for (index = 0; index < (sg->length / 4); index++) | 289 | for (index = 0; index < (sg->length / 4); index++) | 
| @@ -292,7 +292,7 @@ static void at91_mci_post_dma_read(struct at91mci_host *host) | |||
| 292 | kunmap_atomic(buffer, KM_BIO_SRC_IRQ); | 292 | kunmap_atomic(buffer, KM_BIO_SRC_IRQ); | 
| 293 | } | 293 | } | 
| 294 | 294 | ||
| 295 | flush_dcache_page(sg->page); | 295 | flush_dcache_page(sg_page(sg)); | 
| 296 | } | 296 | } | 
| 297 | 297 | ||
| 298 | /* Is there another transfer to trigger? */ | 298 | /* Is there another transfer to trigger? */ | 
diff --git a/drivers/mmc/host/au1xmmc.c b/drivers/mmc/host/au1xmmc.c index 92c4d0dfee43..bcbb6d247bf7 100644 --- a/drivers/mmc/host/au1xmmc.c +++ b/drivers/mmc/host/au1xmmc.c  | |||
| @@ -340,7 +340,7 @@ static void au1xmmc_send_pio(struct au1xmmc_host *host) | |||
| 340 | 340 | ||
| 341 | /* This is the pointer to the data buffer */ | 341 | /* This is the pointer to the data buffer */ | 
| 342 | sg = &data->sg[host->pio.index]; | 342 | sg = &data->sg[host->pio.index]; | 
| 343 | sg_ptr = page_address(sg->page) + sg->offset + host->pio.offset; | 343 | sg_ptr = sg_virt(sg) + host->pio.offset; | 
| 344 | 344 | ||
| 345 | /* This is the space left inside the buffer */ | 345 | /* This is the space left inside the buffer */ | 
| 346 | sg_len = data->sg[host->pio.index].length - host->pio.offset; | 346 | sg_len = data->sg[host->pio.index].length - host->pio.offset; | 
| @@ -400,7 +400,7 @@ static void au1xmmc_receive_pio(struct au1xmmc_host *host) | |||
| 400 | 400 | ||
| 401 | if (host->pio.index < host->dma.len) { | 401 | if (host->pio.index < host->dma.len) { | 
| 402 | sg = &data->sg[host->pio.index]; | 402 | sg = &data->sg[host->pio.index]; | 
| 403 | sg_ptr = page_address(sg->page) + sg->offset + host->pio.offset; | 403 | sg_ptr = sg_virt(sg) + host->pio.offset; | 
| 404 | 404 | ||
| 405 | /* This is the space left inside the buffer */ | 405 | /* This is the space left inside the buffer */ | 
| 406 | sg_len = sg_dma_len(&data->sg[host->pio.index]) - host->pio.offset; | 406 | sg_len = sg_dma_len(&data->sg[host->pio.index]) - host->pio.offset; | 
| @@ -613,14 +613,11 @@ au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) | |||
| 613 | 613 | ||
| 614 | if (host->flags & HOST_F_XMIT){ | 614 | if (host->flags & HOST_F_XMIT){ | 
| 615 | ret = au1xxx_dbdma_put_source_flags(channel, | 615 | ret = au1xxx_dbdma_put_source_flags(channel, | 
| 616 | (void *) (page_address(sg->page) + | 616 | (void *) sg_virt(sg), len, flags); | 
| 617 | sg->offset), | ||
| 618 | len, flags); | ||
| 619 | } | 617 | } | 
| 620 | else { | 618 | else { | 
| 621 | ret = au1xxx_dbdma_put_dest_flags(channel, | 619 | ret = au1xxx_dbdma_put_dest_flags(channel, | 
| 622 | (void *) (page_address(sg->page) + | 620 | (void *) sg_virt(sg), | 
| 623 | sg->offset), | ||
| 624 | len, flags); | 621 | len, flags); | 
| 625 | } | 622 | } | 
| 626 | 623 | ||
diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c index 6ebc41e7592c..fc72e1fadb6a 100644 --- a/drivers/mmc/host/imxmmc.c +++ b/drivers/mmc/host/imxmmc.c  | |||
| @@ -262,7 +262,7 @@ static void imxmci_setup_data(struct imxmci_host *host, struct mmc_data *data) | |||
| 262 | } | 262 | } | 
| 263 | 263 | ||
| 264 | /* Convert back to virtual address */ | 264 | /* Convert back to virtual address */ | 
| 265 | host->data_ptr = (u16*)(page_address(data->sg->page) + data->sg->offset); | 265 | host->data_ptr = (u16*)sg_virt(sg); | 
| 266 | host->data_cnt = 0; | 266 | host->data_cnt = 0; | 
| 267 | 267 | ||
| 268 | clear_bit(IMXMCI_PEND_DMA_DATA_b, &host->pending_events); | 268 | clear_bit(IMXMCI_PEND_DMA_DATA_b, &host->pending_events); | 
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index 7ae18eaed6c5..12c2d807c145 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c  | |||
| @@ -813,7 +813,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, | |||
| 813 | && dir == DMA_FROM_DEVICE) | 813 | && dir == DMA_FROM_DEVICE) | 
| 814 | dir = DMA_BIDIRECTIONAL; | 814 | dir = DMA_BIDIRECTIONAL; | 
| 815 | 815 | ||
| 816 | dma_addr = dma_map_page(dma_dev, sg->page, 0, | 816 | dma_addr = dma_map_page(dma_dev, sg_page(sg), 0, | 
| 817 | PAGE_SIZE, dir); | 817 | PAGE_SIZE, dir); | 
| 818 | if (direction == DMA_TO_DEVICE) | 818 | if (direction == DMA_TO_DEVICE) | 
| 819 | t->tx_dma = dma_addr + sg->offset; | 819 | t->tx_dma = dma_addr + sg->offset; | 
| @@ -822,7 +822,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, | |||
| 822 | } | 822 | } | 
| 823 | 823 | ||
| 824 | /* allow pio too; we don't allow highmem */ | 824 | /* allow pio too; we don't allow highmem */ | 
| 825 | kmap_addr = kmap(sg->page); | 825 | kmap_addr = kmap(sg_page(sg)); | 
| 826 | if (direction == DMA_TO_DEVICE) | 826 | if (direction == DMA_TO_DEVICE) | 
| 827 | t->tx_buf = kmap_addr + sg->offset; | 827 | t->tx_buf = kmap_addr + sg->offset; | 
| 828 | else | 828 | else | 
| @@ -855,8 +855,8 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, | |||
| 855 | 855 | ||
| 856 | /* discard mappings */ | 856 | /* discard mappings */ | 
| 857 | if (direction == DMA_FROM_DEVICE) | 857 | if (direction == DMA_FROM_DEVICE) | 
| 858 | flush_kernel_dcache_page(sg->page); | 858 | flush_kernel_dcache_page(sg_page(sg)); | 
| 859 | kunmap(sg->page); | 859 | kunmap(sg_page(sg)); | 
| 860 | if (dma_dev) | 860 | if (dma_dev) | 
| 861 | dma_unmap_page(dma_dev, dma_addr, PAGE_SIZE, dir); | 861 | dma_unmap_page(dma_dev, dma_addr, PAGE_SIZE, dir); | 
| 862 | 862 | ||
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 60a67dfcda6a..971e18b91f4a 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c  | |||
| @@ -24,10 +24,10 @@ | |||
| 24 | #include <linux/mmc/host.h> | 24 | #include <linux/mmc/host.h> | 
| 25 | #include <linux/mmc/card.h> | 25 | #include <linux/mmc/card.h> | 
| 26 | #include <linux/clk.h> | 26 | #include <linux/clk.h> | 
| 27 | #include <linux/scatterlist.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/io.h> | 29 | #include <asm/io.h> | 
| 29 | #include <asm/irq.h> | 30 | #include <asm/irq.h> | 
| 30 | #include <asm/scatterlist.h> | ||
| 31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> | 
| 32 | 32 | ||
| 33 | #include <asm/arch/board.h> | 33 | #include <asm/arch/board.h> | 
| @@ -383,7 +383,7 @@ mmc_omap_sg_to_buf(struct mmc_omap_host *host) | |||
| 383 | 383 | ||
| 384 | sg = host->data->sg + host->sg_idx; | 384 | sg = host->data->sg + host->sg_idx; | 
| 385 | host->buffer_bytes_left = sg->length; | 385 | host->buffer_bytes_left = sg->length; | 
| 386 | host->buffer = page_address(sg->page) + sg->offset; | 386 | host->buffer = sg_virt(sg); | 
| 387 | if (host->buffer_bytes_left > host->total_bytes_left) | 387 | if (host->buffer_bytes_left > host->total_bytes_left) | 
| 388 | host->buffer_bytes_left = host->total_bytes_left; | 388 | host->buffer_bytes_left = host->total_bytes_left; | 
| 389 | } | 389 | } | 
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index b397121b947d..0db837e44b77 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c  | |||
| @@ -231,7 +231,7 @@ static void sdhci_deactivate_led(struct sdhci_host *host) | |||
| 231 | 231 | ||
| 232 | static inline char* sdhci_sg_to_buffer(struct sdhci_host* host) | 232 | static inline char* sdhci_sg_to_buffer(struct sdhci_host* host) | 
| 233 | { | 233 | { | 
| 234 | return page_address(host->cur_sg->page) + host->cur_sg->offset; | 234 | return sg_virt(host->cur_sg); | 
| 235 | } | 235 | } | 
| 236 | 236 | ||
| 237 | static inline int sdhci_next_sg(struct sdhci_host* host) | 237 | static inline int sdhci_next_sg(struct sdhci_host* host) | 
diff --git a/drivers/mmc/host/tifm_sd.c b/drivers/mmc/host/tifm_sd.c index 9b904795eb77..c11a3d256051 100644 --- a/drivers/mmc/host/tifm_sd.c +++ b/drivers/mmc/host/tifm_sd.c  | |||
| @@ -192,7 +192,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host) | |||
| 192 | } | 192 | } | 
| 193 | off = sg[host->sg_pos].offset + host->block_pos; | 193 | off = sg[host->sg_pos].offset + host->block_pos; | 
| 194 | 194 | ||
| 195 | pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT); | 195 | pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT); | 
| 196 | p_off = offset_in_page(off); | 196 | p_off = offset_in_page(off); | 
| 197 | p_cnt = PAGE_SIZE - p_off; | 197 | p_cnt = PAGE_SIZE - p_off; | 
| 198 | p_cnt = min(p_cnt, cnt); | 198 | p_cnt = min(p_cnt, cnt); | 
| @@ -241,18 +241,18 @@ static void tifm_sd_bounce_block(struct tifm_sd *host, struct mmc_data *r_data) | |||
| 241 | } | 241 | } | 
| 242 | off = sg[host->sg_pos].offset + host->block_pos; | 242 | off = sg[host->sg_pos].offset + host->block_pos; | 
| 243 | 243 | ||
| 244 | pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT); | 244 | pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT); | 
| 245 | p_off = offset_in_page(off); | 245 | p_off = offset_in_page(off); | 
| 246 | p_cnt = PAGE_SIZE - p_off; | 246 | p_cnt = PAGE_SIZE - p_off; | 
| 247 | p_cnt = min(p_cnt, cnt); | 247 | p_cnt = min(p_cnt, cnt); | 
| 248 | p_cnt = min(p_cnt, t_size); | 248 | p_cnt = min(p_cnt, t_size); | 
| 249 | 249 | ||
| 250 | if (r_data->flags & MMC_DATA_WRITE) | 250 | if (r_data->flags & MMC_DATA_WRITE) | 
| 251 | tifm_sd_copy_page(host->bounce_buf.page, | 251 | tifm_sd_copy_page(sg_page(&host->bounce_buf), | 
| 252 | r_data->blksz - t_size, | 252 | r_data->blksz - t_size, | 
| 253 | pg, p_off, p_cnt); | 253 | pg, p_off, p_cnt); | 
| 254 | else if (r_data->flags & MMC_DATA_READ) | 254 | else if (r_data->flags & MMC_DATA_READ) | 
| 255 | tifm_sd_copy_page(pg, p_off, host->bounce_buf.page, | 255 | tifm_sd_copy_page(pg, p_off, sg_page(&host->bounce_buf), | 
| 256 | r_data->blksz - t_size, p_cnt); | 256 | r_data->blksz - t_size, p_cnt); | 
| 257 | 257 | ||
| 258 | t_size -= p_cnt; | 258 | t_size -= p_cnt; | 
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c index 80db11c05f2a..fa4c8c53cc7a 100644 --- a/drivers/mmc/host/wbsd.c +++ b/drivers/mmc/host/wbsd.c  | |||
| @@ -269,7 +269,7 @@ static inline int wbsd_next_sg(struct wbsd_host *host) | |||
| 269 | 269 | ||
| 270 | static inline char *wbsd_sg_to_buffer(struct wbsd_host *host) | 270 | static inline char *wbsd_sg_to_buffer(struct wbsd_host *host) | 
| 271 | { | 271 | { | 
| 272 | return page_address(host->cur_sg->page) + host->cur_sg->offset; | 272 | return sg_virt(host->cur_sg); | 
| 273 | } | 273 | } | 
| 274 | 274 | ||
| 275 | static inline void wbsd_sg_to_dma(struct wbsd_host *host, struct mmc_data *data) | 275 | static inline void wbsd_sg_to_dma(struct wbsd_host *host, struct mmc_data *data) | 
| @@ -283,7 +283,7 @@ static inline void wbsd_sg_to_dma(struct wbsd_host *host, struct mmc_data *data) | |||
| 283 | len = data->sg_len; | 283 | len = data->sg_len; | 
| 284 | 284 | ||
| 285 | for (i = 0; i < len; i++) { | 285 | for (i = 0; i < len; i++) { | 
| 286 | sgbuf = page_address(sg[i].page) + sg[i].offset; | 286 | sgbuf = sg_virt(&sg[i]); | 
| 287 | memcpy(dmabuf, sgbuf, sg[i].length); | 287 | memcpy(dmabuf, sgbuf, sg[i].length); | 
| 288 | dmabuf += sg[i].length; | 288 | dmabuf += sg[i].length; | 
| 289 | } | 289 | } | 
| @@ -300,7 +300,7 @@ static inline void wbsd_dma_to_sg(struct wbsd_host *host, struct mmc_data *data) | |||
| 300 | len = data->sg_len; | 300 | len = data->sg_len; | 
| 301 | 301 | ||
| 302 | for (i = 0; i < len; i++) { | 302 | for (i = 0; i < len; i++) { | 
| 303 | sgbuf = page_address(sg[i].page) + sg[i].offset; | 303 | sgbuf = sg_virt(&sg[i]); | 
| 304 | memcpy(sgbuf, dmabuf, sg[i].length); | 304 | memcpy(sgbuf, dmabuf, sg[i].length); | 
| 305 | dmabuf += sg[i].length; | 305 | dmabuf += sg[i].length; | 
| 306 | } | 306 | } | 
diff --git a/drivers/net/mlx4/icm.c b/drivers/net/mlx4/icm.c index 4b3c109d5eae..887633b207d9 100644 --- a/drivers/net/mlx4/icm.c +++ b/drivers/net/mlx4/icm.c  | |||
| @@ -60,7 +60,7 @@ static void mlx4_free_icm_pages(struct mlx4_dev *dev, struct mlx4_icm_chunk *chu | |||
| 60 | PCI_DMA_BIDIRECTIONAL); | 60 | PCI_DMA_BIDIRECTIONAL); | 
| 61 | 61 | ||
| 62 | for (i = 0; i < chunk->npages; ++i) | 62 | for (i = 0; i < chunk->npages; ++i) | 
| 63 | __free_pages(chunk->mem[i].page, | 63 | __free_pages(sg_page(&chunk->mem[i]), | 
| 64 | get_order(chunk->mem[i].length)); | 64 | get_order(chunk->mem[i].length)); | 
| 65 | } | 65 | } | 
| 66 | 66 | ||
| @@ -70,7 +70,7 @@ static void mlx4_free_icm_coherent(struct mlx4_dev *dev, struct mlx4_icm_chunk * | |||
| 70 | 70 | ||
| 71 | for (i = 0; i < chunk->npages; ++i) | 71 | for (i = 0; i < chunk->npages; ++i) | 
| 72 | dma_free_coherent(&dev->pdev->dev, chunk->mem[i].length, | 72 | dma_free_coherent(&dev->pdev->dev, chunk->mem[i].length, | 
| 73 | lowmem_page_address(chunk->mem[i].page), | 73 | lowmem_page_address(sg_page(&chunk->mem[i])), | 
| 74 | sg_dma_address(&chunk->mem[i])); | 74 | sg_dma_address(&chunk->mem[i])); | 
| 75 | } | 75 | } | 
| 76 | 76 | ||
| @@ -95,10 +95,13 @@ void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent) | |||
| 95 | 95 | ||
| 96 | static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) | 96 | static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask) | 
| 97 | { | 97 | { | 
| 98 | mem->page = alloc_pages(gfp_mask, order); | 98 | struct page *page; | 
| 99 | if (!mem->page) | 99 | |
| 100 | page = alloc_pages(gfp_mask, order); | ||
| 101 | if (!page) | ||
| 100 | return -ENOMEM; | 102 | return -ENOMEM; | 
| 101 | 103 | ||
| 104 | sg_set_page(mem, page); | ||
| 102 | mem->length = PAGE_SIZE << order; | 105 | mem->length = PAGE_SIZE << order; | 
| 103 | mem->offset = 0; | 106 | mem->offset = 0; | 
| 104 | return 0; | 107 | return 0; | 
| @@ -145,6 +148,7 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages, | |||
| 145 | if (!chunk) | 148 | if (!chunk) | 
| 146 | goto fail; | 149 | goto fail; | 
| 147 | 150 | ||
| 151 | sg_init_table(chunk->mem, MLX4_ICM_CHUNK_LEN); | ||
| 148 | chunk->npages = 0; | 152 | chunk->npages = 0; | 
| 149 | chunk->nsg = 0; | 153 | chunk->nsg = 0; | 
| 150 | list_add_tail(&chunk->list, &icm->chunk_list); | 154 | list_add_tail(&chunk->list, &icm->chunk_list); | 
| @@ -334,7 +338,7 @@ void *mlx4_table_find(struct mlx4_icm_table *table, int obj, dma_addr_t *dma_han | |||
| 334 | * been assigned to. | 338 | * been assigned to. | 
| 335 | */ | 339 | */ | 
| 336 | if (chunk->mem[i].length > offset) { | 340 | if (chunk->mem[i].length > offset) { | 
| 337 | page = chunk->mem[i].page; | 341 | page = sg_page(&chunk->mem[i]); | 
| 338 | goto out; | 342 | goto out; | 
| 339 | } | 343 | } | 
| 340 | offset -= chunk->mem[i].length; | 344 | offset -= chunk->mem[i].length; | 
diff --git a/drivers/net/ppp_mppe.c b/drivers/net/ppp_mppe.c index c0b6d19d1457..bcb0885011c8 100644 --- a/drivers/net/ppp_mppe.c +++ b/drivers/net/ppp_mppe.c  | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | #include <linux/mm.h> | 55 | #include <linux/mm.h> | 
| 56 | #include <linux/ppp_defs.h> | 56 | #include <linux/ppp_defs.h> | 
| 57 | #include <linux/ppp-comp.h> | 57 | #include <linux/ppp-comp.h> | 
| 58 | #include <asm/scatterlist.h> | 58 | #include <linux/scatterlist.h> | 
| 59 | 59 | ||
| 60 | #include "ppp_mppe.h" | 60 | #include "ppp_mppe.h" | 
| 61 | 61 | ||
| @@ -68,9 +68,7 @@ MODULE_VERSION("1.0.2"); | |||
| 68 | static unsigned int | 68 | static unsigned int | 
| 69 | setup_sg(struct scatterlist *sg, const void *address, unsigned int length) | 69 | setup_sg(struct scatterlist *sg, const void *address, unsigned int length) | 
| 70 | { | 70 | { | 
| 71 | sg[0].page = virt_to_page(address); | 71 | sg_init_one(sg, address, length); | 
| 72 | sg[0].offset = offset_in_page(address); | ||
| 73 | sg[0].length = length; | ||
| 74 | return length; | 72 | return length; | 
| 75 | } | 73 | } | 
| 76 | 74 | ||
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index fb14014ee16e..afb262b4be15 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c  | |||
| @@ -1840,7 +1840,7 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, | |||
| 1840 | (scsi_bufflen(srb) < TW_MIN_SGL_LENGTH)) { | 1840 | (scsi_bufflen(srb) < TW_MIN_SGL_LENGTH)) { | 
| 1841 | if (srb->sc_data_direction == DMA_TO_DEVICE || srb->sc_data_direction == DMA_BIDIRECTIONAL) { | 1841 | if (srb->sc_data_direction == DMA_TO_DEVICE || srb->sc_data_direction == DMA_BIDIRECTIONAL) { | 
| 1842 | struct scatterlist *sg = scsi_sglist(srb); | 1842 | struct scatterlist *sg = scsi_sglist(srb); | 
| 1843 | char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1843 | char *buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1844 | memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length); | 1844 | memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length); | 
| 1845 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 1845 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 
| 1846 | } | 1846 | } | 
| @@ -1919,7 +1919,7 @@ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re | |||
| 1919 | char *buf; | 1919 | char *buf; | 
| 1920 | unsigned long flags = 0; | 1920 | unsigned long flags = 0; | 
| 1921 | local_irq_save(flags); | 1921 | local_irq_save(flags); | 
| 1922 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1922 | buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1923 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); | 1923 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); | 
| 1924 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 1924 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 
| 1925 | local_irq_restore(flags); | 1925 | local_irq_restore(flags); | 
diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index a64153b96034..59716ebeb10c 100644 --- a/drivers/scsi/3w-xxxx.c +++ b/drivers/scsi/3w-xxxx.c  | |||
| @@ -1469,7 +1469,7 @@ static void tw_transfer_internal(TW_Device_Extension *tw_dev, int request_id, | |||
| 1469 | struct scatterlist *sg = scsi_sglist(cmd); | 1469 | struct scatterlist *sg = scsi_sglist(cmd); | 
| 1470 | 1470 | ||
| 1471 | local_irq_save(flags); | 1471 | local_irq_save(flags); | 
| 1472 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1472 | buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1473 | transfer_len = min(sg->length, len); | 1473 | transfer_len = min(sg->length, len); | 
| 1474 | 1474 | ||
| 1475 | memcpy(buf, data, transfer_len); | 1475 | memcpy(buf, data, transfer_len); | 
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index 988f0bc5eda5..2597209183d0 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c  | |||
| @@ -298,8 +298,7 @@ static __inline__ void initialize_SCp(Scsi_Cmnd * cmd) | |||
| 298 | if (cmd->use_sg) { | 298 | if (cmd->use_sg) { | 
| 299 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 299 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 
| 300 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 300 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 
| 301 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page)+ | 301 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 302 | cmd->SCp.buffer->offset; | ||
| 303 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 302 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 304 | } else { | 303 | } else { | 
| 305 | cmd->SCp.buffer = NULL; | 304 | cmd->SCp.buffer = NULL; | 
| @@ -2143,8 +2142,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) { | |||
| 2143 | ++cmd->SCp.buffer; | 2142 | ++cmd->SCp.buffer; | 
| 2144 | --cmd->SCp.buffers_residual; | 2143 | --cmd->SCp.buffers_residual; | 
| 2145 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 2144 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 2146 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page)+ | 2145 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 2147 | cmd->SCp.buffer->offset; | ||
| 2148 | dprintk(NDEBUG_INFORMATION, ("scsi%d : %d bytes and %d buffers left\n", instance->host_no, cmd->SCp.this_residual, cmd->SCp.buffers_residual)); | 2146 | dprintk(NDEBUG_INFORMATION, ("scsi%d : %d bytes and %d buffers left\n", instance->host_no, cmd->SCp.this_residual, cmd->SCp.buffers_residual)); | 
| 2149 | } | 2147 | } | 
| 2150 | /* | 2148 | /* | 
diff --git a/drivers/scsi/NCR53C9x.c b/drivers/scsi/NCR53C9x.c index 96e8e29aa05d..5b0efc903918 100644 --- a/drivers/scsi/NCR53C9x.c +++ b/drivers/scsi/NCR53C9x.c  | |||
| @@ -927,7 +927,7 @@ static void esp_get_dmabufs(struct NCR_ESP *esp, Scsi_Cmnd *sp) | |||
| 927 | esp->dma_mmu_get_scsi_sgl(esp, sp); | 927 | esp->dma_mmu_get_scsi_sgl(esp, sp); | 
| 928 | else | 928 | else | 
| 929 | sp->SCp.ptr = | 929 | sp->SCp.ptr = | 
| 930 | (char *) virt_to_phys((page_address(sp->SCp.buffer->page) + sp->SCp.buffer->offset)); | 930 | (char *) virt_to_phys(sg_virt(sp->SCp.buffer)); | 
| 931 | } | 931 | } | 
| 932 | } | 932 | } | 
| 933 | 933 | ||
| @@ -1748,7 +1748,7 @@ static inline void advance_sg(struct NCR_ESP *esp, Scsi_Cmnd *sp) | |||
| 1748 | if (esp->dma_advance_sg) | 1748 | if (esp->dma_advance_sg) | 
| 1749 | esp->dma_advance_sg (sp); | 1749 | esp->dma_advance_sg (sp); | 
| 1750 | else | 1750 | else | 
| 1751 | sp->SCp.ptr = (char *) virt_to_phys((page_address(sp->SCp.buffer->page) + sp->SCp.buffer->offset)); | 1751 | sp->SCp.ptr = (char *) virt_to_phys(sg_virt(sp->SCp.buffer)); | 
| 1752 | 1752 | ||
| 1753 | } | 1753 | } | 
| 1754 | 1754 | ||
diff --git a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c index 3168a1794849..137d065db3da 100644 --- a/drivers/scsi/NCR53c406a.c +++ b/drivers/scsi/NCR53c406a.c  | |||
| @@ -875,8 +875,7 @@ static void NCR53c406a_intr(void *dev_id) | |||
| 875 | outb(TRANSFER_INFO | DMA_OP, CMD_REG); | 875 | outb(TRANSFER_INFO | DMA_OP, CMD_REG); | 
| 876 | #if USE_PIO | 876 | #if USE_PIO | 
| 877 | scsi_for_each_sg(current_SC, sg, scsi_sg_count(current_SC), i) { | 877 | scsi_for_each_sg(current_SC, sg, scsi_sg_count(current_SC), i) { | 
| 878 | NCR53c406a_pio_write(page_address(sg->page) + sg->offset, | 878 | NCR53c406a_pio_write(sg_virt(sg), sg->length); | 
| 879 | sg->length); | ||
| 880 | } | 879 | } | 
| 881 | REG0; | 880 | REG0; | 
| 882 | #endif /* USE_PIO */ | 881 | #endif /* USE_PIO */ | 
| @@ -897,8 +896,7 @@ static void NCR53c406a_intr(void *dev_id) | |||
| 897 | outb(TRANSFER_INFO | DMA_OP, CMD_REG); | 896 | outb(TRANSFER_INFO | DMA_OP, CMD_REG); | 
| 898 | #if USE_PIO | 897 | #if USE_PIO | 
| 899 | scsi_for_each_sg(current_SC, sg, scsi_sg_count(current_SC), i) { | 898 | scsi_for_each_sg(current_SC, sg, scsi_sg_count(current_SC), i) { | 
| 900 | NCR53c406a_pio_read(page_address(sg->page) + sg->offset, | 899 | NCR53c406a_pio_read(sg_virt(sg), sg->length); | 
| 901 | sg->length); | ||
| 902 | } | 900 | } | 
| 903 | REG0; | 901 | REG0; | 
| 904 | #endif /* USE_PIO */ | 902 | #endif /* USE_PIO */ | 
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 80e448d0f3db..a77ab8d693d4 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c  | |||
| @@ -356,7 +356,7 @@ static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigne | |||
| 356 | int transfer_len; | 356 | int transfer_len; | 
| 357 | struct scatterlist *sg = scsi_sglist(scsicmd); | 357 | struct scatterlist *sg = scsi_sglist(scsicmd); | 
| 358 | 358 | ||
| 359 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 359 | buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 360 | transfer_len = min(sg->length, len + offset); | 360 | transfer_len = min(sg->length, len + offset); | 
| 361 | 361 | ||
| 362 | transfer_len -= offset; | 362 | transfer_len -= offset; | 
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index a58c265dc8af..ea8c69947644 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c  | |||
| @@ -613,7 +613,7 @@ struct aha152x_scdata { | |||
| 613 | #define SCNEXT(SCpnt) SCDATA(SCpnt)->next | 613 | #define SCNEXT(SCpnt) SCDATA(SCpnt)->next | 
| 614 | #define SCSEM(SCpnt) SCDATA(SCpnt)->done | 614 | #define SCSEM(SCpnt) SCDATA(SCpnt)->done | 
| 615 | 615 | ||
| 616 | #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset)) | 616 | #define SG_ADDRESS(buffer) ((char *) sg_virt((buffer))) | 
| 617 | 617 | ||
| 618 | /* state handling */ | 618 | /* state handling */ | 
| 619 | static void seldi_run(struct Scsi_Host *shpnt); | 619 | static void seldi_run(struct Scsi_Host *shpnt); | 
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index 961a1882cb7e..bbcc2c52d79f 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c  | |||
| @@ -49,7 +49,7 @@ | |||
| 49 | #include "aha1542.h" | 49 | #include "aha1542.h" | 
| 50 | 50 | ||
| 51 | #define SCSI_BUF_PA(address) isa_virt_to_bus(address) | 51 | #define SCSI_BUF_PA(address) isa_virt_to_bus(address) | 
| 52 | #define SCSI_SG_PA(sgent) (isa_page_to_bus((sgent)->page) + (sgent)->offset) | 52 | #define SCSI_SG_PA(sgent) (isa_page_to_bus(sg_page((sgent))) + (sgent)->offset) | 
| 53 | 53 | ||
| 54 | static void BAD_DMA(void *address, unsigned int length) | 54 | static void BAD_DMA(void *address, unsigned int length) | 
| 55 | { | 55 | { | 
| @@ -66,8 +66,7 @@ static void BAD_SG_DMA(Scsi_Cmnd * SCpnt, | |||
| 66 | int badseg) | 66 | int badseg) | 
| 67 | { | 67 | { | 
| 68 | printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%llx length %u\n", | 68 | printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%llx length %u\n", | 
| 69 | badseg, nseg, | 69 | badseg, nseg, sg_virt(sgp), | 
| 70 | page_address(sgp->page) + sgp->offset, | ||
| 71 | (unsigned long long)SCSI_SG_PA(sgp), | 70 | (unsigned long long)SCSI_SG_PA(sgp), | 
| 72 | sgp->length); | 71 | sgp->length); | 
| 73 | 72 | ||
| @@ -712,8 +711,7 @@ static int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) | |||
| 712 | printk(KERN_CRIT "Bad segment list supplied to aha1542.c (%d, %d)\n", SCpnt->use_sg, i); | 711 | printk(KERN_CRIT "Bad segment list supplied to aha1542.c (%d, %d)\n", SCpnt->use_sg, i); | 
| 713 | scsi_for_each_sg(SCpnt, sg, SCpnt->use_sg, i) { | 712 | scsi_for_each_sg(SCpnt, sg, SCpnt->use_sg, i) { | 
| 714 | printk(KERN_CRIT "%d: %p %d\n", i, | 713 | printk(KERN_CRIT "%d: %p %d\n", i, | 
| 715 | (page_address(sg->page) + | 714 | sg_virt(sg), sg->length); | 
| 716 | sg->offset), sg->length); | ||
| 717 | }; | 715 | }; | 
| 718 | printk(KERN_CRIT "cptr %x: ", (unsigned int) cptr); | 716 | printk(KERN_CRIT "cptr %x: ", (unsigned int) cptr); | 
| 719 | ptr = (unsigned char *) &cptr[i]; | 717 | ptr = (unsigned char *) &cptr[i]; | 
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index f81777586b8f..f7a252885a5c 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c  | |||
| @@ -1343,7 +1343,7 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \ | |||
| 1343 | /* 4 bytes: Areca io control code */ | 1343 | /* 4 bytes: Areca io control code */ | 
| 1344 | 1344 | ||
| 1345 | sg = scsi_sglist(cmd); | 1345 | sg = scsi_sglist(cmd); | 
| 1346 | buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1346 | buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1347 | if (scsi_sg_count(cmd) > 1) { | 1347 | if (scsi_sg_count(cmd) > 1) { | 
| 1348 | retvalue = ARCMSR_MESSAGE_FAIL; | 1348 | retvalue = ARCMSR_MESSAGE_FAIL; | 
| 1349 | goto message_out; | 1349 | goto message_out; | 
| @@ -1593,7 +1593,7 @@ static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb, | |||
| 1593 | strncpy(&inqdata[32], "R001", 4); /* Product Revision */ | 1593 | strncpy(&inqdata[32], "R001", 4); /* Product Revision */ | 
| 1594 | 1594 | ||
| 1595 | sg = scsi_sglist(cmd); | 1595 | sg = scsi_sglist(cmd); | 
| 1596 | buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1596 | buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1597 | 1597 | ||
| 1598 | memcpy(buffer, inqdata, sizeof(inqdata)); | 1598 | memcpy(buffer, inqdata, sizeof(inqdata)); | 
| 1599 | sg = scsi_sglist(cmd); | 1599 | sg = scsi_sglist(cmd); | 
diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 52d0b87e9aa4..d1780980fb20 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c  | |||
| @@ -515,8 +515,7 @@ static inline void initialize_SCp(Scsi_Cmnd *cmd) | |||
| 515 | if (cmd->use_sg) { | 515 | if (cmd->use_sg) { | 
| 516 | cmd->SCp.buffer = (struct scatterlist *)cmd->request_buffer; | 516 | cmd->SCp.buffer = (struct scatterlist *)cmd->request_buffer; | 
| 517 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 517 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 
| 518 | cmd->SCp.ptr = (char *)page_address(cmd->SCp.buffer->page) + | 518 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 519 | cmd->SCp.buffer->offset; | ||
| 520 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 519 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 521 | /* ++roman: Try to merge some scatter-buffers if they are at | 520 | /* ++roman: Try to merge some scatter-buffers if they are at | 
| 522 | * contiguous physical addresses. | 521 | * contiguous physical addresses. | 
| @@ -2054,8 +2053,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) | |||
| 2054 | ++cmd->SCp.buffer; | 2053 | ++cmd->SCp.buffer; | 
| 2055 | --cmd->SCp.buffers_residual; | 2054 | --cmd->SCp.buffers_residual; | 
| 2056 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 2055 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 2057 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + | 2056 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 2058 | cmd->SCp.buffer->offset; | ||
| 2059 | /* ++roman: Try to merge some scatter-buffers if | 2057 | /* ++roman: Try to merge some scatter-buffers if | 
| 2060 | * they are at contiguous physical addresses. | 2058 | * they are at contiguous physical addresses. | 
| 2061 | */ | 2059 | */ | 
diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c index 96180bb47e41..982c5092be11 100644 --- a/drivers/scsi/eata_pio.c +++ b/drivers/scsi/eata_pio.c  | |||
| @@ -172,7 +172,7 @@ static void IncStat(struct scsi_pointer *SCp, unsigned int Increment) | |||
| 172 | SCp->Status = 0; | 172 | SCp->Status = 0; | 
| 173 | else { | 173 | else { | 
| 174 | SCp->buffer++; | 174 | SCp->buffer++; | 
| 175 | SCp->ptr = page_address(SCp->buffer->page) + SCp->buffer->offset; | 175 | SCp->ptr = sg_virt(SCp->buffer); | 
| 176 | SCp->this_residual = SCp->buffer->length; | 176 | SCp->this_residual = SCp->buffer->length; | 
| 177 | } | 177 | } | 
| 178 | } | 178 | } | 
| @@ -410,7 +410,7 @@ static int eata_pio_queue(struct scsi_cmnd *cmd, | |||
| 410 | } else { | 410 | } else { | 
| 411 | cmd->SCp.buffer = cmd->request_buffer; | 411 | cmd->SCp.buffer = cmd->request_buffer; | 
| 412 | cmd->SCp.buffers_residual = cmd->use_sg; | 412 | cmd->SCp.buffers_residual = cmd->use_sg; | 
| 413 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; | 413 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 414 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 414 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 415 | } | 415 | } | 
| 416 | cmd->SCp.Status = (cmd->SCp.this_residual != 0); /* TRUE as long as bytes | 416 | cmd->SCp.Status = (cmd->SCp.this_residual != 0); /* TRUE as long as bytes | 
diff --git a/drivers/scsi/fd_mcs.c b/drivers/scsi/fd_mcs.c index 668569e8856b..8335b608e571 100644 --- a/drivers/scsi/fd_mcs.c +++ b/drivers/scsi/fd_mcs.c  | |||
| @@ -973,7 +973,7 @@ static irqreturn_t fd_mcs_intr(int irq, void *dev_id) | |||
| 973 | if (current_SC->SCp.buffers_residual) { | 973 | if (current_SC->SCp.buffers_residual) { | 
| 974 | --current_SC->SCp.buffers_residual; | 974 | --current_SC->SCp.buffers_residual; | 
| 975 | ++current_SC->SCp.buffer; | 975 | ++current_SC->SCp.buffer; | 
| 976 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; | 976 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 977 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 977 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 978 | } else | 978 | } else | 
| 979 | break; | 979 | break; | 
| @@ -1006,7 +1006,7 @@ static irqreturn_t fd_mcs_intr(int irq, void *dev_id) | |||
| 1006 | if (!current_SC->SCp.this_residual && current_SC->SCp.buffers_residual) { | 1006 | if (!current_SC->SCp.this_residual && current_SC->SCp.buffers_residual) { | 
| 1007 | --current_SC->SCp.buffers_residual; | 1007 | --current_SC->SCp.buffers_residual; | 
| 1008 | ++current_SC->SCp.buffer; | 1008 | ++current_SC->SCp.buffer; | 
| 1009 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; | 1009 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 1010 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 1010 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 1011 | } | 1011 | } | 
| 1012 | } | 1012 | } | 
| @@ -1109,7 +1109,7 @@ static int fd_mcs_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) | |||
| 1109 | 1109 | ||
| 1110 | if (current_SC->use_sg) { | 1110 | if (current_SC->use_sg) { | 
| 1111 | current_SC->SCp.buffer = (struct scatterlist *) current_SC->request_buffer; | 1111 | current_SC->SCp.buffer = (struct scatterlist *) current_SC->request_buffer; | 
| 1112 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; | 1112 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 1113 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 1113 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 1114 | current_SC->SCp.buffers_residual = current_SC->use_sg - 1; | 1114 | current_SC->SCp.buffers_residual = current_SC->use_sg - 1; | 
| 1115 | } else { | 1115 | } else { | 
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 5d282e6a6ae1..2cd6b4959eb2 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c  | |||
| @@ -1321,7 +1321,7 @@ static irqreturn_t do_fdomain_16x0_intr(int irq, void *dev_id) | |||
| 1321 | if (current_SC->SCp.buffers_residual) { | 1321 | if (current_SC->SCp.buffers_residual) { | 
| 1322 | --current_SC->SCp.buffers_residual; | 1322 | --current_SC->SCp.buffers_residual; | 
| 1323 | ++current_SC->SCp.buffer; | 1323 | ++current_SC->SCp.buffer; | 
| 1324 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; | 1324 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 1325 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 1325 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 1326 | } else | 1326 | } else | 
| 1327 | break; | 1327 | break; | 
| @@ -1354,7 +1354,7 @@ static irqreturn_t do_fdomain_16x0_intr(int irq, void *dev_id) | |||
| 1354 | && current_SC->SCp.buffers_residual) { | 1354 | && current_SC->SCp.buffers_residual) { | 
| 1355 | --current_SC->SCp.buffers_residual; | 1355 | --current_SC->SCp.buffers_residual; | 
| 1356 | ++current_SC->SCp.buffer; | 1356 | ++current_SC->SCp.buffer; | 
| 1357 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; | 1357 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 1358 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 1358 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 1359 | } | 1359 | } | 
| 1360 | } | 1360 | } | 
| @@ -1439,8 +1439,7 @@ static int fdomain_16x0_queue(struct scsi_cmnd *SCpnt, | |||
| 1439 | 1439 | ||
| 1440 | if (scsi_sg_count(current_SC)) { | 1440 | if (scsi_sg_count(current_SC)) { | 
| 1441 | current_SC->SCp.buffer = scsi_sglist(current_SC); | 1441 | current_SC->SCp.buffer = scsi_sglist(current_SC); | 
| 1442 | current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) | 1442 | current_SC->SCp.ptr = sg_virt(current_SC->SCp.buffer); | 
| 1443 | + current_SC->SCp.buffer->offset; | ||
| 1444 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 1443 | current_SC->SCp.this_residual = current_SC->SCp.buffer->length; | 
| 1445 | current_SC->SCp.buffers_residual = scsi_sg_count(current_SC) - 1; | 1444 | current_SC->SCp.buffers_residual = scsi_sg_count(current_SC) - 1; | 
| 1446 | } else { | 1445 | } else { | 
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 3ac080ee6e2f..5ab3ce762485 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c  | |||
| @@ -2374,18 +2374,18 @@ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, | |||
| 2374 | if (cpsum+cpnow > cpcount) | 2374 | if (cpsum+cpnow > cpcount) | 
| 2375 | cpnow = cpcount - cpsum; | 2375 | cpnow = cpcount - cpsum; | 
| 2376 | cpsum += cpnow; | 2376 | cpsum += cpnow; | 
| 2377 | if (!sl->page) { | 2377 | if (!sg_page(sl)) { | 
| 2378 | printk("GDT-HA %d: invalid sc/gt element in gdth_copy_internal_data()\n", | 2378 | printk("GDT-HA %d: invalid sc/gt element in gdth_copy_internal_data()\n", | 
| 2379 | ha->hanum); | 2379 | ha->hanum); | 
| 2380 | return; | 2380 | return; | 
| 2381 | } | 2381 | } | 
| 2382 | local_irq_save(flags); | 2382 | local_irq_save(flags); | 
| 2383 | address = kmap_atomic(sl->page, KM_BIO_SRC_IRQ) + sl->offset; | 2383 | address = kmap_atomic(sg_page(sl), KM_BIO_SRC_IRQ) + sl->offset; | 
| 2384 | if (to_buffer) | 2384 | if (to_buffer) | 
| 2385 | memcpy(buffer, address, cpnow); | 2385 | memcpy(buffer, address, cpnow); | 
| 2386 | else | 2386 | else | 
| 2387 | memcpy(address, buffer, cpnow); | 2387 | memcpy(address, buffer, cpnow); | 
| 2388 | flush_dcache_page(sl->page); | 2388 | flush_dcache_page(sg_page(sl)); | 
| 2389 | kunmap_atomic(address, KM_BIO_SRC_IRQ); | 2389 | kunmap_atomic(address, KM_BIO_SRC_IRQ); | 
| 2390 | local_irq_restore(flags); | 2390 | local_irq_restore(flags); | 
| 2391 | if (cpsum == cpcount) | 2391 | if (cpsum == cpcount) | 
diff --git a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c index 714e6273a70d..db004a450732 100644 --- a/drivers/scsi/ibmmca.c +++ b/drivers/scsi/ibmmca.c  | |||
| @@ -1828,7 +1828,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
| 1828 | BUG_ON(scsi_sg_count(cmd) > 16); | 1828 | BUG_ON(scsi_sg_count(cmd) > 16); | 
| 1829 | 1829 | ||
| 1830 | scsi_for_each_sg(cmd, sg, scsi_sg_count(cmd), i) { | 1830 | scsi_for_each_sg(cmd, sg, scsi_sg_count(cmd), i) { | 
| 1831 | ld(shpnt)[ldn].sge[i].address = (void *) (isa_page_to_bus(sg->page) + sg->offset); | 1831 | ld(shpnt)[ldn].sge[i].address = (void *) (isa_page_to_bus(sg_page(sg)) + sg->offset); | 
| 1832 | ld(shpnt)[ldn].sge[i].byte_length = sg->length; | 1832 | ld(shpnt)[ldn].sge[i].byte_length = sg->length; | 
| 1833 | } | 1833 | } | 
| 1834 | scb->enable |= IM_POINTER_TO_LIST; | 1834 | scb->enable |= IM_POINTER_TO_LIST; | 
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 252d1806467f..8d0244c2e7d4 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c  | |||
| @@ -175,18 +175,18 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne | |||
| 175 | 175 | ||
| 176 | while (bcount) { | 176 | while (bcount) { | 
| 177 | count = min(pc->sg->length - pc->b_count, bcount); | 177 | count = min(pc->sg->length - pc->b_count, bcount); | 
| 178 | if (PageHighMem(pc->sg->page)) { | 178 | if (PageHighMem(sg_page(pc->sg))) { | 
| 179 | unsigned long flags; | 179 | unsigned long flags; | 
| 180 | 180 | ||
| 181 | local_irq_save(flags); | 181 | local_irq_save(flags); | 
| 182 | buf = kmap_atomic(pc->sg->page, KM_IRQ0) + | 182 | buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) + | 
| 183 | pc->sg->offset; | 183 | pc->sg->offset; | 
| 184 | drive->hwif->atapi_input_bytes(drive, | 184 | drive->hwif->atapi_input_bytes(drive, | 
| 185 | buf + pc->b_count, count); | 185 | buf + pc->b_count, count); | 
| 186 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | 186 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | 
| 187 | local_irq_restore(flags); | 187 | local_irq_restore(flags); | 
| 188 | } else { | 188 | } else { | 
| 189 | buf = page_address(pc->sg->page) + pc->sg->offset; | 189 | buf = sg_virt(pc->sg); | 
| 190 | drive->hwif->atapi_input_bytes(drive, | 190 | drive->hwif->atapi_input_bytes(drive, | 
| 191 | buf + pc->b_count, count); | 191 | buf + pc->b_count, count); | 
| 192 | } | 192 | } | 
| @@ -212,18 +212,18 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign | |||
| 212 | 212 | ||
| 213 | while (bcount) { | 213 | while (bcount) { | 
| 214 | count = min(pc->sg->length - pc->b_count, bcount); | 214 | count = min(pc->sg->length - pc->b_count, bcount); | 
| 215 | if (PageHighMem(pc->sg->page)) { | 215 | if (PageHighMem(sg_page(pc->sg))) { | 
| 216 | unsigned long flags; | 216 | unsigned long flags; | 
| 217 | 217 | ||
| 218 | local_irq_save(flags); | 218 | local_irq_save(flags); | 
| 219 | buf = kmap_atomic(pc->sg->page, KM_IRQ0) + | 219 | buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) + | 
| 220 | pc->sg->offset; | 220 | pc->sg->offset; | 
| 221 | drive->hwif->atapi_output_bytes(drive, | 221 | drive->hwif->atapi_output_bytes(drive, | 
| 222 | buf + pc->b_count, count); | 222 | buf + pc->b_count, count); | 
| 223 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | 223 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | 
| 224 | local_irq_restore(flags); | 224 | local_irq_restore(flags); | 
| 225 | } else { | 225 | } else { | 
| 226 | buf = page_address(pc->sg->page) + pc->sg->offset; | 226 | buf = sg_virt(pc->sg); | 
| 227 | drive->hwif->atapi_output_bytes(drive, | 227 | drive->hwif->atapi_output_bytes(drive, | 
| 228 | buf + pc->b_count, count); | 228 | buf + pc->b_count, count); | 
| 229 | } | 229 | } | 
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index 74cdc1f0a78f..a3d0c6b14958 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c  | |||
| @@ -705,9 +705,7 @@ static int imm_completion(struct scsi_cmnd *cmd) | |||
| 705 | cmd->SCp.buffer++; | 705 | cmd->SCp.buffer++; | 
| 706 | cmd->SCp.this_residual = | 706 | cmd->SCp.this_residual = | 
| 707 | cmd->SCp.buffer->length; | 707 | cmd->SCp.buffer->length; | 
| 708 | cmd->SCp.ptr = | 708 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 709 | page_address(cmd->SCp.buffer->page) + | ||
| 710 | cmd->SCp.buffer->offset; | ||
| 711 | 709 | ||
| 712 | /* | 710 | /* | 
| 713 | * Make sure that we transfer even number of bytes | 711 | * Make sure that we transfer even number of bytes | 
| @@ -844,9 +842,7 @@ static int imm_engine(imm_struct *dev, struct scsi_cmnd *cmd) | |||
| 844 | cmd->SCp.buffer = | 842 | cmd->SCp.buffer = | 
| 845 | (struct scatterlist *) cmd->request_buffer; | 843 | (struct scatterlist *) cmd->request_buffer; | 
| 846 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 844 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 847 | cmd->SCp.ptr = | 845 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 848 | page_address(cmd->SCp.buffer->page) + | ||
| 849 | cmd->SCp.buffer->offset; | ||
| 850 | } else { | 846 | } else { | 
| 851 | /* else fill the only available buffer */ | 847 | /* else fill the only available buffer */ | 
| 852 | cmd->SCp.buffer = NULL; | 848 | cmd->SCp.buffer = NULL; | 
diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c index ab7cbf3449ce..c8b452f2878c 100644 --- a/drivers/scsi/in2000.c +++ b/drivers/scsi/in2000.c  | |||
| @@ -372,7 +372,7 @@ static int in2000_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
| 372 | if (cmd->use_sg) { | 372 | if (cmd->use_sg) { | 
| 373 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 373 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 
| 374 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 374 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 
| 375 | cmd->SCp.ptr = (char *) page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; | 375 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 376 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 376 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 377 | } else { | 377 | } else { | 
| 378 | cmd->SCp.buffer = NULL; | 378 | cmd->SCp.buffer = NULL; | 
| @@ -764,7 +764,7 @@ static void transfer_bytes(Scsi_Cmnd * cmd, int data_in_dir) | |||
| 764 | ++cmd->SCp.buffer; | 764 | ++cmd->SCp.buffer; | 
| 765 | --cmd->SCp.buffers_residual; | 765 | --cmd->SCp.buffers_residual; | 
| 766 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 766 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 767 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; | 767 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 768 | } | 768 | } | 
| 769 | 769 | ||
| 770 | /* Set up hardware registers */ | 770 | /* Set up hardware registers */ | 
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index c316a0bcae6c..439b97a6a269 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c  | |||
| @@ -2872,6 +2872,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len) | |||
| 2872 | } | 2872 | } | 
| 2873 | 2873 | ||
| 2874 | scatterlist = sglist->scatterlist; | 2874 | scatterlist = sglist->scatterlist; | 
| 2875 | sg_init_table(scatterlist, num_elem); | ||
| 2875 | 2876 | ||
| 2876 | sglist->order = order; | 2877 | sglist->order = order; | 
| 2877 | sglist->num_sg = num_elem; | 2878 | sglist->num_sg = num_elem; | 
| @@ -2884,12 +2885,12 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len) | |||
| 2884 | 2885 | ||
| 2885 | /* Free up what we already allocated */ | 2886 | /* Free up what we already allocated */ | 
| 2886 | for (j = i - 1; j >= 0; j--) | 2887 | for (j = i - 1; j >= 0; j--) | 
| 2887 | __free_pages(scatterlist[j].page, order); | 2888 | __free_pages(sg_page(&scatterlist[j]), order); | 
| 2888 | kfree(sglist); | 2889 | kfree(sglist); | 
| 2889 | return NULL; | 2890 | return NULL; | 
| 2890 | } | 2891 | } | 
| 2891 | 2892 | ||
| 2892 | scatterlist[i].page = page; | 2893 | sg_set_page(&scatterlist[i], page); | 
| 2893 | } | 2894 | } | 
| 2894 | 2895 | ||
| 2895 | return sglist; | 2896 | return sglist; | 
| @@ -2910,7 +2911,7 @@ static void ipr_free_ucode_buffer(struct ipr_sglist *sglist) | |||
| 2910 | int i; | 2911 | int i; | 
| 2911 | 2912 | ||
| 2912 | for (i = 0; i < sglist->num_sg; i++) | 2913 | for (i = 0; i < sglist->num_sg; i++) | 
| 2913 | __free_pages(sglist->scatterlist[i].page, sglist->order); | 2914 | __free_pages(sg_page(&sglist->scatterlist[i]), sglist->order); | 
| 2914 | 2915 | ||
| 2915 | kfree(sglist); | 2916 | kfree(sglist); | 
| 2916 | } | 2917 | } | 
| @@ -2940,9 +2941,11 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist, | |||
| 2940 | scatterlist = sglist->scatterlist; | 2941 | scatterlist = sglist->scatterlist; | 
| 2941 | 2942 | ||
| 2942 | for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) { | 2943 | for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) { | 
| 2943 | kaddr = kmap(scatterlist[i].page); | 2944 | struct page *page = sg_page(&scatterlist[i]); | 
| 2945 | |||
| 2946 | kaddr = kmap(page); | ||
| 2944 | memcpy(kaddr, buffer, bsize_elem); | 2947 | memcpy(kaddr, buffer, bsize_elem); | 
| 2945 | kunmap(scatterlist[i].page); | 2948 | kunmap(page); | 
| 2946 | 2949 | ||
| 2947 | scatterlist[i].length = bsize_elem; | 2950 | scatterlist[i].length = bsize_elem; | 
| 2948 | 2951 | ||
| @@ -2953,9 +2956,11 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist, | |||
| 2953 | } | 2956 | } | 
| 2954 | 2957 | ||
| 2955 | if (len % bsize_elem) { | 2958 | if (len % bsize_elem) { | 
| 2956 | kaddr = kmap(scatterlist[i].page); | 2959 | struct page *page = sg_page(&scatterlist[i]); | 
| 2960 | |||
| 2961 | kaddr = kmap(page); | ||
| 2957 | memcpy(kaddr, buffer, len % bsize_elem); | 2962 | memcpy(kaddr, buffer, len % bsize_elem); | 
| 2958 | kunmap(scatterlist[i].page); | 2963 | kunmap(page); | 
| 2959 | 2964 | ||
| 2960 | scatterlist[i].length = len % bsize_elem; | 2965 | scatterlist[i].length = len % bsize_elem; | 
| 2961 | } | 2966 | } | 
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index edaac2714c5a..5c5a9b2628fc 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c  | |||
| @@ -1515,7 +1515,7 @@ static int ips_is_passthru(struct scsi_cmnd *SC) | |||
| 1515 | /* kmap_atomic() ensures addressability of the user buffer.*/ | 1515 | /* kmap_atomic() ensures addressability of the user buffer.*/ | 
| 1516 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 1516 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 
| 1517 | local_irq_save(flags); | 1517 | local_irq_save(flags); | 
| 1518 | buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1518 | buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 1519 | if (buffer && buffer[0] == 'C' && buffer[1] == 'O' && | 1519 | if (buffer && buffer[0] == 'C' && buffer[1] == 'O' && | 
| 1520 | buffer[2] == 'P' && buffer[3] == 'P') { | 1520 | buffer[2] == 'P' && buffer[3] == 'P') { | 
| 1521 | kunmap_atomic(buffer - sg->offset, KM_IRQ0); | 1521 | kunmap_atomic(buffer - sg->offset, KM_IRQ0); | 
| @@ -3523,7 +3523,7 @@ ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count) | |||
| 3523 | /* kmap_atomic() ensures addressability of the data buffer.*/ | 3523 | /* kmap_atomic() ensures addressability of the data buffer.*/ | 
| 3524 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 3524 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 
| 3525 | local_irq_save(flags); | 3525 | local_irq_save(flags); | 
| 3526 | buffer = kmap_atomic(sg[i].page, KM_IRQ0) + sg[i].offset; | 3526 | buffer = kmap_atomic(sg_page(&sg[i]), KM_IRQ0) + sg[i].offset; | 
| 3527 | memcpy(buffer, &cdata[xfer_cnt], min_cnt); | 3527 | memcpy(buffer, &cdata[xfer_cnt], min_cnt); | 
| 3528 | kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); | 3528 | kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); | 
| 3529 | local_irq_restore(flags); | 3529 | local_irq_restore(flags); | 
| @@ -3556,7 +3556,7 @@ ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count) | |||
| 3556 | /* kmap_atomic() ensures addressability of the data buffer.*/ | 3556 | /* kmap_atomic() ensures addressability of the data buffer.*/ | 
| 3557 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 3557 | /* local_irq_save() protects the KM_IRQ0 address slot. */ | 
| 3558 | local_irq_save(flags); | 3558 | local_irq_save(flags); | 
| 3559 | buffer = kmap_atomic(sg[i].page, KM_IRQ0) + sg[i].offset; | 3559 | buffer = kmap_atomic(sg_page(&sg[i]), KM_IRQ0) + sg[i].offset; | 
| 3560 | memcpy(&cdata[xfer_cnt], buffer, min_cnt); | 3560 | memcpy(&cdata[xfer_cnt], buffer, min_cnt); | 
| 3561 | kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); | 3561 | kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); | 
| 3562 | local_irq_restore(flags); | 3562 | local_irq_restore(flags); | 
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index a21455d0274c..6ce4109efdf3 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c  | |||
| @@ -70,9 +70,7 @@ module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO); | |||
| 70 | static inline void | 70 | static inline void | 
| 71 | iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size) | 71 | iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size) | 
| 72 | { | 72 | { | 
| 73 | ibuf->sg.page = virt_to_page(vbuf); | 73 | sg_init_one(&ibuf->sg, vbuf, size); | 
| 74 | ibuf->sg.offset = offset_in_page(vbuf); | ||
| 75 | ibuf->sg.length = size; | ||
| 76 | ibuf->sent = 0; | 74 | ibuf->sent = 0; | 
| 77 | ibuf->use_sendmsg = 1; | 75 | ibuf->use_sendmsg = 1; | 
| 78 | } | 76 | } | 
| @@ -80,13 +78,14 @@ iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size) | |||
| 80 | static inline void | 78 | static inline void | 
| 81 | iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg) | 79 | iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg) | 
| 82 | { | 80 | { | 
| 83 | ibuf->sg.page = sg->page; | 81 | sg_init_table(&ibuf->sg, 1); | 
| 82 | sg_set_page(&ibuf->sg, sg_page(sg)); | ||
| 84 | ibuf->sg.offset = sg->offset; | 83 | ibuf->sg.offset = sg->offset; | 
| 85 | ibuf->sg.length = sg->length; | 84 | ibuf->sg.length = sg->length; | 
| 86 | /* | 85 | /* | 
| 87 | * Fastpath: sg element fits into single page | 86 | * Fastpath: sg element fits into single page | 
| 88 | */ | 87 | */ | 
| 89 | if (sg->length + sg->offset <= PAGE_SIZE && !PageSlab(sg->page)) | 88 | if (sg->length + sg->offset <= PAGE_SIZE && !PageSlab(sg_page(sg))) | 
| 90 | ibuf->use_sendmsg = 0; | 89 | ibuf->use_sendmsg = 0; | 
| 91 | else | 90 | else | 
| 92 | ibuf->use_sendmsg = 1; | 91 | ibuf->use_sendmsg = 1; | 
| @@ -716,7 +715,7 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) | |||
| 716 | for (i = tcp_ctask->sg_count; i < scsi_sg_count(sc); i++) { | 715 | for (i = tcp_ctask->sg_count; i < scsi_sg_count(sc); i++) { | 
| 717 | char *dest; | 716 | char *dest; | 
| 718 | 717 | ||
| 719 | dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0); | 718 | dest = kmap_atomic(sg_page(&sg[i]), KM_SOFTIRQ0); | 
| 720 | rc = iscsi_ctask_copy(tcp_conn, ctask, dest + sg[i].offset, | 719 | rc = iscsi_ctask_copy(tcp_conn, ctask, dest + sg[i].offset, | 
| 721 | sg[i].length, offset); | 720 | sg[i].length, offset); | 
| 722 | kunmap_atomic(dest, KM_SOFTIRQ0); | 721 | kunmap_atomic(dest, KM_SOFTIRQ0); | 
| @@ -1103,9 +1102,9 @@ iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) | |||
| 1103 | * slab case. | 1102 | * slab case. | 
| 1104 | */ | 1103 | */ | 
| 1105 | if (buf->use_sendmsg) | 1104 | if (buf->use_sendmsg) | 
| 1106 | res = sock_no_sendpage(sk, buf->sg.page, offset, size, flags); | 1105 | res = sock_no_sendpage(sk, sg_page(&buf->sg), offset, size, flags); | 
| 1107 | else | 1106 | else | 
| 1108 | res = tcp_conn->sendpage(sk, buf->sg.page, offset, size, flags); | 1107 | res = tcp_conn->sendpage(sk, sg_page(&buf->sg), offset, size, flags); | 
| 1109 | 1108 | ||
| 1110 | if (res >= 0) { | 1109 | if (res >= 0) { | 
| 1111 | conn->txdata_octets += res; | 1110 | conn->txdata_octets += res; | 
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 10d1aff9938a..66c652035730 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c  | |||
| @@ -658,7 +658,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) | |||
| 658 | struct scatterlist *sg; | 658 | struct scatterlist *sg; | 
| 659 | 659 | ||
| 660 | sg = scsi_sglist(cmd); | 660 | sg = scsi_sglist(cmd); | 
| 661 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 661 | buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; | 
| 662 | 662 | ||
| 663 | memset(buf, 0, cmd->cmnd[4]); | 663 | memset(buf, 0, cmd->cmnd[4]); | 
| 664 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 664 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 
| @@ -1542,10 +1542,8 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) | |||
| 1542 | if( cmd->cmnd[0] == INQUIRY && !islogical ) { | 1542 | if( cmd->cmnd[0] == INQUIRY && !islogical ) { | 
| 1543 | 1543 | ||
| 1544 | sgl = scsi_sglist(cmd); | 1544 | sgl = scsi_sglist(cmd); | 
| 1545 | if( sgl->page ) { | 1545 | if( sg_page(sgl) ) { | 
| 1546 | c = *(unsigned char *) | 1546 | c = *(unsigned char *) sg_virt(&sgl[0]); | 
| 1547 | page_address((&sgl[0])->page) + | ||
| 1548 | (&sgl[0])->offset; | ||
| 1549 | } else { | 1547 | } else { | 
| 1550 | printk(KERN_WARNING | 1548 | printk(KERN_WARNING | 
| 1551 | "megaraid: invalid sg.\n"); | 1549 | "megaraid: invalid sg.\n"); | 
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index 78779209ac89..c8923108183a 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c  | |||
| @@ -1584,10 +1584,8 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy) | |||
| 1584 | caddr_t vaddr; | 1584 | caddr_t vaddr; | 
| 1585 | 1585 | ||
| 1586 | sgl = scsi_sglist(scp); | 1586 | sgl = scsi_sglist(scp); | 
| 1587 | if (sgl->page) { | 1587 | if (sg_page(sgl)) { | 
| 1588 | vaddr = (caddr_t) | 1588 | vaddr = (caddr_t) sg_virt(&sgl[0]); | 
| 1589 | (page_address((&sgl[0])->page) | ||
| 1590 | + (&sgl[0])->offset); | ||
| 1591 | 1589 | ||
| 1592 | memset(vaddr, 0, scp->cmnd[4]); | 1590 | memset(vaddr, 0, scp->cmnd[4]); | 
| 1593 | } | 1591 | } | 
| @@ -2328,10 +2326,8 @@ megaraid_mbox_dpc(unsigned long devp) | |||
| 2328 | && IS_RAID_CH(raid_dev, scb->dev_channel)) { | 2326 | && IS_RAID_CH(raid_dev, scb->dev_channel)) { | 
| 2329 | 2327 | ||
| 2330 | sgl = scsi_sglist(scp); | 2328 | sgl = scsi_sglist(scp); | 
| 2331 | if (sgl->page) { | 2329 | if (sg_page(sgl)) { | 
| 2332 | c = *(unsigned char *) | 2330 | c = *(unsigned char *) sg_virt(&sgl[0]); | 
| 2333 | (page_address((&sgl[0])->page) + | ||
| 2334 | (&sgl[0])->offset); | ||
| 2335 | } else { | 2331 | } else { | 
| 2336 | con_log(CL_ANN, (KERN_WARNING | 2332 | con_log(CL_ANN, (KERN_WARNING | 
| 2337 | "megaraid mailbox: invalid sg:%d\n", | 2333 | "megaraid mailbox: invalid sg:%d\n", | 
diff --git a/drivers/scsi/oktagon_esp.c b/drivers/scsi/oktagon_esp.c index 26a6d55faf3e..8e5eadbd5c51 100644 --- a/drivers/scsi/oktagon_esp.c +++ b/drivers/scsi/oktagon_esp.c  | |||
| @@ -550,8 +550,7 @@ void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd *sp) | |||
| 550 | 550 | ||
| 551 | void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd *sp) | 551 | void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd *sp) | 
| 552 | { | 552 | { | 
| 553 | sp->SCp.ptr = page_address(sp->SCp.buffer->page)+ | 553 | sp->SCp.ptr = sg_virt(sp->SCp.buffer); | 
| 554 | sp->SCp.buffer->offset; | ||
| 555 | } | 554 | } | 
| 556 | 555 | ||
| 557 | void dma_mmu_release_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd *sp) | 556 | void dma_mmu_release_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd *sp) | 
| @@ -564,8 +563,7 @@ void dma_mmu_release_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd *sp) | |||
| 564 | 563 | ||
| 565 | void dma_advance_sg(Scsi_Cmnd *sp) | 564 | void dma_advance_sg(Scsi_Cmnd *sp) | 
| 566 | { | 565 | { | 
| 567 | sp->SCp.ptr = page_address(sp->SCp.buffer->page)+ | 566 | sp->SCp.ptr = sg_virt(sp->SCp.buffer); | 
| 568 | sp->SCp.buffer->offset; | ||
| 569 | } | 567 | } | 
| 570 | 568 | ||
| 571 | 569 | ||
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index 331b789937c4..1c5c4b68f20f 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c  | |||
| @@ -542,7 +542,7 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q | |||
| 542 | if (STp->raw) { | 542 | if (STp->raw) { | 
| 543 | if (STp->buffer->syscall_result) { | 543 | if (STp->buffer->syscall_result) { | 
| 544 | for (i=0; i < STp->buffer->sg_segs; i++) | 544 | for (i=0; i < STp->buffer->sg_segs; i++) | 
| 545 | memset(page_address(STp->buffer->sg[i].page), | 545 | memset(page_address(sg_page(&STp->buffer->sg[i])), | 
| 546 | 0, STp->buffer->sg[i].length); | 546 | 0, STp->buffer->sg[i].length); | 
| 547 | strcpy(STp->buffer->b_data, "READ ERROR ON FRAME"); | 547 | strcpy(STp->buffer->b_data, "READ ERROR ON FRAME"); | 
| 548 | } else | 548 | } else | 
| @@ -4437,7 +4437,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) | |||
| 4437 | for (i = 0, b_size = 0; | 4437 | for (i = 0, b_size = 0; | 
| 4438 | (i < STp->buffer->sg_segs) && ((b_size + STp->buffer->sg[i].length) <= OS_DATA_SIZE); | 4438 | (i < STp->buffer->sg_segs) && ((b_size + STp->buffer->sg[i].length) <= OS_DATA_SIZE); | 
| 4439 | b_size += STp->buffer->sg[i++].length); | 4439 | b_size += STp->buffer->sg[i++].length); | 
| 4440 | STp->buffer->aux = (os_aux_t *) (page_address(STp->buffer->sg[i].page) + OS_DATA_SIZE - b_size); | 4440 | STp->buffer->aux = (os_aux_t *) (page_address(sg_page(&STp->buffer->sg[i])) + OS_DATA_SIZE - b_size); | 
| 4441 | #if DEBUG | 4441 | #if DEBUG | 
| 4442 | printk(OSST_DEB_MSG "%s:D: b_data points to %p in segment 0 at %p\n", name, | 4442 | printk(OSST_DEB_MSG "%s:D: b_data points to %p in segment 0 at %p\n", name, | 
| 4443 | STp->buffer->b_data, page_address(STp->buffer->sg[0].page)); | 4443 | STp->buffer->b_data, page_address(STp->buffer->sg[0].page)); | 
| @@ -5252,25 +5252,26 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma) | |||
| 5252 | /* Try to allocate the first segment up to OS_DATA_SIZE and the others | 5252 | /* Try to allocate the first segment up to OS_DATA_SIZE and the others | 
| 5253 | big enough to reach the goal (code assumes no segments in place) */ | 5253 | big enough to reach the goal (code assumes no segments in place) */ | 
| 5254 | for (b_size = OS_DATA_SIZE, order = OSST_FIRST_ORDER; b_size >= PAGE_SIZE; order--, b_size /= 2) { | 5254 | for (b_size = OS_DATA_SIZE, order = OSST_FIRST_ORDER; b_size >= PAGE_SIZE; order--, b_size /= 2) { | 
| 5255 | STbuffer->sg[0].page = alloc_pages(priority, order); | 5255 | struct page *page = alloc_pages(priority, order); | 
| 5256 | |||
| 5256 | STbuffer->sg[0].offset = 0; | 5257 | STbuffer->sg[0].offset = 0; | 
| 5257 | if (STbuffer->sg[0].page != NULL) { | 5258 | if (page != NULL) { | 
| 5259 | sg_set_page(&STbuffer->sg[0], page); | ||
| 5258 | STbuffer->sg[0].length = b_size; | 5260 | STbuffer->sg[0].length = b_size; | 
| 5259 | STbuffer->b_data = page_address(STbuffer->sg[0].page); | 5261 | STbuffer->b_data = page_address(page); | 
| 5260 | break; | 5262 | break; | 
| 5261 | } | 5263 | } | 
| 5262 | } | 5264 | } | 
| 5263 | if (STbuffer->sg[0].page == NULL) { | 5265 | if (sg_page(&STbuffer->sg[0]) == NULL) { | 
| 5264 | printk(KERN_NOTICE "osst :I: Can't allocate tape buffer main segment.\n"); | 5266 | printk(KERN_NOTICE "osst :I: Can't allocate tape buffer main segment.\n"); | 
| 5265 | return 0; | 5267 | return 0; | 
| 5266 | } | 5268 | } | 
| 5267 | /* Got initial segment of 'bsize,order', continue with same size if possible, except for AUX */ | 5269 | /* Got initial segment of 'bsize,order', continue with same size if possible, except for AUX */ | 
| 5268 | for (segs=STbuffer->sg_segs=1, got=b_size; | 5270 | for (segs=STbuffer->sg_segs=1, got=b_size; | 
| 5269 | segs < max_segs && got < OS_FRAME_SIZE; ) { | 5271 | segs < max_segs && got < OS_FRAME_SIZE; ) { | 
| 5270 | STbuffer->sg[segs].page = | 5272 | struct page *page = alloc_pages(priority, (OS_FRAME_SIZE - got <= PAGE_SIZE) ? 0 : order); | 
| 5271 | alloc_pages(priority, (OS_FRAME_SIZE - got <= PAGE_SIZE) ? 0 : order); | ||
| 5272 | STbuffer->sg[segs].offset = 0; | 5273 | STbuffer->sg[segs].offset = 0; | 
| 5273 | if (STbuffer->sg[segs].page == NULL) { | 5274 | if (page == NULL) { | 
| 5274 | if (OS_FRAME_SIZE - got <= (max_segs - segs) * b_size / 2 && order) { | 5275 | if (OS_FRAME_SIZE - got <= (max_segs - segs) * b_size / 2 && order) { | 
| 5275 | b_size /= 2; /* Large enough for the rest of the buffers */ | 5276 | b_size /= 2; /* Large enough for the rest of the buffers */ | 
| 5276 | order--; | 5277 | order--; | 
| @@ -5284,6 +5285,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma) | |||
| 5284 | normalize_buffer(STbuffer); | 5285 | normalize_buffer(STbuffer); | 
| 5285 | return 0; | 5286 | return 0; | 
| 5286 | } | 5287 | } | 
| 5288 | sg_set_page(&STbuffer->sg[segs], page); | ||
| 5287 | STbuffer->sg[segs].length = (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size; | 5289 | STbuffer->sg[segs].length = (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size; | 
| 5288 | got += STbuffer->sg[segs].length; | 5290 | got += STbuffer->sg[segs].length; | 
| 5289 | STbuffer->buffer_size = got; | 5291 | STbuffer->buffer_size = got; | 
| @@ -5316,7 +5318,7 @@ static void normalize_buffer(struct osst_buffer *STbuffer) | |||
| 5316 | b_size < STbuffer->sg[i].length; | 5318 | b_size < STbuffer->sg[i].length; | 
| 5317 | b_size *= 2, order++); | 5319 | b_size *= 2, order++); | 
| 5318 | 5320 | ||
| 5319 | __free_pages(STbuffer->sg[i].page, order); | 5321 | __free_pages(sg_page(&STbuffer->sg[i]), order); | 
| 5320 | STbuffer->buffer_size -= STbuffer->sg[i].length; | 5322 | STbuffer->buffer_size -= STbuffer->sg[i].length; | 
| 5321 | } | 5323 | } | 
| 5322 | #if DEBUG | 5324 | #if DEBUG | 
| @@ -5344,7 +5346,7 @@ static int append_to_buffer(const char __user *ubp, struct osst_buffer *st_bp, i | |||
| 5344 | for ( ; i < st_bp->sg_segs && do_count > 0; i++) { | 5346 | for ( ; i < st_bp->sg_segs && do_count > 0; i++) { | 
| 5345 | cnt = st_bp->sg[i].length - offset < do_count ? | 5347 | cnt = st_bp->sg[i].length - offset < do_count ? | 
| 5346 | st_bp->sg[i].length - offset : do_count; | 5348 | st_bp->sg[i].length - offset : do_count; | 
| 5347 | res = copy_from_user(page_address(st_bp->sg[i].page) + offset, ubp, cnt); | 5349 | res = copy_from_user(page_address(sg_page(&st_bp->sg[i])) + offset, ubp, cnt); | 
| 5348 | if (res) | 5350 | if (res) | 
| 5349 | return (-EFAULT); | 5351 | return (-EFAULT); | 
| 5350 | do_count -= cnt; | 5352 | do_count -= cnt; | 
| @@ -5377,7 +5379,7 @@ static int from_buffer(struct osst_buffer *st_bp, char __user *ubp, int do_count | |||
| 5377 | for ( ; i < st_bp->sg_segs && do_count > 0; i++) { | 5379 | for ( ; i < st_bp->sg_segs && do_count > 0; i++) { | 
| 5378 | cnt = st_bp->sg[i].length - offset < do_count ? | 5380 | cnt = st_bp->sg[i].length - offset < do_count ? | 
| 5379 | st_bp->sg[i].length - offset : do_count; | 5381 | st_bp->sg[i].length - offset : do_count; | 
| 5380 | res = copy_to_user(ubp, page_address(st_bp->sg[i].page) + offset, cnt); | 5382 | res = copy_to_user(ubp, page_address(sg_page(&st_bp->sg[i])) + offset, cnt); | 
| 5381 | if (res) | 5383 | if (res) | 
| 5382 | return (-EFAULT); | 5384 | return (-EFAULT); | 
| 5383 | do_count -= cnt; | 5385 | do_count -= cnt; | 
| @@ -5410,7 +5412,7 @@ static int osst_zero_buffer_tail(struct osst_buffer *st_bp) | |||
| 5410 | i < st_bp->sg_segs && do_count > 0; i++) { | 5412 | i < st_bp->sg_segs && do_count > 0; i++) { | 
| 5411 | cnt = st_bp->sg[i].length - offset < do_count ? | 5413 | cnt = st_bp->sg[i].length - offset < do_count ? | 
| 5412 | st_bp->sg[i].length - offset : do_count ; | 5414 | st_bp->sg[i].length - offset : do_count ; | 
| 5413 | memset(page_address(st_bp->sg[i].page) + offset, 0, cnt); | 5415 | memset(page_address(sg_page(&st_bp->sg[i])) + offset, 0, cnt); | 
| 5414 | do_count -= cnt; | 5416 | do_count -= cnt; | 
| 5415 | offset = 0; | 5417 | offset = 0; | 
| 5416 | } | 5418 | } | 
| @@ -5430,7 +5432,7 @@ static int osst_copy_to_buffer(struct osst_buffer *st_bp, unsigned char *ptr) | |||
| 5430 | for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) { | 5432 | for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) { | 
| 5431 | cnt = st_bp->sg[i].length < do_count ? | 5433 | cnt = st_bp->sg[i].length < do_count ? | 
| 5432 | st_bp->sg[i].length : do_count ; | 5434 | st_bp->sg[i].length : do_count ; | 
| 5433 | memcpy(page_address(st_bp->sg[i].page), ptr, cnt); | 5435 | memcpy(page_address(sg_page(&st_bp->sg[i])), ptr, cnt); | 
| 5434 | do_count -= cnt; | 5436 | do_count -= cnt; | 
| 5435 | ptr += cnt; | 5437 | ptr += cnt; | 
| 5436 | } | 5438 | } | 
| @@ -5451,7 +5453,7 @@ static int osst_copy_from_buffer(struct osst_buffer *st_bp, unsigned char *ptr) | |||
| 5451 | for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) { | 5453 | for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) { | 
| 5452 | cnt = st_bp->sg[i].length < do_count ? | 5454 | cnt = st_bp->sg[i].length < do_count ? | 
| 5453 | st_bp->sg[i].length : do_count ; | 5455 | st_bp->sg[i].length : do_count ; | 
| 5454 | memcpy(ptr, page_address(st_bp->sg[i].page), cnt); | 5456 | memcpy(ptr, page_address(sg_page(&st_bp->sg[i])), cnt); | 
| 5455 | do_count -= cnt; | 5457 | do_count -= cnt; | 
| 5456 | ptr += cnt; | 5458 | ptr += cnt; | 
| 5457 | } | 5459 | } | 
diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index 98397559c53b..7db28cd49446 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h  | |||
| @@ -393,7 +393,7 @@ enum _burst_mode { | |||
| 393 | #define MSG_EXT_SDTR 0x01 | 393 | #define MSG_EXT_SDTR 0x01 | 
| 394 | 394 | ||
| 395 | /* scatter-gather table */ | 395 | /* scatter-gather table */ | 
| 396 | # define BUFFER_ADDR ((char *)((unsigned int)(SCpnt->SCp.buffer->page) + SCpnt->SCp.buffer->offset)) | 396 | # define BUFFER_ADDR ((char *)((sg_virt(SCpnt->SCp.buffer)))) | 
| 397 | 397 | ||
| 398 | #endif /*__nsp_cs__*/ | 398 | #endif /*__nsp_cs__*/ | 
| 399 | /* end */ | 399 | /* end */ | 
diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index 190e2a7d7067..969b9387a0c3 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c  | |||
| @@ -443,8 +443,7 @@ SYM53C500_intr(int irq, void *dev_id) | |||
| 443 | 443 | ||
| 444 | scsi_for_each_sg(curSC, sg, scsi_sg_count(curSC), i) { | 444 | scsi_for_each_sg(curSC, sg, scsi_sg_count(curSC), i) { | 
| 445 | SYM53C500_pio_write(fast_pio, port_base, | 445 | SYM53C500_pio_write(fast_pio, port_base, | 
| 446 | page_address(sg->page) + sg->offset, | 446 | sg_virt(sg), sg->length); | 
| 447 | sg->length); | ||
| 448 | } | 447 | } | 
| 449 | REG0(port_base); | 448 | REG0(port_base); | 
| 450 | } | 449 | } | 
| @@ -463,8 +462,7 @@ SYM53C500_intr(int irq, void *dev_id) | |||
| 463 | 462 | ||
| 464 | scsi_for_each_sg(curSC, sg, scsi_sg_count(curSC), i) { | 463 | scsi_for_each_sg(curSC, sg, scsi_sg_count(curSC), i) { | 
| 465 | SYM53C500_pio_read(fast_pio, port_base, | 464 | SYM53C500_pio_read(fast_pio, port_base, | 
| 466 | page_address(sg->page) + sg->offset, | 465 | sg_virt(sg), sg->length); | 
| 467 | sg->length); | ||
| 468 | } | 466 | } | 
| 469 | REG0(port_base); | 467 | REG0(port_base); | 
| 470 | } | 468 | } | 
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index 67b6d76a6c8d..67ee51a3d7e1 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c  | |||
| @@ -608,9 +608,7 @@ static int ppa_completion(struct scsi_cmnd *cmd) | |||
| 608 | cmd->SCp.buffer++; | 608 | cmd->SCp.buffer++; | 
| 609 | cmd->SCp.this_residual = | 609 | cmd->SCp.this_residual = | 
| 610 | cmd->SCp.buffer->length; | 610 | cmd->SCp.buffer->length; | 
| 611 | cmd->SCp.ptr = | 611 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 612 | page_address(cmd->SCp.buffer->page) + | ||
| 613 | cmd->SCp.buffer->offset; | ||
| 614 | } | 612 | } | 
| 615 | } | 613 | } | 
| 616 | /* Now check to see if the drive is ready to comunicate */ | 614 | /* Now check to see if the drive is ready to comunicate */ | 
| @@ -756,8 +754,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd) | |||
| 756 | /* if many buffers are available, start filling the first */ | 754 | /* if many buffers are available, start filling the first */ | 
| 757 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 755 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 
| 758 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 756 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 759 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + | 757 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 760 | cmd->SCp.buffer->offset; | ||
| 761 | } else { | 758 | } else { | 
| 762 | /* else fill the only available buffer */ | 759 | /* else fill the only available buffer */ | 
| 763 | cmd->SCp.buffer = NULL; | 760 | cmd->SCp.buffer = NULL; | 
diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c index 0f43d1d046d9..03f19b8d19c9 100644 --- a/drivers/scsi/ps3rom.c +++ b/drivers/scsi/ps3rom.c  | |||
| @@ -111,14 +111,14 @@ static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf) | |||
| 111 | req_len = act_len = 0; | 111 | req_len = act_len = 0; | 
| 112 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { | 112 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { | 
| 113 | if (active) { | 113 | if (active) { | 
| 114 | kaddr = kmap_atomic(sgpnt->page, KM_IRQ0); | 114 | kaddr = kmap_atomic(sg_page(sgpnt), KM_IRQ0); | 
| 115 | len = sgpnt->length; | 115 | len = sgpnt->length; | 
| 116 | if ((req_len + len) > buflen) { | 116 | if ((req_len + len) > buflen) { | 
| 117 | active = 0; | 117 | active = 0; | 
| 118 | len = buflen - req_len; | 118 | len = buflen - req_len; | 
| 119 | } | 119 | } | 
| 120 | memcpy(kaddr + sgpnt->offset, buf + req_len, len); | 120 | memcpy(kaddr + sgpnt->offset, buf + req_len, len); | 
| 121 | flush_kernel_dcache_page(sgpnt->page); | 121 | flush_kernel_dcache_page(sg_page(sgpnt)); | 
| 122 | kunmap_atomic(kaddr, KM_IRQ0); | 122 | kunmap_atomic(kaddr, KM_IRQ0); | 
| 123 | act_len += len; | 123 | act_len += len; | 
| 124 | } | 124 | } | 
| @@ -147,7 +147,7 @@ static int fetch_to_dev_buffer(struct scsi_cmnd *cmd, void *buf) | |||
| 147 | 147 | ||
| 148 | req_len = fin = 0; | 148 | req_len = fin = 0; | 
| 149 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { | 149 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { | 
| 150 | kaddr = kmap_atomic(sgpnt->page, KM_IRQ0); | 150 | kaddr = kmap_atomic(sg_page(sgpnt->page), KM_IRQ0); | 
| 151 | len = sgpnt->length; | 151 | len = sgpnt->length; | 
| 152 | if ((req_len + len) > buflen) { | 152 | if ((req_len + len) > buflen) { | 
| 153 | len = buflen - req_len; | 153 | len = buflen - req_len; | 
diff --git a/drivers/scsi/qlogicfas408.c b/drivers/scsi/qlogicfas408.c index 2bfbf26c00ed..de7b3bc2cbc9 100644 --- a/drivers/scsi/qlogicfas408.c +++ b/drivers/scsi/qlogicfas408.c  | |||
| @@ -317,7 +317,7 @@ static unsigned int ql_pcmd(struct scsi_cmnd *cmd) | |||
| 317 | return ((priv->qabort == 1 ? | 317 | return ((priv->qabort == 1 ? | 
| 318 | DID_ABORT : DID_RESET) << 16); | 318 | DID_ABORT : DID_RESET) << 16); | 
| 319 | } | 319 | } | 
| 320 | buf = page_address(sg->page) + sg->offset; | 320 | buf = sg_virt(sg); | 
| 321 | if (ql_pdma(priv, phase, buf, sg->length)) | 321 | if (ql_pdma(priv, phase, buf, sg->length)) | 
| 322 | break; | 322 | break; | 
| 323 | } | 323 | } | 
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 72ee4c9cfb1a..46cae5a212de 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c  | |||
| @@ -625,7 +625,7 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, | |||
| 625 | scsi_for_each_sg(scp, sg, scp->use_sg, k) { | 625 | scsi_for_each_sg(scp, sg, scp->use_sg, k) { | 
| 626 | if (active) { | 626 | if (active) { | 
| 627 | kaddr = (unsigned char *) | 627 | kaddr = (unsigned char *) | 
| 628 | kmap_atomic(sg->page, KM_USER0); | 628 | kmap_atomic(sg_page(sg), KM_USER0); | 
| 629 | if (NULL == kaddr) | 629 | if (NULL == kaddr) | 
| 630 | return (DID_ERROR << 16); | 630 | return (DID_ERROR << 16); | 
| 631 | kaddr_off = (unsigned char *)kaddr + sg->offset; | 631 | kaddr_off = (unsigned char *)kaddr + sg->offset; | 
| @@ -672,7 +672,7 @@ static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, | |||
| 672 | sg = scsi_sglist(scp); | 672 | sg = scsi_sglist(scp); | 
| 673 | req_len = fin = 0; | 673 | req_len = fin = 0; | 
| 674 | for (k = 0; k < scp->use_sg; ++k, sg = sg_next(sg)) { | 674 | for (k = 0; k < scp->use_sg; ++k, sg = sg_next(sg)) { | 
| 675 | kaddr = (unsigned char *)kmap_atomic(sg->page, KM_USER0); | 675 | kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0); | 
| 676 | if (NULL == kaddr) | 676 | if (NULL == kaddr) | 
| 677 | return -1; | 677 | return -1; | 
| 678 | kaddr_off = (unsigned char *)kaddr + sg->offset; | 678 | kaddr_off = (unsigned char *)kaddr + sg->offset; | 
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index aac8a02cbe80..61fdaf02f251 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c  | |||
| @@ -295,7 +295,7 @@ static int scsi_req_map_sg(struct request *rq, struct scatterlist *sgl, | |||
| 295 | int i, err, nr_vecs = 0; | 295 | int i, err, nr_vecs = 0; | 
| 296 | 296 | ||
| 297 | for_each_sg(sgl, sg, nsegs, i) { | 297 | for_each_sg(sgl, sg, nsegs, i) { | 
| 298 | page = sg->page; | 298 | page = sg_page(sg); | 
| 299 | off = sg->offset; | 299 | off = sg->offset; | 
| 300 | len = sg->length; | 300 | len = sg->length; | 
| 301 | data_len += len; | 301 | data_len += len; | 
| @@ -764,7 +764,7 @@ struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *cmd, gfp_t gfp_mask) | |||
| 764 | if (unlikely(!sgl)) | 764 | if (unlikely(!sgl)) | 
| 765 | goto enomem; | 765 | goto enomem; | 
| 766 | 766 | ||
| 767 | memset(sgl, 0, sizeof(*sgl) * sgp->size); | 767 | sg_init_table(sgl, sgp->size); | 
| 768 | 768 | ||
| 769 | /* | 769 | /* | 
| 770 | * first loop through, set initial index and return value | 770 | * first loop through, set initial index and return value | 
| @@ -781,6 +781,13 @@ struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *cmd, gfp_t gfp_mask) | |||
| 781 | sg_chain(prev, SCSI_MAX_SG_SEGMENTS, sgl); | 781 | sg_chain(prev, SCSI_MAX_SG_SEGMENTS, sgl); | 
| 782 | 782 | ||
| 783 | /* | 783 | /* | 
| 784 | * if we have nothing left, mark the last segment as | ||
| 785 | * end-of-list | ||
| 786 | */ | ||
| 787 | if (!left) | ||
| 788 | sg_mark_end(sgl, this); | ||
| 789 | |||
| 790 | /* | ||
| 784 | * don't allow subsequent mempool allocs to sleep, it would | 791 | * don't allow subsequent mempool allocs to sleep, it would | 
| 785 | * violate the mempool principle. | 792 | * violate the mempool principle. | 
| 786 | */ | 793 | */ | 
| @@ -2353,7 +2360,7 @@ void *scsi_kmap_atomic_sg(struct scatterlist *sgl, int sg_count, | |||
| 2353 | *offset = *offset - len_complete + sg->offset; | 2360 | *offset = *offset - len_complete + sg->offset; | 
| 2354 | 2361 | ||
| 2355 | /* Assumption: contiguous pages can be accessed as "page + i" */ | 2362 | /* Assumption: contiguous pages can be accessed as "page + i" */ | 
| 2356 | page = nth_page(sg->page, (*offset >> PAGE_SHIFT)); | 2363 | page = nth_page(sg_page(sg), (*offset >> PAGE_SHIFT)); | 
| 2357 | *offset &= ~PAGE_MASK; | 2364 | *offset &= ~PAGE_MASK; | 
| 2358 | 2365 | ||
| 2359 | /* Bytes in this sg-entry from *offset to the end of the page */ | 2366 | /* Bytes in this sg-entry from *offset to the end of the page */ | 
diff --git a/drivers/scsi/seagate.c b/drivers/scsi/seagate.c index ce80fa9ad815..b11324479b5b 100644 --- a/drivers/scsi/seagate.c +++ b/drivers/scsi/seagate.c  | |||
| @@ -999,14 +999,14 @@ connect_loop: | |||
| 999 | for (i = 0; i < nobuffs; ++i) | 999 | for (i = 0; i < nobuffs; ++i) | 
| 1000 | printk("scsi%d : buffer %d address = %p length = %d\n", | 1000 | printk("scsi%d : buffer %d address = %p length = %d\n", | 
| 1001 | hostno, i, | 1001 | hostno, i, | 
| 1002 | page_address(buffer[i].page) + buffer[i].offset, | 1002 | sg_virt(&buffer[i]), | 
| 1003 | buffer[i].length); | 1003 | buffer[i].length); | 
| 1004 | } | 1004 | } | 
| 1005 | #endif | 1005 | #endif | 
| 1006 | 1006 | ||
| 1007 | buffer = (struct scatterlist *) SCint->request_buffer; | 1007 | buffer = (struct scatterlist *) SCint->request_buffer; | 
| 1008 | len = buffer->length; | 1008 | len = buffer->length; | 
| 1009 | data = page_address(buffer->page) + buffer->offset; | 1009 | data = sg_virt(buffer); | 
| 1010 | } else { | 1010 | } else { | 
| 1011 | DPRINTK (DEBUG_SG, "scsi%d : scatter gather not requested.\n", hostno); | 1011 | DPRINTK (DEBUG_SG, "scsi%d : scatter gather not requested.\n", hostno); | 
| 1012 | buffer = NULL; | 1012 | buffer = NULL; | 
| @@ -1239,7 +1239,7 @@ connect_loop: | |||
| 1239 | --nobuffs; | 1239 | --nobuffs; | 
| 1240 | ++buffer; | 1240 | ++buffer; | 
| 1241 | len = buffer->length; | 1241 | len = buffer->length; | 
| 1242 | data = page_address(buffer->page) + buffer->offset; | 1242 | data = sg_virt(buffer); | 
| 1243 | DPRINTK (DEBUG_SG, | 1243 | DPRINTK (DEBUG_SG, | 
| 1244 | "scsi%d : next scatter-gather buffer len = %d address = %08x\n", | 1244 | "scsi%d : next scatter-gather buffer len = %d address = %08x\n", | 
| 1245 | hostno, len, data); | 1245 | hostno, len, data); | 
| @@ -1396,7 +1396,7 @@ connect_loop: | |||
| 1396 | --nobuffs; | 1396 | --nobuffs; | 
| 1397 | ++buffer; | 1397 | ++buffer; | 
| 1398 | len = buffer->length; | 1398 | len = buffer->length; | 
| 1399 | data = page_address(buffer->page) + buffer->offset; | 1399 | data = sg_virt(buffer); | 
| 1400 | DPRINTK (DEBUG_SG, "scsi%d : next scatter-gather buffer len = %d address = %08x\n", hostno, len, data); | 1400 | DPRINTK (DEBUG_SG, "scsi%d : next scatter-gather buffer len = %d address = %08x\n", hostno, len, data); | 
| 1401 | } | 1401 | } | 
| 1402 | break; | 1402 | break; | 
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 7238b2dfc497..cc1971002846 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c  | |||
| @@ -1169,7 +1169,7 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) | |||
| 1169 | len = vma->vm_end - sa; | 1169 | len = vma->vm_end - sa; | 
| 1170 | len = (len < sg->length) ? len : sg->length; | 1170 | len = (len < sg->length) ? len : sg->length; | 
| 1171 | if (offset < len) { | 1171 | if (offset < len) { | 
| 1172 | page = virt_to_page(page_address(sg->page) + offset); | 1172 | page = virt_to_page(page_address(sg_page(sg)) + offset); | 
| 1173 | get_page(page); /* increment page count */ | 1173 | get_page(page); /* increment page count */ | 
| 1174 | break; | 1174 | break; | 
| 1175 | } | 1175 | } | 
| @@ -1717,13 +1717,13 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, | |||
| 1717 | goto out_unlock; */ | 1717 | goto out_unlock; */ | 
| 1718 | } | 1718 | } | 
| 1719 | 1719 | ||
| 1720 | sgl[0].page = pages[0]; | 1720 | sg_set_page(sgl, pages[0]); | 
| 1721 | sgl[0].offset = uaddr & ~PAGE_MASK; | 1721 | sgl[0].offset = uaddr & ~PAGE_MASK; | 
| 1722 | if (nr_pages > 1) { | 1722 | if (nr_pages > 1) { | 
| 1723 | sgl[0].length = PAGE_SIZE - sgl[0].offset; | 1723 | sgl[0].length = PAGE_SIZE - sgl[0].offset; | 
| 1724 | count -= sgl[0].length; | 1724 | count -= sgl[0].length; | 
| 1725 | for (i=1; i < nr_pages ; i++) { | 1725 | for (i=1; i < nr_pages ; i++) { | 
| 1726 | sgl[i].page = pages[i]; | 1726 | sg_set_page(&sgl[i], pages[i]); | 
| 1727 | sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; | 1727 | sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; | 
| 1728 | count -= PAGE_SIZE; | 1728 | count -= PAGE_SIZE; | 
| 1729 | } | 1729 | } | 
| @@ -1754,7 +1754,7 @@ st_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_pages, | |||
| 1754 | int i; | 1754 | int i; | 
| 1755 | 1755 | ||
| 1756 | for (i=0; i < nr_pages; i++) { | 1756 | for (i=0; i < nr_pages; i++) { | 
| 1757 | struct page *page = sgl[i].page; | 1757 | struct page *page = sg_page(&sgl[i]); | 
| 1758 | 1758 | ||
| 1759 | if (dirtied) | 1759 | if (dirtied) | 
| 1760 | SetPageDirty(page); | 1760 | SetPageDirty(page); | 
| @@ -1854,7 +1854,7 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) | |||
| 1854 | scatter_elem_sz_prev = ret_sz; | 1854 | scatter_elem_sz_prev = ret_sz; | 
| 1855 | } | 1855 | } | 
| 1856 | } | 1856 | } | 
| 1857 | sg->page = p; | 1857 | sg_set_page(sg, p); | 
| 1858 | sg->length = (ret_sz > num) ? num : ret_sz; | 1858 | sg->length = (ret_sz > num) ? num : ret_sz; | 
| 1859 | 1859 | ||
| 1860 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, " | 1860 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, " | 
| @@ -1907,14 +1907,14 @@ sg_write_xfer(Sg_request * srp) | |||
| 1907 | onum = 1; | 1907 | onum = 1; | 
| 1908 | 1908 | ||
| 1909 | ksglen = sg->length; | 1909 | ksglen = sg->length; | 
| 1910 | p = page_address(sg->page); | 1910 | p = page_address(sg_page(sg)); | 
| 1911 | for (j = 0, k = 0; j < onum; ++j) { | 1911 | for (j = 0, k = 0; j < onum; ++j) { | 
| 1912 | res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up); | 1912 | res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up); | 
| 1913 | if (res) | 1913 | if (res) | 
| 1914 | return res; | 1914 | return res; | 
| 1915 | 1915 | ||
| 1916 | for (; p; sg = sg_next(sg), ksglen = sg->length, | 1916 | for (; p; sg = sg_next(sg), ksglen = sg->length, | 
| 1917 | p = page_address(sg->page)) { | 1917 | p = page_address(sg_page(sg))) { | 
| 1918 | if (usglen <= 0) | 1918 | if (usglen <= 0) | 
| 1919 | break; | 1919 | break; | 
| 1920 | if (ksglen > usglen) { | 1920 | if (ksglen > usglen) { | 
| @@ -1991,12 +1991,12 @@ sg_remove_scat(Sg_scatter_hold * schp) | |||
| 1991 | } else { | 1991 | } else { | 
| 1992 | int k; | 1992 | int k; | 
| 1993 | 1993 | ||
| 1994 | for (k = 0; (k < schp->k_use_sg) && sg->page; | 1994 | for (k = 0; (k < schp->k_use_sg) && sg_page(sg); | 
| 1995 | ++k, sg = sg_next(sg)) { | 1995 | ++k, sg = sg_next(sg)) { | 
| 1996 | SCSI_LOG_TIMEOUT(5, printk( | 1996 | SCSI_LOG_TIMEOUT(5, printk( | 
| 1997 | "sg_remove_scat: k=%d, pg=0x%p, len=%d\n", | 1997 | "sg_remove_scat: k=%d, pg=0x%p, len=%d\n", | 
| 1998 | k, sg->page, sg->length)); | 1998 | k, sg_page(sg), sg->length)); | 
| 1999 | sg_page_free(sg->page, sg->length); | 1999 | sg_page_free(sg_page(sg), sg->length); | 
| 2000 | } | 2000 | } | 
| 2001 | } | 2001 | } | 
| 2002 | kfree(schp->buffer); | 2002 | kfree(schp->buffer); | 
| @@ -2038,7 +2038,7 @@ sg_read_xfer(Sg_request * srp) | |||
| 2038 | } else | 2038 | } else | 
| 2039 | onum = 1; | 2039 | onum = 1; | 
| 2040 | 2040 | ||
| 2041 | p = page_address(sg->page); | 2041 | p = page_address(sg_page(sg)); | 
| 2042 | ksglen = sg->length; | 2042 | ksglen = sg->length; | 
| 2043 | for (j = 0, k = 0; j < onum; ++j) { | 2043 | for (j = 0, k = 0; j < onum; ++j) { | 
| 2044 | res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up); | 2044 | res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up); | 
| @@ -2046,7 +2046,7 @@ sg_read_xfer(Sg_request * srp) | |||
| 2046 | return res; | 2046 | return res; | 
| 2047 | 2047 | ||
| 2048 | for (; p; sg = sg_next(sg), ksglen = sg->length, | 2048 | for (; p; sg = sg_next(sg), ksglen = sg->length, | 
| 2049 | p = page_address(sg->page)) { | 2049 | p = page_address(sg_page(sg))) { | 
| 2050 | if (usglen <= 0) | 2050 | if (usglen <= 0) | 
| 2051 | break; | 2051 | break; | 
| 2052 | if (ksglen > usglen) { | 2052 | if (ksglen > usglen) { | 
| @@ -2092,15 +2092,15 @@ sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer) | |||
| 2092 | if ((!outp) || (num_read_xfer <= 0)) | 2092 | if ((!outp) || (num_read_xfer <= 0)) | 
| 2093 | return 0; | 2093 | return 0; | 
| 2094 | 2094 | ||
| 2095 | for (k = 0; (k < schp->k_use_sg) && sg->page; ++k, sg = sg_next(sg)) { | 2095 | for (k = 0; (k < schp->k_use_sg) && sg_page(sg); ++k, sg = sg_next(sg)) { | 
| 2096 | num = sg->length; | 2096 | num = sg->length; | 
| 2097 | if (num > num_read_xfer) { | 2097 | if (num > num_read_xfer) { | 
| 2098 | if (__copy_to_user(outp, page_address(sg->page), | 2098 | if (__copy_to_user(outp, page_address(sg_page(sg)), | 
| 2099 | num_read_xfer)) | 2099 | num_read_xfer)) | 
| 2100 | return -EFAULT; | 2100 | return -EFAULT; | 
| 2101 | break; | 2101 | break; | 
| 2102 | } else { | 2102 | } else { | 
| 2103 | if (__copy_to_user(outp, page_address(sg->page), | 2103 | if (__copy_to_user(outp, page_address(sg_page(sg)), | 
| 2104 | num)) | 2104 | num)) | 
| 2105 | return -EFAULT; | 2105 | return -EFAULT; | 
| 2106 | num_read_xfer -= num; | 2106 | num_read_xfer -= num; | 
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 73c44cbdea47..ce69b9efc102 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c  | |||
| @@ -3797,7 +3797,7 @@ static void buf_to_sg(struct st_buffer *STbp, unsigned int length) | |||
| 3797 | sg = &(STbp->sg[0]); | 3797 | sg = &(STbp->sg[0]); | 
| 3798 | frp = STbp->frp; | 3798 | frp = STbp->frp; | 
| 3799 | for (i=count=0; count < length; i++) { | 3799 | for (i=count=0; count < length; i++) { | 
| 3800 | sg[i].page = frp[i].page; | 3800 | sg_set_page(&sg[i], frp[i].page); | 
| 3801 | if (length - count > frp[i].length) | 3801 | if (length - count > frp[i].length) | 
| 3802 | sg[i].length = frp[i].length; | 3802 | sg[i].length = frp[i].length; | 
| 3803 | else | 3803 | else | 
| @@ -4446,14 +4446,14 @@ static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pa | |||
| 4446 | } | 4446 | } | 
| 4447 | 4447 | ||
| 4448 | /* Populate the scatter/gather list */ | 4448 | /* Populate the scatter/gather list */ | 
| 4449 | sgl[0].page = pages[0]; | 4449 | sg_set_page(&sgl[0], pages[0]); | 
| 4450 | sgl[0].offset = uaddr & ~PAGE_MASK; | 4450 | sgl[0].offset = uaddr & ~PAGE_MASK; | 
| 4451 | if (nr_pages > 1) { | 4451 | if (nr_pages > 1) { | 
| 4452 | sgl[0].length = PAGE_SIZE - sgl[0].offset; | 4452 | sgl[0].length = PAGE_SIZE - sgl[0].offset; | 
| 4453 | count -= sgl[0].length; | 4453 | count -= sgl[0].length; | 
| 4454 | for (i=1; i < nr_pages ; i++) { | 4454 | for (i=1; i < nr_pages ; i++) { | 
| 4455 | sg_set_page(&sgl[i], pages[i]);; | ||
| 4455 | sgl[i].offset = 0; | 4456 | sgl[i].offset = 0; | 
| 4456 | sgl[i].page = pages[i]; | ||
| 4457 | sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; | 4457 | sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; | 
| 4458 | count -= PAGE_SIZE; | 4458 | count -= PAGE_SIZE; | 
| 4459 | } | 4459 | } | 
| @@ -4483,7 +4483,7 @@ static int sgl_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_p | |||
| 4483 | int i; | 4483 | int i; | 
| 4484 | 4484 | ||
| 4485 | for (i=0; i < nr_pages; i++) { | 4485 | for (i=0; i < nr_pages; i++) { | 
| 4486 | struct page *page = sgl[i].page; | 4486 | struct page *page = sg_page(&sgl[i]); | 
| 4487 | 4487 | ||
| 4488 | if (dirtied) | 4488 | if (dirtied) | 
| 4489 | SetPageDirty(page); | 4489 | SetPageDirty(page); | 
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index 4aafe89b557f..2dcde373b20e 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c  | |||
| @@ -272,8 +272,7 @@ static struct scsi_host_template *the_template = NULL; | |||
| 272 | #define HOSTNO instance->host_no | 272 | #define HOSTNO instance->host_no | 
| 273 | #define H_NO(cmd) (cmd)->device->host->host_no | 273 | #define H_NO(cmd) (cmd)->device->host->host_no | 
| 274 | 274 | ||
| 275 | #define SGADDR(buffer) (void *)(((unsigned long)page_address((buffer)->page)) + \ | 275 | #define SGADDR(buffer) (void *)(((unsigned long)sg_virt(((buffer))))) | 
| 276 | (buffer)->offset) | ||
| 277 | 276 | ||
| 278 | #ifdef SUPPORT_TAGS | 277 | #ifdef SUPPORT_TAGS | 
| 279 | 278 | ||
diff --git a/drivers/scsi/sym53c416.c b/drivers/scsi/sym53c416.c index 8befab7e9839..90cee94d9522 100644 --- a/drivers/scsi/sym53c416.c +++ b/drivers/scsi/sym53c416.c  | |||
| @@ -196,7 +196,7 @@ static unsigned int sym53c416_base_3[2] = {0,0}; | |||
| 196 | 196 | ||
| 197 | #define MAXHOSTS 4 | 197 | #define MAXHOSTS 4 | 
| 198 | 198 | ||
| 199 | #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset)) | 199 | #define SG_ADDRESS(buffer) ((char *) sg_virt((buffer))) | 
| 200 | 200 | ||
| 201 | enum phases | 201 | enum phases | 
| 202 | { | 202 | { | 
diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c index 5c72ca31a47a..44193049c4ae 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c  | |||
| @@ -430,10 +430,7 @@ static __inline__ void dc390_Going_remove (struct dc390_dcb* pDCB, struct dc390_ | |||
| 430 | 430 | ||
| 431 | static struct scatterlist* dc390_sg_build_single(struct scatterlist *sg, void *addr, unsigned int length) | 431 | static struct scatterlist* dc390_sg_build_single(struct scatterlist *sg, void *addr, unsigned int length) | 
| 432 | { | 432 | { | 
| 433 | memset(sg, 0, sizeof(struct scatterlist)); | 433 | sg_init_one(sg, addr, length); | 
| 434 | sg->page = virt_to_page(addr); | ||
| 435 | sg->length = length; | ||
| 436 | sg->offset = (unsigned long)addr & ~PAGE_MASK; | ||
| 437 | return sg; | 434 | return sg; | 
| 438 | } | 435 | } | 
| 439 | 436 | ||
diff --git a/drivers/scsi/ultrastor.c b/drivers/scsi/ultrastor.c index ea72bbeb8f9d..6d1f0edd7985 100644 --- a/drivers/scsi/ultrastor.c +++ b/drivers/scsi/ultrastor.c  | |||
| @@ -681,7 +681,7 @@ static inline void build_sg_list(struct mscp *mscp, struct scsi_cmnd *SCpnt) | |||
| 681 | 681 | ||
| 682 | max = scsi_sg_count(SCpnt); | 682 | max = scsi_sg_count(SCpnt); | 
| 683 | scsi_for_each_sg(SCpnt, sg, max, i) { | 683 | scsi_for_each_sg(SCpnt, sg, max, i) { | 
| 684 | mscp->sglist[i].address = isa_page_to_bus(sg->page) + sg->offset; | 684 | mscp->sglist[i].address = isa_page_to_bus(sg_page(sg)) + sg->offset; | 
| 685 | mscp->sglist[i].num_bytes = sg->length; | 685 | mscp->sglist[i].num_bytes = sg->length; | 
| 686 | transfer_length += sg->length; | 686 | transfer_length += sg->length; | 
| 687 | } | 687 | } | 
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c index 0e8e642fd3b0..fdbb92d1f722 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c  | |||
| @@ -410,8 +410,7 @@ wd33c93_queuecommand(struct scsi_cmnd *cmd, | |||
| 410 | if (cmd->use_sg) { | 410 | if (cmd->use_sg) { | 
| 411 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 411 | cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; | 
| 412 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 412 | cmd->SCp.buffers_residual = cmd->use_sg - 1; | 
| 413 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + | 413 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 414 | cmd->SCp.buffer->offset; | ||
| 415 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 414 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 416 | } else { | 415 | } else { | 
| 417 | cmd->SCp.buffer = NULL; | 416 | cmd->SCp.buffer = NULL; | 
| @@ -745,8 +744,7 @@ transfer_bytes(const wd33c93_regs regs, struct scsi_cmnd *cmd, | |||
| 745 | ++cmd->SCp.buffer; | 744 | ++cmd->SCp.buffer; | 
| 746 | --cmd->SCp.buffers_residual; | 745 | --cmd->SCp.buffers_residual; | 
| 747 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 746 | cmd->SCp.this_residual = cmd->SCp.buffer->length; | 
| 748 | cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + | 747 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); | 
| 749 | cmd->SCp.buffer->offset; | ||
| 750 | } | 748 | } | 
| 751 | if (!cmd->SCp.this_residual) /* avoid bogus setups */ | 749 | if (!cmd->SCp.this_residual) /* avoid bogus setups */ | 
| 752 | return; | 750 | return; | 
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c index 255c611e78b8..03cd44f231df 100644 --- a/drivers/scsi/wd7000.c +++ b/drivers/scsi/wd7000.c  | |||
| @@ -1123,7 +1123,7 @@ static int wd7000_queuecommand(struct scsi_cmnd *SCpnt, | |||
| 1123 | any2scsi(scb->maxlen, nseg * sizeof(Sgb)); | 1123 | any2scsi(scb->maxlen, nseg * sizeof(Sgb)); | 
| 1124 | 1124 | ||
| 1125 | scsi_for_each_sg(SCpnt, sg, nseg, i) { | 1125 | scsi_for_each_sg(SCpnt, sg, nseg, i) { | 
| 1126 | any2scsi(sgb[i].ptr, isa_page_to_bus(sg->page) + sg->offset); | 1126 | any2scsi(sgb[i].ptr, isa_page_to_bus(sg_page(sg)) + sg->offset); | 
| 1127 | any2scsi(sgb[i].len, sg->length); | 1127 | any2scsi(sgb[i].len, sg->length); | 
| 1128 | } | 1128 | } | 
| 1129 | } else { | 1129 | } else { | 
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 8dd5a6afd513..90d64a808464 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c  | |||
| @@ -437,13 +437,11 @@ int usb_sg_init ( | |||
| 437 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_IOMMU) | 437 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_IOMMU) | 
| 438 | io->urbs[i]->transfer_buffer = NULL; | 438 | io->urbs[i]->transfer_buffer = NULL; | 
| 439 | #else | 439 | #else | 
| 440 | io->urbs[i]->transfer_buffer = | 440 | io->urbs[i]->transfer_buffer = sg_virt(&sg[i]); | 
| 441 | page_address(sg[i].page) + sg[i].offset; | ||
| 442 | #endif | 441 | #endif | 
| 443 | } else { | 442 | } else { | 
| 444 | /* hc may use _only_ transfer_buffer */ | 443 | /* hc may use _only_ transfer_buffer */ | 
| 445 | io->urbs [i]->transfer_buffer = | 444 | io->urbs [i]->transfer_buffer = sg_virt(&sg[i]); | 
| 446 | page_address (sg [i].page) + sg [i].offset; | ||
| 447 | len = sg [i].length; | 445 | len = sg [i].length; | 
| 448 | } | 446 | } | 
| 449 | 447 | ||
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index e7d982a71548..91e999c9f680 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c  | |||
| @@ -519,8 +519,7 @@ static void mts_do_sg (struct urb* transfer) | |||
| 519 | context->fragment++; | 519 | context->fragment++; | 
| 520 | mts_int_submit_urb(transfer, | 520 | mts_int_submit_urb(transfer, | 
| 521 | context->data_pipe, | 521 | context->data_pipe, | 
| 522 | page_address(sg[context->fragment].page) + | 522 | sg_virt(&sg[context->fragment]), | 
| 523 | sg[context->fragment].offset, | ||
| 524 | sg[context->fragment].length, | 523 | sg[context->fragment].length, | 
| 525 | context->fragment + 1 == scsi_sg_count(context->srb) ? | 524 | context->fragment + 1 == scsi_sg_count(context->srb) ? | 
| 526 | mts_data_done : mts_do_sg); | 525 | mts_data_done : mts_do_sg); | 
| @@ -557,7 +556,7 @@ mts_build_transfer_context(struct scsi_cmnd *srb, struct mts_desc* desc) | |||
| 557 | return; | 556 | return; | 
| 558 | } else { | 557 | } else { | 
| 559 | sg = scsi_sglist(srb); | 558 | sg = scsi_sglist(srb); | 
| 560 | desc->context.data = page_address(sg[0].page) + sg[0].offset; | 559 | desc->context.data = sg_virt(&sg[0]); | 
| 561 | desc->context.data_length = sg[0].length; | 560 | desc->context.data_length = sg[0].length; | 
| 562 | } | 561 | } | 
| 563 | 562 | ||
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index e901d31e051b..ea3162146481 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c  | |||
| @@ -360,9 +360,9 @@ static void free_sglist (struct scatterlist *sg, int nents) | |||
| 360 | if (!sg) | 360 | if (!sg) | 
| 361 | return; | 361 | return; | 
| 362 | for (i = 0; i < nents; i++) { | 362 | for (i = 0; i < nents; i++) { | 
| 363 | if (!sg [i].page) | 363 | if (!sg_page(&sg[i])) | 
| 364 | continue; | 364 | continue; | 
| 365 | kfree (page_address (sg [i].page) + sg [i].offset); | 365 | kfree (sg_virt(&sg[i])); | 
| 366 | } | 366 | } | 
| 367 | kfree (sg); | 367 | kfree (sg); | 
| 368 | } | 368 | } | 
diff --git a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c index cc8f7c52c729..889622baac20 100644 --- a/drivers/usb/storage/protocol.c +++ b/drivers/usb/storage/protocol.c  | |||
| @@ -195,7 +195,7 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer, | |||
| 195 | * the *offset and *index values for the next loop. */ | 195 | * the *offset and *index values for the next loop. */ | 
| 196 | cnt = 0; | 196 | cnt = 0; | 
| 197 | while (cnt < buflen) { | 197 | while (cnt < buflen) { | 
| 198 | struct page *page = sg->page + | 198 | struct page *page = sg_page(sg) + | 
| 199 | ((sg->offset + *offset) >> PAGE_SHIFT); | 199 | ((sg->offset + *offset) >> PAGE_SHIFT); | 
| 200 | unsigned int poff = | 200 | unsigned int poff = | 
| 201 | (sg->offset + *offset) & (PAGE_SIZE-1); | 201 | (sg->offset + *offset) & (PAGE_SIZE-1); | 
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 1ae90ef2c74d..0a9882edf562 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c  | |||
| @@ -283,7 +283,7 @@ int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg, | |||
| 283 | pg = virt_to_page(addr); | 283 | pg = virt_to_page(addr); | 
| 284 | offset = offset_in_page(addr); | 284 | offset = offset_in_page(addr); | 
| 285 | if (sg) { | 285 | if (sg) { | 
| 286 | sg[i].page = pg; | 286 | sg_set_page(&sg[i], pg); | 
| 287 | sg[i].offset = offset; | 287 | sg[i].offset = offset; | 
| 288 | } | 288 | } | 
| 289 | remainder_of_page = PAGE_CACHE_SIZE - offset; | 289 | remainder_of_page = PAGE_CACHE_SIZE - offset; | 
| @@ -713,10 +713,13 @@ ecryptfs_encrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 713 | { | 713 | { | 
| 714 | struct scatterlist src_sg, dst_sg; | 714 | struct scatterlist src_sg, dst_sg; | 
| 715 | 715 | ||
| 716 | src_sg.page = src_page; | 716 | sg_init_table(&src_sg, 1); | 
| 717 | sg_init_table(&dst_sg, 1); | ||
| 718 | |||
| 719 | sg_set_page(&src_sg, src_page); | ||
| 717 | src_sg.offset = src_offset; | 720 | src_sg.offset = src_offset; | 
| 718 | src_sg.length = size; | 721 | src_sg.length = size; | 
| 719 | dst_sg.page = dst_page; | 722 | sg_set_page(&dst_sg, dst_page); | 
| 720 | dst_sg.offset = dst_offset; | 723 | dst_sg.offset = dst_offset; | 
| 721 | dst_sg.length = size; | 724 | dst_sg.length = size; | 
| 722 | return encrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv); | 725 | return encrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv); | 
| @@ -742,10 +745,13 @@ ecryptfs_decrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 742 | { | 745 | { | 
| 743 | struct scatterlist src_sg, dst_sg; | 746 | struct scatterlist src_sg, dst_sg; | 
| 744 | 747 | ||
| 745 | src_sg.page = src_page; | 748 | sg_init_table(&src_sg, 1); | 
| 749 | sg_init_table(&dst_sg, 1); | ||
| 750 | |||
| 751 | sg_set_page(&src_sg, src_page); | ||
| 746 | src_sg.offset = src_offset; | 752 | src_sg.offset = src_offset; | 
| 747 | src_sg.length = size; | 753 | src_sg.length = size; | 
| 748 | dst_sg.page = dst_page; | 754 | sg_set_page(&dst_sg, dst_page); | 
| 749 | dst_sg.offset = dst_offset; | 755 | dst_sg.offset = dst_offset; | 
| 750 | dst_sg.length = size; | 756 | dst_sg.length = size; | 
| 751 | return decrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv); | 757 | return decrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv); | 
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 89d9710dd63d..263fed88c0ca 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c  | |||
| @@ -1040,6 +1040,9 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1040 | }; | 1040 | }; | 
| 1041 | int rc = 0; | 1041 | int rc = 0; | 
| 1042 | 1042 | ||
| 1043 | sg_init_table(&dst_sg, 1); | ||
| 1044 | sg_init_table(&src_sg, 1); | ||
| 1045 | |||
| 1043 | if (unlikely(ecryptfs_verbosity > 0)) { | 1046 | if (unlikely(ecryptfs_verbosity > 0)) { | 
| 1044 | ecryptfs_printk( | 1047 | ecryptfs_printk( | 
| 1045 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", | 1048 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", | 
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index ebd03cc07479..6f03918018a3 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c  | |||
| @@ -88,7 +88,7 @@ nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname) | |||
| 88 | { | 88 | { | 
| 89 | struct xdr_netobj cksum; | 89 | struct xdr_netobj cksum; | 
| 90 | struct hash_desc desc; | 90 | struct hash_desc desc; | 
| 91 | struct scatterlist sg[1]; | 91 | struct scatterlist sg; | 
| 92 | __be32 status = nfserr_resource; | 92 | __be32 status = nfserr_resource; | 
| 93 | 93 | ||
| 94 | dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n", | 94 | dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n", | 
| @@ -102,11 +102,9 @@ nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname) | |||
| 102 | if (cksum.data == NULL) | 102 | if (cksum.data == NULL) | 
| 103 | goto out; | 103 | goto out; | 
| 104 | 104 | ||
| 105 | sg[0].page = virt_to_page(clname->data); | 105 | sg_init_one(&sg, clname->data, clname->len); | 
| 106 | sg[0].offset = offset_in_page(clname->data); | ||
| 107 | sg[0].length = clname->len; | ||
| 108 | 106 | ||
| 109 | if (crypto_hash_digest(&desc, sg, sg->length, cksum.data)) | 107 | if (crypto_hash_digest(&desc, &sg, sg.length, cksum.data)) | 
| 110 | goto out; | 108 | goto out; | 
| 111 | 109 | ||
| 112 | md5_to_hex(dname, cksum.data); | 110 | md5_to_hex(dname, cksum.data); | 
diff --git a/include/asm-alpha/scatterlist.h b/include/asm-alpha/scatterlist.h index 917365405e83..440747ca6349 100644 --- a/include/asm-alpha/scatterlist.h +++ b/include/asm-alpha/scatterlist.h  | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | #include <asm/types.h> | 5 | #include <asm/types.h> | 
| 6 | 6 | ||
| 7 | struct scatterlist { | 7 | struct scatterlist { | 
| 8 | struct page *page; | 8 | #ifdef CONFIG_DEBUG_SG | 
| 9 | unsigned long sg_magic; | ||
| 10 | #endif | ||
| 11 | unsigned long page_link; | ||
| 9 | unsigned int offset; | 12 | unsigned int offset; | 
| 10 | 13 | ||
| 11 | unsigned int length; | 14 | unsigned int length; | 
diff --git a/include/asm-arm/scatterlist.h b/include/asm-arm/scatterlist.h index de2f65eb42ed..ca0a37d03400 100644 --- a/include/asm-arm/scatterlist.h +++ b/include/asm-arm/scatterlist.h  | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | #include <asm/types.h> | 5 | #include <asm/types.h> | 
| 6 | 6 | ||
| 7 | struct scatterlist { | 7 | struct scatterlist { | 
| 8 | struct page *page; /* buffer page */ | 8 | #ifdef CONFIG_DEBUG_SG | 
| 9 | unsigned long sg_magic; | ||
| 10 | #endif | ||
| 11 | unsigned long page_link; | ||
| 9 | unsigned int offset; /* buffer offset */ | 12 | unsigned int offset; /* buffer offset */ | 
| 10 | dma_addr_t dma_address; /* dma address */ | 13 | dma_addr_t dma_address; /* dma address */ | 
| 11 | unsigned int length; /* length */ | 14 | unsigned int length; /* length */ | 
diff --git a/include/asm-avr32/scatterlist.h b/include/asm-avr32/scatterlist.h index c6d5ce3b3a25..377320e3bd17 100644 --- a/include/asm-avr32/scatterlist.h +++ b/include/asm-avr32/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-blackfin/scatterlist.h b/include/asm-blackfin/scatterlist.h index 60e07b92044c..32128d53469b 100644 --- a/include/asm-blackfin/scatterlist.h +++ b/include/asm-blackfin/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-cris/scatterlist.h b/include/asm-cris/scatterlist.h index 4bdc44c4ac3d..faff53ad1f96 100644 --- a/include/asm-cris/scatterlist.h +++ b/include/asm-cris/scatterlist.h  | |||
| @@ -2,11 +2,14 @@ | |||
| 2 | #define __ASM_CRIS_SCATTERLIST_H | 2 | #define __ASM_CRIS_SCATTERLIST_H | 
| 3 | 3 | ||
| 4 | struct scatterlist { | 4 | struct scatterlist { | 
| 5 | #ifdef CONFIG_DEBUG_SG | ||
| 6 | unsigned long sg_magic; | ||
| 7 | #endif | ||
| 5 | char * address; /* Location data is to be transferred to */ | 8 | char * address; /* Location data is to be transferred to */ | 
| 6 | unsigned int length; | 9 | unsigned int length; | 
| 7 | 10 | ||
| 8 | /* The following is i386 highmem junk - not used by us */ | 11 | /* The following is i386 highmem junk - not used by us */ | 
| 9 | struct page * page; /* Location for highmem page, if any */ | 12 | unsigned long page_link; | 
| 10 | unsigned int offset;/* for highmem, page offset */ | 13 | unsigned int offset;/* for highmem, page offset */ | 
| 11 | 14 | ||
| 12 | }; | 15 | }; | 
diff --git a/include/asm-frv/scatterlist.h b/include/asm-frv/scatterlist.h index 8e827fa853f1..f7da007b763c 100644 --- a/include/asm-frv/scatterlist.h +++ b/include/asm-frv/scatterlist.h  | |||
| @@ -22,7 +22,10 @@ | |||
| 22 | * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens | 22 | * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens | 
| 23 | */ | 23 | */ | 
| 24 | struct scatterlist { | 24 | struct scatterlist { | 
| 25 | struct page *page; /* Location for highmem page, if any */ | 25 | #ifdef CONFIG_DEBUG_SG | 
| 26 | unsigned long sg_magic; | ||
| 27 | #endif | ||
| 28 | unsigned long page_link; | ||
| 26 | unsigned int offset; /* for highmem, page offset */ | 29 | unsigned int offset; /* for highmem, page offset */ | 
| 27 | 30 | ||
| 28 | dma_addr_t dma_address; | 31 | dma_addr_t dma_address; | 
diff --git a/include/asm-h8300/scatterlist.h b/include/asm-h8300/scatterlist.h index 985fdf54eaca..d3ecdd87ac90 100644 --- a/include/asm-h8300/scatterlist.h +++ b/include/asm-h8300/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-ia64/scatterlist.h b/include/asm-ia64/scatterlist.h index 7d5234d50312..d6f57874041d 100644 --- a/include/asm-ia64/scatterlist.h +++ b/include/asm-ia64/scatterlist.h  | |||
| @@ -9,7 +9,10 @@ | |||
| 9 | #include <asm/types.h> | 9 | #include <asm/types.h> | 
| 10 | 10 | ||
| 11 | struct scatterlist { | 11 | struct scatterlist { | 
| 12 | struct page *page; | 12 | #ifdef CONFIG_DEBUG_SG | 
| 13 | unsigned long sg_magic; | ||
| 14 | #endif | ||
| 15 | unsigned long page_link; | ||
| 13 | unsigned int offset; | 16 | unsigned int offset; | 
| 14 | unsigned int length; /* buffer length */ | 17 | unsigned int length; /* buffer length */ | 
| 15 | 18 | ||
diff --git a/include/asm-m32r/scatterlist.h b/include/asm-m32r/scatterlist.h index 352415ff5eb9..1ed372c73d0b 100644 --- a/include/asm-m32r/scatterlist.h +++ b/include/asm-m32r/scatterlist.h  | |||
| @@ -4,9 +4,12 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | #ifdef CONFIG_DEBUG_SG | ||
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 7 | char * address; /* Location data is to be transferred to, NULL for | 10 | char * address; /* Location data is to be transferred to, NULL for | 
| 8 | * highmem page */ | 11 | * highmem page */ | 
| 9 | struct page * page; /* Location for highmem page, if any */ | 12 | unsigned long page_link; | 
| 10 | unsigned int offset;/* for highmem, page offset */ | 13 | unsigned int offset;/* for highmem, page offset */ | 
| 11 | 14 | ||
| 12 | dma_addr_t dma_address; | 15 | dma_addr_t dma_address; | 
diff --git a/include/asm-m68k/scatterlist.h b/include/asm-m68k/scatterlist.h index 24887a2d9c7b..d3a7a0edfeca 100644 --- a/include/asm-m68k/scatterlist.h +++ b/include/asm-m68k/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | unsigned int length; | 12 | unsigned int length; | 
| 10 | 13 | ||
diff --git a/include/asm-m68knommu/scatterlist.h b/include/asm-m68knommu/scatterlist.h index 4da79d3d3f34..10942840e88f 100644 --- a/include/asm-m68knommu/scatterlist.h +++ b/include/asm-m68knommu/scatterlist.h  | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | #include <asm/types.h> | 5 | #include <asm/types.h> | 
| 6 | 6 | ||
| 7 | struct scatterlist { | 7 | struct scatterlist { | 
| 8 | struct page *page; | 8 | #ifdef CONFIG_DEBUG_SG | 
| 9 | unsigned long sg_magic; | ||
| 10 | #endif | ||
| 11 | unsigned long page_link; | ||
| 9 | unsigned int offset; | 12 | unsigned int offset; | 
| 10 | dma_addr_t dma_address; | 13 | dma_addr_t dma_address; | 
| 11 | unsigned int length; | 14 | unsigned int length; | 
diff --git a/include/asm-mips/scatterlist.h b/include/asm-mips/scatterlist.h index 7af104c95b20..83d69fe17c9f 100644 --- a/include/asm-mips/scatterlist.h +++ b/include/asm-mips/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page * page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-parisc/scatterlist.h b/include/asm-parisc/scatterlist.h index e7211c748446..cd3cfdf82289 100644 --- a/include/asm-parisc/scatterlist.h +++ b/include/asm-parisc/scatterlist.h  | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | #include <asm/types.h> | 5 | #include <asm/types.h> | 
| 6 | 6 | ||
| 7 | struct scatterlist { | 7 | struct scatterlist { | 
| 8 | struct page *page; | 8 | #ifdef CONFIG_DEBUG_SG | 
| 9 | unsigned long sg_magic; | ||
| 10 | #endif | ||
| 11 | unsigned long page_link; | ||
| 9 | unsigned int offset; | 12 | unsigned int offset; | 
| 10 | 13 | ||
| 11 | unsigned int length; | 14 | unsigned int length; | 
diff --git a/include/asm-powerpc/scatterlist.h b/include/asm-powerpc/scatterlist.h index b075f619c3b7..fcf7d55afe45 100644 --- a/include/asm-powerpc/scatterlist.h +++ b/include/asm-powerpc/scatterlist.h  | |||
| @@ -14,7 +14,10 @@ | |||
| 14 | #include <asm/dma.h> | 14 | #include <asm/dma.h> | 
| 15 | 15 | ||
| 16 | struct scatterlist { | 16 | struct scatterlist { | 
| 17 | struct page *page; | 17 | #ifdef CONFIG_DEBUG_SG | 
| 18 | unsigned long sg_magic; | ||
| 19 | #endif | ||
| 20 | unsigned long page_link; | ||
| 18 | unsigned int offset; | 21 | unsigned int offset; | 
| 19 | unsigned int length; | 22 | unsigned int length; | 
| 20 | 23 | ||
diff --git a/include/asm-s390/scatterlist.h b/include/asm-s390/scatterlist.h index a43b3afc5e2d..29ec8e28c8df 100644 --- a/include/asm-s390/scatterlist.h +++ b/include/asm-s390/scatterlist.h  | |||
| @@ -2,7 +2,10 @@ | |||
| 2 | #define _ASMS390_SCATTERLIST_H | 2 | #define _ASMS390_SCATTERLIST_H | 
| 3 | 3 | ||
| 4 | struct scatterlist { | 4 | struct scatterlist { | 
| 5 | struct page *page; | 5 | #ifdef CONFIG_DEBUG_SG | 
| 6 | unsigned long sg_magic; | ||
| 7 | #endif | ||
| 8 | unsigned long page_link; | ||
| 6 | unsigned int offset; | 9 | unsigned int offset; | 
| 7 | unsigned int length; | 10 | unsigned int length; | 
| 8 | }; | 11 | }; | 
diff --git a/include/asm-sh/scatterlist.h b/include/asm-sh/scatterlist.h index b9ae53c38365..a7d0d1856a99 100644 --- a/include/asm-sh/scatterlist.h +++ b/include/asm-sh/scatterlist.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page * page; /* Location for highmem page, if any */ | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset;/* for highmem, page offset */ | 11 | unsigned int offset;/* for highmem, page offset */ | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-sh64/scatterlist.h b/include/asm-sh64/scatterlist.h index 1c723f2d7a95..5109251970e7 100644 --- a/include/asm-sh64/scatterlist.h +++ b/include/asm-sh64/scatterlist.h  | |||
| @@ -14,7 +14,10 @@ | |||
| 14 | #include <asm/types.h> | 14 | #include <asm/types.h> | 
| 15 | 15 | ||
| 16 | struct scatterlist { | 16 | struct scatterlist { | 
| 17 | struct page * page; /* Location for highmem page, if any */ | 17 | #ifdef CONFIG_DEBUG_SG | 
| 18 | unsigned long sg_magic; | ||
| 19 | #endif | ||
| 20 | unsigned long page_link; | ||
| 18 | unsigned int offset;/* for highmem, page offset */ | 21 | unsigned int offset;/* for highmem, page offset */ | 
| 19 | dma_addr_t dma_address; | 22 | dma_addr_t dma_address; | 
| 20 | unsigned int length; | 23 | unsigned int length; | 
diff --git a/include/asm-sparc/scatterlist.h b/include/asm-sparc/scatterlist.h index 4055af90ad7e..e08d3d775b08 100644 --- a/include/asm-sparc/scatterlist.h +++ b/include/asm-sparc/scatterlist.h  | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | #include <linux/types.h> | 5 | #include <linux/types.h> | 
| 6 | 6 | ||
| 7 | struct scatterlist { | 7 | struct scatterlist { | 
| 8 | struct page *page; | 8 | #ifdef CONFIG_DEBUG_SG | 
| 9 | unsigned long sg_magic; | ||
| 10 | #endif | ||
| 11 | unsigned long page_link; | ||
| 9 | unsigned int offset; | 12 | unsigned int offset; | 
| 10 | 13 | ||
| 11 | unsigned int length; | 14 | unsigned int length; | 
diff --git a/include/asm-sparc64/scatterlist.h b/include/asm-sparc64/scatterlist.h index 703c5bbe6c8c..6df23f070b1a 100644 --- a/include/asm-sparc64/scatterlist.h +++ b/include/asm-sparc64/scatterlist.h  | |||
| @@ -6,7 +6,10 @@ | |||
| 6 | #include <asm/types.h> | 6 | #include <asm/types.h> | 
| 7 | 7 | ||
| 8 | struct scatterlist { | 8 | struct scatterlist { | 
| 9 | struct page *page; | 9 | #ifdef CONFIG_DEBUG_SG | 
| 10 | unsigned long sg_magic; | ||
| 11 | #endif | ||
| 12 | unsigned long page_link; | ||
| 10 | unsigned int offset; | 13 | unsigned int offset; | 
| 11 | 14 | ||
| 12 | unsigned int length; | 15 | unsigned int length; | 
diff --git a/include/asm-v850/scatterlist.h b/include/asm-v850/scatterlist.h index 56f402920db9..02d27b3fb061 100644 --- a/include/asm-v850/scatterlist.h +++ b/include/asm-v850/scatterlist.h  | |||
| @@ -17,7 +17,10 @@ | |||
| 17 | #include <asm/types.h> | 17 | #include <asm/types.h> | 
| 18 | 18 | ||
| 19 | struct scatterlist { | 19 | struct scatterlist { | 
| 20 | struct page *page; | 20 | #ifdef CONFIG_DEBUG_SG | 
| 21 | unsigned long sg_magic; | ||
| 22 | #endif | ||
| 23 | unsigned long page_link; | ||
| 21 | unsigned offset; | 24 | unsigned offset; | 
| 22 | dma_addr_t dma_address; | 25 | dma_addr_t dma_address; | 
| 23 | unsigned length; | 26 | unsigned length; | 
diff --git a/include/asm-x86/dma-mapping_32.h b/include/asm-x86/dma-mapping_32.h index 6a2d26cb5da6..55f01bd9e556 100644 --- a/include/asm-x86/dma-mapping_32.h +++ b/include/asm-x86/dma-mapping_32.h  | |||
| @@ -45,9 +45,9 @@ dma_map_sg(struct device *dev, struct scatterlist *sglist, int nents, | |||
| 45 | WARN_ON(nents == 0 || sglist[0].length == 0); | 45 | WARN_ON(nents == 0 || sglist[0].length == 0); | 
| 46 | 46 | ||
| 47 | for_each_sg(sglist, sg, nents, i) { | 47 | for_each_sg(sglist, sg, nents, i) { | 
| 48 | BUG_ON(!sg->page); | 48 | BUG_ON(!sg_page(sg)); | 
| 49 | 49 | ||
| 50 | sg->dma_address = page_to_phys(sg->page) + sg->offset; | 50 | sg->dma_address = sg_phys(sg); | 
| 51 | } | 51 | } | 
| 52 | 52 | ||
| 53 | flush_write_buffers(); | 53 | flush_write_buffers(); | 
diff --git a/include/asm-x86/scatterlist_32.h b/include/asm-x86/scatterlist_32.h index bd5164aa8f63..0e7d997a34be 100644 --- a/include/asm-x86/scatterlist_32.h +++ b/include/asm-x86/scatterlist_32.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | dma_addr_t dma_address; | 12 | dma_addr_t dma_address; | 
| 10 | unsigned int length; | 13 | unsigned int length; | 
diff --git a/include/asm-x86/scatterlist_64.h b/include/asm-x86/scatterlist_64.h index ef3986ba4b79..1847c72befeb 100644 --- a/include/asm-x86/scatterlist_64.h +++ b/include/asm-x86/scatterlist_64.h  | |||
| @@ -4,7 +4,10 @@ | |||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { | 
| 7 | struct page *page; | 7 | #ifdef CONFIG_DEBUG_SG | 
| 8 | unsigned long sg_magic; | ||
| 9 | #endif | ||
| 10 | unsigned long page_link; | ||
| 8 | unsigned int offset; | 11 | unsigned int offset; | 
| 9 | unsigned int length; | 12 | unsigned int length; | 
| 10 | dma_addr_t dma_address; | 13 | dma_addr_t dma_address; | 
diff --git a/include/asm-xtensa/scatterlist.h b/include/asm-xtensa/scatterlist.h index ca337a294290..810080bb0a2b 100644 --- a/include/asm-xtensa/scatterlist.h +++ b/include/asm-xtensa/scatterlist.h  | |||
| @@ -14,7 +14,10 @@ | |||
| 14 | #include <asm/types.h> | 14 | #include <asm/types.h> | 
| 15 | 15 | ||
| 16 | struct scatterlist { | 16 | struct scatterlist { | 
| 17 | struct page *page; | 17 | #ifdef CONFIG_DEBUG_SG | 
| 18 | unsigned long sg_magic; | ||
| 19 | #endif | ||
| 20 | unsigned long page_link; | ||
| 18 | unsigned int offset; | 21 | unsigned int offset; | 
| 19 | dma_addr_t dma_address; | 22 | dma_addr_t dma_address; | 
| 20 | unsigned int length; | 23 | unsigned int length; | 
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 2dc7464cce52..42daf5e15265 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h  | |||
| @@ -4,47 +4,95 @@ | |||
| 4 | #include <asm/scatterlist.h> | 4 | #include <asm/scatterlist.h> | 
| 5 | #include <linux/mm.h> | 5 | #include <linux/mm.h> | 
| 6 | #include <linux/string.h> | 6 | #include <linux/string.h> | 
| 7 | #include <asm/io.h> | ||
| 7 | 8 | ||
| 9 | /* | ||
| 10 | * Notes on SG table design. | ||
| 11 | * | ||
| 12 | * Architectures must provide an unsigned long page_link field in the | ||
| 13 | * scatterlist struct. We use that to place the page pointer AND encode | ||
| 14 | * information about the sg table as well. The two lower bits are reserved | ||
| 15 | * for this information. | ||
| 16 | * | ||
| 17 | * If bit 0 is set, then the page_link contains a pointer to the next sg | ||
| 18 | * table list. Otherwise the next entry is at sg + 1. | ||
| 19 | * | ||
| 20 | * If bit 1 is set, then this sg entry is the last element in a list. | ||
| 21 | * | ||
| 22 | * See sg_next(). | ||
| 23 | * | ||
| 24 | */ | ||
| 25 | |||
| 26 | #define SG_MAGIC 0x87654321 | ||
| 27 | |||
| 28 | /** | ||
| 29 | * sg_set_page - Set sg entry to point at given page | ||
| 30 | * @sg: SG entry | ||
| 31 | * @page: The page | ||
| 32 | * | ||
| 33 | * Description: | ||
| 34 | * Use this function to set an sg entry pointing at a page, never assign | ||
| 35 | * the page directly. We encode sg table information in the lower bits | ||
| 36 | * of the page pointer. See sg_page() for looking up the page belonging | ||
| 37 | * to an sg entry. | ||
| 38 | * | ||
| 39 | **/ | ||
| 40 | static inline void sg_set_page(struct scatterlist *sg, struct page *page) | ||
| 41 | { | ||
| 42 | unsigned long page_link = sg->page_link & 0x3; | ||
| 43 | |||
| 44 | #ifdef CONFIG_DEBUG_SG | ||
| 45 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
| 46 | #endif | ||
| 47 | sg->page_link = page_link | (unsigned long) page; | ||
| 48 | } | ||
| 49 | |||
| 50 | #define sg_page(sg) ((struct page *) ((sg)->page_link & ~0x3)) | ||
| 51 | |||
| 52 | /** | ||
| 53 | * sg_set_buf - Set sg entry to point at given data | ||
| 54 | * @sg: SG entry | ||
| 55 | * @buf: Data | ||
| 56 | * @buflen: Data length | ||
| 57 | * | ||
| 58 | **/ | ||
| 8 | static inline void sg_set_buf(struct scatterlist *sg, const void *buf, | 59 | static inline void sg_set_buf(struct scatterlist *sg, const void *buf, | 
| 9 | unsigned int buflen) | 60 | unsigned int buflen) | 
| 10 | { | 61 | { | 
| 11 | sg->page = virt_to_page(buf); | 62 | sg_set_page(sg, virt_to_page(buf)); | 
| 12 | sg->offset = offset_in_page(buf); | 63 | sg->offset = offset_in_page(buf); | 
| 13 | sg->length = buflen; | 64 | sg->length = buflen; | 
| 14 | } | 65 | } | 
| 15 | 66 | ||
| 16 | static inline void sg_init_one(struct scatterlist *sg, const void *buf, | ||
| 17 | unsigned int buflen) | ||
| 18 | { | ||
| 19 | memset(sg, 0, sizeof(*sg)); | ||
| 20 | sg_set_buf(sg, buf, buflen); | ||
| 21 | } | ||
| 22 | |||
| 23 | /* | 67 | /* | 
| 24 | * We overload the LSB of the page pointer to indicate whether it's | 68 | * We overload the LSB of the page pointer to indicate whether it's | 
| 25 | * a valid sg entry, or whether it points to the start of a new scatterlist. | 69 | * a valid sg entry, or whether it points to the start of a new scatterlist. | 
| 26 | * Those low bits are there for everyone! (thanks mason :-) | 70 | * Those low bits are there for everyone! (thanks mason :-) | 
| 27 | */ | 71 | */ | 
| 28 | #define sg_is_chain(sg) ((unsigned long) (sg)->page & 0x01) | 72 | #define sg_is_chain(sg) ((sg)->page_link & 0x01) | 
| 73 | #define sg_is_last(sg) ((sg)->page_link & 0x02) | ||
| 29 | #define sg_chain_ptr(sg) \ | 74 | #define sg_chain_ptr(sg) \ | 
| 30 | ((struct scatterlist *) ((unsigned long) (sg)->page & ~0x01)) | 75 | ((struct scatterlist *) ((sg)->page_link & ~0x03)) | 
| 31 | 76 | ||
| 32 | /** | 77 | /** | 
| 33 | * sg_next - return the next scatterlist entry in a list | 78 | * sg_next - return the next scatterlist entry in a list | 
| 34 | * @sg: The current sg entry | 79 | * @sg: The current sg entry | 
| 35 | * | 80 | * | 
| 36 | * Usually the next entry will be @sg@ + 1, but if this sg element is part | 81 | * Description: | 
| 37 | * of a chained scatterlist, it could jump to the start of a new | 82 | * Usually the next entry will be @sg@ + 1, but if this sg element is part | 
| 38 | * scatterlist array. | 83 | * of a chained scatterlist, it could jump to the start of a new | 
| 39 | * | 84 | * scatterlist array. | 
| 40 | * Note that the caller must ensure that there are further entries after | ||
| 41 | * the current entry, this function will NOT return NULL for an end-of-list. | ||
| 42 | * | 85 | * | 
| 43 | */ | 86 | **/ | 
| 44 | static inline struct scatterlist *sg_next(struct scatterlist *sg) | 87 | static inline struct scatterlist *sg_next(struct scatterlist *sg) | 
| 45 | { | 88 | { | 
| 46 | sg++; | 89 | #ifdef CONFIG_DEBUG_SG | 
| 90 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
| 91 | #endif | ||
| 92 | if (sg_is_last(sg)) | ||
| 93 | return NULL; | ||
| 47 | 94 | ||
| 95 | sg++; | ||
| 48 | if (unlikely(sg_is_chain(sg))) | 96 | if (unlikely(sg_is_chain(sg))) | 
| 49 | sg = sg_chain_ptr(sg); | 97 | sg = sg_chain_ptr(sg); | 
| 50 | 98 | ||
| @@ -62,14 +110,15 @@ static inline struct scatterlist *sg_next(struct scatterlist *sg) | |||
| 62 | * @sgl: First entry in the scatterlist | 110 | * @sgl: First entry in the scatterlist | 
| 63 | * @nents: Number of entries in the scatterlist | 111 | * @nents: Number of entries in the scatterlist | 
| 64 | * | 112 | * | 
| 65 | * Should only be used casually, it (currently) scan the entire list | 113 | * Description: | 
| 66 | * to get the last entry. | 114 | * Should only be used casually, it (currently) scan the entire list | 
| 115 | * to get the last entry. | ||
| 67 | * | 116 | * | 
| 68 | * Note that the @sgl@ pointer passed in need not be the first one, | 117 | * Note that the @sgl@ pointer passed in need not be the first one, | 
| 69 | * the important bit is that @nents@ denotes the number of entries that | 118 | * the important bit is that @nents@ denotes the number of entries that | 
| 70 | * exist from @sgl@. | 119 | * exist from @sgl@. | 
| 71 | * | 120 | * | 
| 72 | */ | 121 | **/ | 
| 73 | static inline struct scatterlist *sg_last(struct scatterlist *sgl, | 122 | static inline struct scatterlist *sg_last(struct scatterlist *sgl, | 
| 74 | unsigned int nents) | 123 | unsigned int nents) | 
| 75 | { | 124 | { | 
| @@ -83,6 +132,10 @@ static inline struct scatterlist *sg_last(struct scatterlist *sgl, | |||
| 83 | ret = sg; | 132 | ret = sg; | 
| 84 | 133 | ||
| 85 | #endif | 134 | #endif | 
| 135 | #ifdef CONFIG_DEBUG_SG | ||
| 136 | BUG_ON(sgl[0].sg_magic != SG_MAGIC); | ||
| 137 | BUG_ON(!sg_is_last(ret)); | ||
| 138 | #endif | ||
| 86 | return ret; | 139 | return ret; | 
| 87 | } | 140 | } | 
| 88 | 141 | ||
| @@ -92,16 +145,111 @@ static inline struct scatterlist *sg_last(struct scatterlist *sgl, | |||
| 92 | * @prv_nents: Number of entries in prv | 145 | * @prv_nents: Number of entries in prv | 
| 93 | * @sgl: Second scatterlist | 146 | * @sgl: Second scatterlist | 
| 94 | * | 147 | * | 
| 95 | * Links @prv@ and @sgl@ together, to form a longer scatterlist. | 148 | * Description: | 
| 149 | * Links @prv@ and @sgl@ together, to form a longer scatterlist. | ||
| 96 | * | 150 | * | 
| 97 | */ | 151 | **/ | 
| 98 | static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, | 152 | static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, | 
| 99 | struct scatterlist *sgl) | 153 | struct scatterlist *sgl) | 
| 100 | { | 154 | { | 
| 101 | #ifndef ARCH_HAS_SG_CHAIN | 155 | #ifndef ARCH_HAS_SG_CHAIN | 
| 102 | BUG(); | 156 | BUG(); | 
| 103 | #endif | 157 | #endif | 
| 104 | prv[prv_nents - 1].page = (struct page *) ((unsigned long) sgl | 0x01); | 158 | prv[prv_nents - 1].page_link = (unsigned long) sgl | 0x01; | 
| 159 | } | ||
| 160 | |||
| 161 | /** | ||
| 162 | * sg_mark_end - Mark the end of the scatterlist | ||
| 163 | * @sgl: Scatterlist | ||
| 164 | * @nents: Number of entries in sgl | ||
| 165 | * | ||
| 166 | * Description: | ||
| 167 | * Marks the last entry as the termination point for sg_next() | ||
| 168 | * | ||
| 169 | **/ | ||
| 170 | static inline void sg_mark_end(struct scatterlist *sgl, unsigned int nents) | ||
| 171 | { | ||
| 172 | sgl[nents - 1].page_link = 0x02; | ||
| 173 | } | ||
| 174 | |||
| 175 | static inline void __sg_mark_end(struct scatterlist *sg) | ||
| 176 | { | ||
| 177 | sg->page_link |= 0x02; | ||
| 178 | } | ||
| 179 | |||
| 180 | /** | ||
| 181 | * sg_init_one - Initialize a single entry sg list | ||
| 182 | * @sg: SG entry | ||
| 183 | * @buf: Virtual address for IO | ||
| 184 | * @buflen: IO length | ||
| 185 | * | ||
| 186 | * Notes: | ||
| 187 | * This should not be used on a single entry that is part of a larger | ||
| 188 | * table. Use sg_init_table() for that. | ||
| 189 | * | ||
| 190 | **/ | ||
| 191 | static inline void sg_init_one(struct scatterlist *sg, const void *buf, | ||
| 192 | unsigned int buflen) | ||
| 193 | { | ||
| 194 | memset(sg, 0, sizeof(*sg)); | ||
| 195 | #ifdef CONFIG_DEBUG_SG | ||
| 196 | sg->sg_magic = SG_MAGIC; | ||
| 197 | #endif | ||
| 198 | sg_mark_end(sg, 1); | ||
| 199 | sg_set_buf(sg, buf, buflen); | ||
| 200 | } | ||
| 201 | |||
| 202 | /** | ||
| 203 | * sg_init_table - Initialize SG table | ||
| 204 | * @sgl: The SG table | ||
| 205 | * @nents: Number of entries in table | ||
| 206 | * | ||
| 207 | * Notes: | ||
| 208 | * If this is part of a chained sg table, sg_mark_end() should be | ||
| 209 | * used only on the last table part. | ||
| 210 | * | ||
| 211 | **/ | ||
| 212 | static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) | ||
| 213 | { | ||
| 214 | memset(sgl, 0, sizeof(*sgl) * nents); | ||
| 215 | sg_mark_end(sgl, nents); | ||
| 216 | #ifdef CONFIG_DEBUG_SG | ||
| 217 | { | ||
| 218 | int i; | ||
| 219 | for (i = 0; i < nents; i++) | ||
| 220 | sgl[i].sg_magic = SG_MAGIC; | ||
| 221 | } | ||
| 222 | #endif | ||
| 223 | } | ||
| 224 | |||
| 225 | /** | ||
| 226 | * sg_phys - Return physical address of an sg entry | ||
| 227 | * @sg: SG entry | ||
| 228 | * | ||
| 229 | * Description: | ||
| 230 | * This calls page_to_phys() on the page in this sg entry, and adds the | ||
| 231 | * sg offset. The caller must know that it is legal to call page_to_phys() | ||
| 232 | * on the sg page. | ||
| 233 | * | ||
| 234 | **/ | ||
| 235 | static inline unsigned long sg_phys(struct scatterlist *sg) | ||
| 236 | { | ||
| 237 | return page_to_phys(sg_page(sg)) + sg->offset; | ||
| 238 | } | ||
| 239 | |||
| 240 | /** | ||
| 241 | * sg_virt - Return virtual address of an sg entry | ||
| 242 | * @sg: SG entry | ||
| 243 | * | ||
| 244 | * Description: | ||
| 245 | * This calls page_address() on the page in this sg entry, and adds the | ||
| 246 | * sg offset. The caller must know that the sg page has a valid virtual | ||
| 247 | * mapping. | ||
| 248 | * | ||
| 249 | **/ | ||
| 250 | static inline void *sg_virt(struct scatterlist *sg) | ||
| 251 | { | ||
| 252 | return page_address(sg_page(sg)) + sg->offset; | ||
| 105 | } | 253 | } | 
| 106 | 254 | ||
| 107 | #endif /* _LINUX_SCATTERLIST_H */ | 255 | #endif /* _LINUX_SCATTERLIST_H */ | 
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index c567f219191d..1faa5087dc86 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug  | |||
| @@ -389,6 +389,16 @@ config DEBUG_LIST | |||
| 389 | 389 | ||
| 390 | If unsure, say N. | 390 | If unsure, say N. | 
| 391 | 391 | ||
| 392 | config DEBUG_SG | ||
| 393 | bool "Debug SG table operations" | ||
| 394 | depends on DEBUG_KERNEL | ||
| 395 | help | ||
| 396 | Enable this to turn on checks on scatter-gather tables. This can | ||
| 397 | help find problems with drivers that do not properly initialize | ||
| 398 | their sg tables. | ||
| 399 | |||
| 400 | If unsure, say N. | ||
| 401 | |||
| 392 | config FRAME_POINTER | 402 | config FRAME_POINTER | 
| 393 | bool "Compile the kernel with frame pointers" | 403 | bool "Compile the kernel with frame pointers" | 
| 394 | depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || S390 || AVR32 || SUPERH || BFIN) | 404 | depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || S390 || AVR32 || SUPERH || BFIN) | 
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 752fd95323f3..1a8050ade861 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c  | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | #define OFFSET(val,align) ((unsigned long) \ | 35 | #define OFFSET(val,align) ((unsigned long) \ | 
| 36 | ( (val) & ( (align) - 1))) | 36 | ( (val) & ( (align) - 1))) | 
| 37 | 37 | ||
| 38 | #define SG_ENT_VIRT_ADDRESS(sg) (page_address((sg)->page) + (sg)->offset) | 38 | #define SG_ENT_VIRT_ADDRESS(sg) (sg_virt((sg))) | 
| 39 | #define SG_ENT_PHYS_ADDRESS(sg) virt_to_bus(SG_ENT_VIRT_ADDRESS(sg)) | 39 | #define SG_ENT_PHYS_ADDRESS(sg) virt_to_bus(SG_ENT_VIRT_ADDRESS(sg)) | 
| 40 | 40 | ||
| 41 | /* | 41 | /* | 
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 70d9b5da96ae..4e2c84fcf276 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c  | |||
| @@ -2045,7 +2045,7 @@ skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len) | |||
| 2045 | if (copy > 0) { | 2045 | if (copy > 0) { | 
| 2046 | if (copy > len) | 2046 | if (copy > len) | 
| 2047 | copy = len; | 2047 | copy = len; | 
| 2048 | sg[elt].page = virt_to_page(skb->data + offset); | 2048 | sg_set_page(&sg[elt], virt_to_page(skb->data + offset)); | 
| 2049 | sg[elt].offset = (unsigned long)(skb->data + offset) % PAGE_SIZE; | 2049 | sg[elt].offset = (unsigned long)(skb->data + offset) % PAGE_SIZE; | 
| 2050 | sg[elt].length = copy; | 2050 | sg[elt].length = copy; | 
| 2051 | elt++; | 2051 | elt++; | 
| @@ -2065,7 +2065,7 @@ skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len) | |||
| 2065 | 2065 | ||
| 2066 | if (copy > len) | 2066 | if (copy > len) | 
| 2067 | copy = len; | 2067 | copy = len; | 
| 2068 | sg[elt].page = frag->page; | 2068 | sg_set_page(&sg[elt], frag->page); | 
| 2069 | sg[elt].offset = frag->page_offset+offset-start; | 2069 | sg[elt].offset = frag->page_offset+offset-start; | 
| 2070 | sg[elt].length = copy; | 2070 | sg[elt].length = copy; | 
| 2071 | elt++; | 2071 | elt++; | 
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 72e6ab66834f..c796661a021b 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c  | |||
| @@ -390,9 +390,7 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
| 390 | icv[3] = crc >> 24; | 390 | icv[3] = crc >> 24; | 
| 391 | 391 | ||
| 392 | crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); | 392 | crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); | 
| 393 | sg.page = virt_to_page(pos); | 393 | sg_init_one(&sg, pos, len + 4); | 
| 394 | sg.offset = offset_in_page(pos); | ||
| 395 | sg.length = len + 4; | ||
| 396 | return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); | 394 | return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); | 
| 397 | } | 395 | } | 
| 398 | 396 | ||
| @@ -485,9 +483,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
| 485 | plen = skb->len - hdr_len - 12; | 483 | plen = skb->len - hdr_len - 12; | 
| 486 | 484 | ||
| 487 | crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); | 485 | crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); | 
| 488 | sg.page = virt_to_page(pos); | 486 | sg_init_one(&sg, pos, plen + 4); | 
| 489 | sg.offset = offset_in_page(pos); | ||
| 490 | sg.length = plen + 4; | ||
| 491 | if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) { | 487 | if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) { | 
| 492 | if (net_ratelimit()) { | 488 | if (net_ratelimit()) { | 
| 493 | printk(KERN_DEBUG ": TKIP: failed to decrypt " | 489 | printk(KERN_DEBUG ": TKIP: failed to decrypt " | 
| @@ -539,11 +535,12 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr, | |||
| 539 | printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); | 535 | printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); | 
| 540 | return -1; | 536 | return -1; | 
| 541 | } | 537 | } | 
| 542 | sg[0].page = virt_to_page(hdr); | 538 | sg_init_table(sg, 2); | 
| 539 | sg_set_page(&sg[0], virt_to_page(hdr)); | ||
| 543 | sg[0].offset = offset_in_page(hdr); | 540 | sg[0].offset = offset_in_page(hdr); | 
| 544 | sg[0].length = 16; | 541 | sg[0].length = 16; | 
| 545 | 542 | ||
| 546 | sg[1].page = virt_to_page(data); | 543 | sg_set_page(&sg[1], virt_to_page(data)); | 
| 547 | sg[1].offset = offset_in_page(data); | 544 | sg[1].offset = offset_in_page(data); | 
| 548 | sg[1].length = data_len; | 545 | sg[1].length = data_len; | 
| 549 | 546 | ||
diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index 8d182459344e..0af6103d715c 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c  | |||
| @@ -170,9 +170,7 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
| 170 | icv[3] = crc >> 24; | 170 | icv[3] = crc >> 24; | 
| 171 | 171 | ||
| 172 | crypto_blkcipher_setkey(wep->tx_tfm, key, klen); | 172 | crypto_blkcipher_setkey(wep->tx_tfm, key, klen); | 
| 173 | sg.page = virt_to_page(pos); | 173 | sg_init_one(&sg, pos, len + 4); | 
| 174 | sg.offset = offset_in_page(pos); | ||
| 175 | sg.length = len + 4; | ||
| 176 | return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); | 174 | return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); | 
| 177 | } | 175 | } | 
| 178 | 176 | ||
| @@ -212,9 +210,7 @@ static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
| 212 | plen = skb->len - hdr_len - 8; | 210 | plen = skb->len - hdr_len - 8; | 
| 213 | 211 | ||
| 214 | crypto_blkcipher_setkey(wep->rx_tfm, key, klen); | 212 | crypto_blkcipher_setkey(wep->rx_tfm, key, klen); | 
| 215 | sg.page = virt_to_page(pos); | 213 | sg_init_one(&sg, pos, plen + 4); | 
| 216 | sg.offset = offset_in_page(pos); | ||
| 217 | sg.length = plen + 4; | ||
| 218 | if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) | 214 | if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) | 
| 219 | return -7; | 215 | return -7; | 
| 220 | 216 | ||
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c index 6675261e958f..cc806d640f7a 100644 --- a/net/mac80211/wep.c +++ b/net/mac80211/wep.c  | |||
| @@ -138,9 +138,7 @@ void ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key, | |||
| 138 | *icv = cpu_to_le32(~crc32_le(~0, data, data_len)); | 138 | *icv = cpu_to_le32(~crc32_le(~0, data, data_len)); | 
| 139 | 139 | ||
| 140 | crypto_blkcipher_setkey(tfm, rc4key, klen); | 140 | crypto_blkcipher_setkey(tfm, rc4key, klen); | 
| 141 | sg.page = virt_to_page(data); | 141 | sg_init_one(&sg, data, data_len + WEP_ICV_LEN); | 
| 142 | sg.offset = offset_in_page(data); | ||
| 143 | sg.length = data_len + WEP_ICV_LEN; | ||
| 144 | crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length); | 142 | crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length); | 
| 145 | } | 143 | } | 
| 146 | 144 | ||
| @@ -204,9 +202,7 @@ int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key, | |||
| 204 | __le32 crc; | 202 | __le32 crc; | 
| 205 | 203 | ||
| 206 | crypto_blkcipher_setkey(tfm, rc4key, klen); | 204 | crypto_blkcipher_setkey(tfm, rc4key, klen); | 
| 207 | sg.page = virt_to_page(data); | 205 | sg_init_one(&sg, data, data_len + WEP_ICV_LEN); | 
| 208 | sg.offset = offset_in_page(data); | ||
| 209 | sg.length = data_len + WEP_ICV_LEN; | ||
| 210 | crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length); | 206 | crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length); | 
| 211 | 207 | ||
| 212 | crc = cpu_to_le32(~crc32_le(~0, data, data_len)); | 208 | crc = cpu_to_le32(~crc32_le(~0, data, data_len)); | 
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index 781810724714..cbd64b216cce 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c  | |||
| @@ -726,7 +726,8 @@ void sctp_auth_calculate_hmac(const struct sctp_association *asoc, | |||
| 726 | 726 | ||
| 727 | /* set up scatter list */ | 727 | /* set up scatter list */ | 
| 728 | end = skb_tail_pointer(skb); | 728 | end = skb_tail_pointer(skb); | 
| 729 | sg.page = virt_to_page(auth); | 729 | sg_init_table(&sg, 1); | 
| 730 | sg_set_page(&sg, virt_to_page(auth)); | ||
| 730 | sg.offset = (unsigned long)(auth) % PAGE_SIZE; | 731 | sg.offset = (unsigned long)(auth) % PAGE_SIZE; | 
| 731 | sg.length = end - (unsigned char *)auth; | 732 | sg.length = end - (unsigned char *)auth; | 
| 732 | 733 | ||
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index f983a369d4e2..d5a9785a158b 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c  | |||
| @@ -1513,7 +1513,8 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
| 1513 | struct hash_desc desc; | 1513 | struct hash_desc desc; | 
| 1514 | 1514 | ||
| 1515 | /* Sign the message. */ | 1515 | /* Sign the message. */ | 
| 1516 | sg.page = virt_to_page(&cookie->c); | 1516 | sg_init_table(&sg, 1); | 
| 1517 | sg_set_page(&sg, virt_to_page(&cookie->c)); | ||
| 1517 | sg.offset = (unsigned long)(&cookie->c) % PAGE_SIZE; | 1518 | sg.offset = (unsigned long)(&cookie->c) % PAGE_SIZE; | 
| 1518 | sg.length = bodysize; | 1519 | sg.length = bodysize; | 
| 1519 | keylen = SCTP_SECRET_SIZE; | 1520 | keylen = SCTP_SECRET_SIZE; | 
| @@ -1585,7 +1586,8 @@ struct sctp_association *sctp_unpack_cookie( | |||
| 1585 | 1586 | ||
| 1586 | /* Check the signature. */ | 1587 | /* Check the signature. */ | 
| 1587 | keylen = SCTP_SECRET_SIZE; | 1588 | keylen = SCTP_SECRET_SIZE; | 
| 1588 | sg.page = virt_to_page(bear_cookie); | 1589 | sg_init_table(&sg, 1); | 
| 1590 | sg_set_page(&sg, virt_to_page(bear_cookie)); | ||
| 1589 | sg.offset = (unsigned long)(bear_cookie) % PAGE_SIZE; | 1591 | sg.offset = (unsigned long)(bear_cookie) % PAGE_SIZE; | 
| 1590 | sg.length = bodysize; | 1592 | sg.length = bodysize; | 
| 1591 | key = (char *)ep->secret_key[ep->current_key]; | 1593 | key = (char *)ep->secret_key[ep->current_key]; | 
diff --git a/net/sunrpc/auth_gss/gss_krb5_crypto.c b/net/sunrpc/auth_gss/gss_krb5_crypto.c index bfb6a29633dd..32be431affcf 100644 --- a/net/sunrpc/auth_gss/gss_krb5_crypto.c +++ b/net/sunrpc/auth_gss/gss_krb5_crypto.c  | |||
| @@ -197,9 +197,9 @@ encryptor(struct scatterlist *sg, void *data) | |||
| 197 | int i = (page_pos + outbuf->page_base) >> PAGE_CACHE_SHIFT; | 197 | int i = (page_pos + outbuf->page_base) >> PAGE_CACHE_SHIFT; | 
| 198 | in_page = desc->pages[i]; | 198 | in_page = desc->pages[i]; | 
| 199 | } else { | 199 | } else { | 
| 200 | in_page = sg->page; | 200 | in_page = sg_page(sg); | 
| 201 | } | 201 | } | 
| 202 | desc->infrags[desc->fragno].page = in_page; | 202 | sg_set_page(&desc->infrags[desc->fragno], in_page); | 
| 203 | desc->fragno++; | 203 | desc->fragno++; | 
| 204 | desc->fraglen += sg->length; | 204 | desc->fraglen += sg->length; | 
| 205 | desc->pos += sg->length; | 205 | desc->pos += sg->length; | 
| @@ -215,11 +215,11 @@ encryptor(struct scatterlist *sg, void *data) | |||
| 215 | if (ret) | 215 | if (ret) | 
| 216 | return ret; | 216 | return ret; | 
| 217 | if (fraglen) { | 217 | if (fraglen) { | 
| 218 | desc->outfrags[0].page = sg->page; | 218 | sg_set_page(&desc->outfrags[0], sg_page(sg)); | 
| 219 | desc->outfrags[0].offset = sg->offset + sg->length - fraglen; | 219 | desc->outfrags[0].offset = sg->offset + sg->length - fraglen; | 
| 220 | desc->outfrags[0].length = fraglen; | 220 | desc->outfrags[0].length = fraglen; | 
| 221 | desc->infrags[0] = desc->outfrags[0]; | 221 | desc->infrags[0] = desc->outfrags[0]; | 
| 222 | desc->infrags[0].page = in_page; | 222 | sg_set_page(&desc->infrags[0], in_page); | 
| 223 | desc->fragno = 1; | 223 | desc->fragno = 1; | 
| 224 | desc->fraglen = fraglen; | 224 | desc->fraglen = fraglen; | 
| 225 | } else { | 225 | } else { | 
| @@ -287,7 +287,7 @@ decryptor(struct scatterlist *sg, void *data) | |||
| 287 | if (ret) | 287 | if (ret) | 
| 288 | return ret; | 288 | return ret; | 
| 289 | if (fraglen) { | 289 | if (fraglen) { | 
| 290 | desc->frags[0].page = sg->page; | 290 | sg_set_page(&desc->frags[0], sg_page(sg)); | 
| 291 | desc->frags[0].offset = sg->offset + sg->length - fraglen; | 291 | desc->frags[0].offset = sg->offset + sg->length - fraglen; | 
| 292 | desc->frags[0].length = fraglen; | 292 | desc->frags[0].length = fraglen; | 
| 293 | desc->fragno = 1; | 293 | desc->fragno = 1; | 
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 6a59180e1667..3d1f7cdf9dd0 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c  | |||
| @@ -1059,7 +1059,7 @@ xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, | |||
| 1059 | do { | 1059 | do { | 
| 1060 | if (thislen > page_len) | 1060 | if (thislen > page_len) | 
| 1061 | thislen = page_len; | 1061 | thislen = page_len; | 
| 1062 | sg->page = buf->pages[i]; | 1062 | sg_set_page(sg, buf->pages[i]); | 
| 1063 | sg->offset = page_offset; | 1063 | sg->offset = page_offset; | 
| 1064 | sg->length = thislen; | 1064 | sg->length = thislen; | 
| 1065 | ret = actor(sg, data); | 1065 | ret = actor(sg, data); | 
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 5ced62c19c63..fb2220a719bd 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c  | |||
| @@ -552,7 +552,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc, | |||
| 552 | if (copy > len) | 552 | if (copy > len) | 
| 553 | copy = len; | 553 | copy = len; | 
| 554 | 554 | ||
| 555 | sg.page = virt_to_page(skb->data + offset); | 555 | sg_set_page(&sg, virt_to_page(skb->data + offset)); | 
| 556 | sg.offset = (unsigned long)(skb->data + offset) % PAGE_SIZE; | 556 | sg.offset = (unsigned long)(skb->data + offset) % PAGE_SIZE; | 
| 557 | sg.length = copy; | 557 | sg.length = copy; | 
| 558 | 558 | ||
| @@ -577,7 +577,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc, | |||
| 577 | if (copy > len) | 577 | if (copy > len) | 
| 578 | copy = len; | 578 | copy = len; | 
| 579 | 579 | ||
| 580 | sg.page = frag->page; | 580 | sg_set_page(&sg, frag->page); | 
| 581 | sg.offset = frag->page_offset + offset-start; | 581 | sg.offset = frag->page_offset + offset-start; | 
| 582 | sg.length = copy; | 582 | sg.length = copy; | 
| 583 | 583 | ||
