aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/uio/uio.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index cc246faa3590..2a77e9d42c68 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -417,30 +417,28 @@ static void uio_vma_close(struct vm_area_struct *vma)
417 idev->vma_count--; 417 idev->vma_count--;
418} 418}
419 419
420static struct page *uio_vma_nopage(struct vm_area_struct *vma, 420static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
421 unsigned long address, int *type)
422{ 421{
423 struct uio_device *idev = vma->vm_private_data; 422 struct uio_device *idev = vma->vm_private_data;
424 struct page* page = NOPAGE_SIGBUS; 423 struct page *page;
425 424
426 int mi = uio_find_mem_index(vma); 425 int mi = uio_find_mem_index(vma);
427 if (mi < 0) 426 if (mi < 0)
428 return page; 427 return VM_FAULT_SIGBUS;
429 428
430 if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL) 429 if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
431 page = virt_to_page(idev->info->mem[mi].addr); 430 page = virt_to_page(idev->info->mem[mi].addr);
432 else 431 else
433 page = vmalloc_to_page((void*)idev->info->mem[mi].addr); 432 page = vmalloc_to_page((void*)idev->info->mem[mi].addr);
434 get_page(page); 433 get_page(page);
435 if (type) 434 vmf->page = page;
436 *type = VM_FAULT_MINOR; 435 return 0;
437 return page;
438} 436}
439 437
440static struct vm_operations_struct uio_vm_ops = { 438static struct vm_operations_struct uio_vm_ops = {
441 .open = uio_vma_open, 439 .open = uio_vma_open,
442 .close = uio_vma_close, 440 .close = uio_vma_close,
443 .nopage = uio_vma_nopage, 441 .fault = uio_vma_fault,
444}; 442};
445 443
446static int uio_mmap_physical(struct vm_area_struct *vma) 444static int uio_mmap_physical(struct vm_area_struct *vma)