+++ /dev/null
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: kernel: don't check for pfn_valid() in uaccess_pt.c
-References: bnc#484767,LTC#52175
-
-Symptom: Access to xip mappings fails (-EFAULT).
-Problem: pfn_valid() actually checks for a valid struct page and
- not for a valid pfn. Using xip mappings w/o struct pages,
- this will result in -EFAULT returned by the (page table
- walk) user copy functions, even though there is valid memory.
-Solution: Those user copy functions don't need a struct page, so this
- patch just removes the pfn_valid() check.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- arch/s390/lib/uaccess_pt.c | 18 ------------------
- 1 file changed, 18 deletions(-)
-
-Index: linux-sles11/arch/s390/lib/uaccess_pt.c
-===================================================================
---- linux-sles11.orig/arch/s390/lib/uaccess_pt.c
-+++ linux-sles11/arch/s390/lib/uaccess_pt.c
-@@ -119,8 +119,6 @@ retry:
- goto fault;
-
- pfn = pte_pfn(*pte);
-- if (!pfn_valid(pfn))
-- goto out;
-
- offset = uaddr & (PAGE_SIZE - 1);
- size = min(n - done, PAGE_SIZE - offset);
-@@ -135,7 +133,6 @@ retry:
- done += size;
- uaddr += size;
- } while (done < n);
--out:
- spin_unlock(&mm->page_table_lock);
- return n - done;
- fault:
-@@ -163,9 +160,6 @@ retry:
- goto fault;
-
- pfn = pte_pfn(*pte);
-- if (!pfn_valid(pfn))
-- goto out;
--
- ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1));
- out:
- return ret;
-@@ -244,11 +238,6 @@ retry:
- goto fault;
-
- pfn = pte_pfn(*pte);
-- if (!pfn_valid(pfn)) {
-- done = -1;
-- goto out;
-- }
--
- offset = uaddr & (PAGE_SIZE-1);
- addr = (char *)(pfn << PAGE_SHIFT) + offset;
- len = min(count - done, PAGE_SIZE - offset);
-@@ -256,7 +245,6 @@ retry:
- done += len_str;
- uaddr += len_str;
- } while ((len_str == len) && (done < count));
--out:
- spin_unlock(&mm->page_table_lock);
- return done + 1;
- fault:
-@@ -325,12 +313,7 @@ retry:
- }
-
- pfn_from = pte_pfn(*pte_from);
-- if (!pfn_valid(pfn_from))
-- goto out;
- pfn_to = pte_pfn(*pte_to);
-- if (!pfn_valid(pfn_to))
-- goto out;
--
- offset_from = uaddr_from & (PAGE_SIZE-1);
- offset_to = uaddr_from & (PAGE_SIZE-1);
- offset_max = max(offset_from, offset_to);
-@@ -342,7 +325,6 @@ retry:
- uaddr_from += size;
- uaddr_to += size;
- } while (done < n);
--out:
- spin_unlock(&mm->page_table_lock);
- return n - done;
- fault: