Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25591b07 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Martin Schwidefsky
Browse files

[S390] fix get_user_pages_fast



The check for the _PAGE_RO bit in get_user_pages_fast for write==1 is
the wrong way around. It must not be set for the fast path.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f6614b7b
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -20,18 +20,17 @@
static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
		unsigned long end, int write, struct page **pages, int *nr)
		unsigned long end, int write, struct page **pages, int *nr)
{
{
	unsigned long mask, result;
	unsigned long mask;
	pte_t *ptep, pte;
	pte_t *ptep, pte;
	struct page *page;
	struct page *page;


	result = write ? 0 : _PAGE_RO;
	mask = (write ? _PAGE_RO : 0) | _PAGE_INVALID | _PAGE_SPECIAL;
	mask = result | _PAGE_INVALID | _PAGE_SPECIAL;


	ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr);
	ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr);
	do {
	do {
		pte = *ptep;
		pte = *ptep;
		barrier();
		barrier();
		if ((pte_val(pte) & mask) != result)
		if ((pte_val(pte) & mask) != 0)
			return 0;
			return 0;
		VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
		VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
		page = pte_page(pte);
		page = pte_page(pte);