diff options
Diffstat (limited to 'drivers/ieee1394/dma.c')
| -rw-r--r-- | drivers/ieee1394/dma.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c index 7c4eb39b7024..73685e7dc7e4 100644 --- a/drivers/ieee1394/dma.c +++ b/drivers/ieee1394/dma.c | |||
| @@ -231,37 +231,24 @@ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, | |||
| 231 | 231 | ||
| 232 | #ifdef CONFIG_MMU | 232 | #ifdef CONFIG_MMU |
| 233 | 233 | ||
| 234 | /* nopage() handler for mmap access */ | 234 | static int dma_region_pagefault(struct vm_area_struct *vma, |
| 235 | 235 | struct vm_fault *vmf) | |
| 236 | static struct page *dma_region_pagefault(struct vm_area_struct *area, | ||
| 237 | unsigned long address, int *type) | ||
| 238 | { | 236 | { |
| 239 | unsigned long offset; | 237 | struct dma_region *dma = (struct dma_region *)vma->vm_private_data; |
| 240 | unsigned long kernel_virt_addr; | ||
| 241 | struct page *ret = NOPAGE_SIGBUS; | ||
| 242 | |||
| 243 | struct dma_region *dma = (struct dma_region *)area->vm_private_data; | ||
| 244 | 238 | ||
| 245 | if (!dma->kvirt) | 239 | if (!dma->kvirt) |
| 246 | goto out; | 240 | return VM_FAULT_SIGBUS; |
| 247 | 241 | ||
| 248 | if ((address < (unsigned long)area->vm_start) || | 242 | if (vmf->pgoff >= dma->n_pages) |
| 249 | (address > | 243 | return VM_FAULT_SIGBUS; |
| 250 | (unsigned long)area->vm_start + (dma->n_pages << PAGE_SHIFT))) | 244 | |
| 251 | goto out; | 245 | vmf->page = vmalloc_to_page(dma->kvirt + (vmf->pgoff << PAGE_SHIFT)); |
| 252 | 246 | get_page(vmf->page); | |
| 253 | if (type) | 247 | return 0; |
| 254 | *type = VM_FAULT_MINOR; | ||
| 255 | offset = address - area->vm_start; | ||
| 256 | kernel_virt_addr = (unsigned long)dma->kvirt + offset; | ||
| 257 | ret = vmalloc_to_page((void *)kernel_virt_addr); | ||
| 258 | get_page(ret); | ||
| 259 | out: | ||
| 260 | return ret; | ||
| 261 | } | 248 | } |
| 262 | 249 | ||
| 263 | static struct vm_operations_struct dma_region_vm_ops = { | 250 | static struct vm_operations_struct dma_region_vm_ops = { |
| 264 | .nopage = dma_region_pagefault, | 251 | .fault = dma_region_pagefault, |
| 265 | }; | 252 | }; |
| 266 | 253 | ||
| 267 | /** | 254 | /** |
| @@ -275,7 +262,7 @@ int dma_region_mmap(struct dma_region *dma, struct file *file, | |||
| 275 | if (!dma->kvirt) | 262 | if (!dma->kvirt) |
| 276 | return -EINVAL; | 263 | return -EINVAL; |
| 277 | 264 | ||
| 278 | /* must be page-aligned */ | 265 | /* must be page-aligned (XXX: comment is wrong, we could allow pgoff) */ |
| 279 | if (vma->vm_pgoff != 0) | 266 | if (vma->vm_pgoff != 0) |
| 280 | return -EINVAL; | 267 | return -EINVAL; |
| 281 | 268 | ||
