aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394/dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ieee1394/dma.c')
-rw-r--r--drivers/ieee1394/dma.c39
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 */ 234static int dma_region_pagefault(struct vm_area_struct *vma,
235 235 struct vm_fault *vmf)
236static 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
263static struct vm_operations_struct dma_region_vm_ops = { 250static 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