From 016bf40f500e4fc9fb872e5e952ac02093fd65e8 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Tue, 21 Oct 2008 09:26:19 +0000
Subject: [PATCH] Fixed page fault handler.

---
 master/cdev.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/master/cdev.c b/master/cdev.c
index 4c765011..dcd81599 100644
--- a/master/cdev.c
+++ b/master/cdev.c
@@ -2612,21 +2612,24 @@ static int eccdev_vma_fault(
         struct vm_fault *vmf /**< Fault data. */
         )
 {
-    struct page *page;
+    unsigned long offset = vmf->pgoff << PAGE_SHIFT;
     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data;
+    struct page *page;
 
-    if (vmf->pgoff >= priv->process_data_size)
+    if (offset >= priv->process_data_size)
         return VM_FAULT_SIGBUS;
 
-    page = vmalloc_to_page(priv->process_data + vmf->pgoff);
-
-    if (priv->cdev->master->debug_level)
-        EC_DBG("Vma fault, address = %p, offset = %lu, page = %p\n",
-                vmf->virtual_address, vmf->pgoff, page);
+    page = vmalloc_to_page(priv->process_data + offset);
+    if (!page)
+        return VM_FAULT_SIGBUS;
 
     get_page(page);
     vmf->page = page;
-    vmf->flags = 0;
+
+    if (priv->cdev->master->debug_level)
+        EC_DBG("Vma fault, virtual_address = %p, offset = %lu, page = %p\n",
+                vmf->virtual_address, offset, page);
+
     return 0;
 }
 
-- 
GitLab