diff options
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 | ||