* get_user_pages_fast() - pin user pages in memory
  * @start:     starting user address
  * @nr_pages:  number of pages from start to pin
- * @write:     whether pages will be written to
+ * @gup_flags: flags modifying pin behaviour
  * @pages:     array that receives pointers to the pages pinned.
  *             Should be at least nr_pages long.
  *
  * requested. If nr_pages is 0 or negative, returns 0. If no pages
  * were pinned, returns -errno.
  */
-int get_user_pages_fast(unsigned long start, int nr_pages, int write,
-                       struct page **pages)
+int get_user_pages_fast(unsigned long start, int nr_pages,
+                       unsigned int gup_flags, struct page **pages)
 {
        struct mm_struct *mm = current->mm;
        unsigned long addr, len, end;
                next = pgd_addr_end(addr, end);
                if (pgd_none(pgd))
                        goto slow;
-               if (!gup_pud_range(pgd, addr, next, write, pages, &nr))
+               if (!gup_pud_range(pgd, addr, next, gup_flags & FOLL_WRITE,
+                                  pages, &nr))
                        goto slow;
        } while (pgdp++, addr = next, addr != end);
        local_irq_enable();
        pages += nr;
 
        ret = get_user_pages_unlocked(start, (end - start) >> PAGE_SHIFT,
-                                     pages, write ? FOLL_WRITE : 0);
+                                     pages, gup_flags);
 
        /* Have to be a bit careful with return values */
        if (nr > 0) {
 
        /* If writing != 0, then the HPTE must allow writing, if we get here */
        write_ok = writing;
        hva = gfn_to_hva_memslot(memslot, gfn);
-       npages = get_user_pages_fast(hva, 1, writing, pages);
+       npages = get_user_pages_fast(hva, 1, writing ? FOLL_WRITE : 0, pages);
        if (npages < 1) {
                /* Check if it's an I/O mapping */
                down_read(¤t->mm->mmap_sem);
        if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
                goto err;
        hva = gfn_to_hva_memslot(memslot, gfn);
-       npages = get_user_pages_fast(hva, 1, 1, pages);
+       npages = get_user_pages_fast(hva, 1, FOLL_WRITE, pages);
        if (npages < 1)
                goto err;
        page = pages[0];
 
        if (!pages)
                return -ENOMEM;
 
-       ret = get_user_pages_fast(cfg->array, num_pages, 1, pages);
+       ret = get_user_pages_fast(cfg->array, num_pages, FOLL_WRITE, pages);
        if (ret < 0)
                goto free_pages;
 
 
                ret = -EFAULT;
                goto out;
        }
-       ret = get_user_pages_fast(map->addr, 1, 1, &map->page);
+       ret = get_user_pages_fast(map->addr, 1, FOLL_WRITE, &map->page);
        if (ret < 0)
                goto out;
        BUG_ON(ret != 1);
 
  * get_user_pages_fast() - pin user pages in memory
  * @start:     starting user address
  * @nr_pages:  number of pages from start to pin
- * @write:     whether pages will be written to
+ * @gup_flags: flags modifying pin behaviour
  * @pages:     array that receives pointers to the pages pinned.
  *             Should be at least nr_pages long.
  *
  * requested. If nr_pages is 0 or negative, returns 0. If no pages
  * were pinned, returns -errno.
  */
-int get_user_pages_fast(unsigned long start, int nr_pages, int write,
-                       struct page **pages)
+int get_user_pages_fast(unsigned long start, int nr_pages,
+                       unsigned int gup_flags, struct page **pages)
 {
        struct mm_struct *mm = current->mm;
        unsigned long addr, len, end;
                next = pgd_addr_end(addr, end);
                if (pgd_none(pgd))
                        goto slow;
-               if (!gup_pud_range(pgd, addr, next, write, pages, &nr))
+               if (!gup_pud_range(pgd, addr, next, gup_flags & FOLL_WRITE,
+                                  pages, &nr))
                        goto slow;
        } while (pgdp++, addr = next, addr != end);
        local_irq_enable();
 
                ret = get_user_pages_unlocked(start,
                        (end - start) >> PAGE_SHIFT, pages,
-                       write ? FOLL_WRITE : 0);
+                       gup_flags);
 
                /* Have to be a bit careful with return values */
                if (nr > 0) {
 
        return nr;
 }
 
-int get_user_pages_fast(unsigned long start, int nr_pages, int write,
-                       struct page **pages)
+int get_user_pages_fast(unsigned long start, int nr_pages,
+                       unsigned int gup_flags, struct page **pages)
 {
        struct mm_struct *mm = current->mm;
        unsigned long addr, len, end;
                next = pgd_addr_end(addr, end);
                if (pgd_none(pgd))
                        goto slow;
-               if (!gup_pud_range(pgd, addr, next, write, pages, &nr))
+               if (!gup_pud_range(pgd, addr, next, gup_flags & FOLL_WRITE,
+                                  pages, &nr))
                        goto slow;
        } while (pgdp++, addr = next, addr != end);
 
 
                ret = get_user_pages_unlocked(start,
                        (end - start) >> PAGE_SHIFT, pages,
-                       write ? FOLL_WRITE : 0);
+                       gup_flags);
 
                /* Have to be a bit careful with return values */
                if (nr > 0) {
 
        pt_element_t *table;
        struct page *page;
 
-       npages = get_user_pages_fast((unsigned long)ptep_user, 1, 1, &page);
+       npages = get_user_pages_fast((unsigned long)ptep_user, 1, FOLL_WRITE, &page);
        /* Check if the user is doing something meaningless. */
        if (unlikely(npages != 1))
                return -EFAULT;
 
                return NULL;
 
        /* Pin the user virtual address. */
-       npinned = get_user_pages_fast(uaddr, npages, write ? FOLL_WRITE : 0, pages);
+       npinned = get_user_pages_fast(uaddr, npages, FOLL_WRITE, pages);
        if (npinned != npages) {
                pr_err("SEV: Failure locking %lu pages.\n", npages);
                goto err;
 
                goto unlock_vm;
        }
 
-       pinned = get_user_pages_fast(region->user_addr, npages, 1,
+       pinned = get_user_pages_fast(region->user_addr, npages, FOLL_WRITE,
                                     region->pages);
        if (pinned < 0) {
                ret = pinned;
 
        if (NULL == vsg->pages)
                return -ENOMEM;
        ret = get_user_pages_fast((unsigned long)xfer->mem_addr,
-                       vsg->num_pages, vsg->direction == DMA_FROM_DEVICE,
+                       vsg->num_pages,
+                       vsg->direction == DMA_FROM_DEVICE ? FOLL_WRITE : 0,
                        vsg->pages);
        if (ret != vsg->num_pages) {
                if (ret < 0)
 
 {
        int ret;
 
-       ret = get_user_pages_fast(vaddr, npages, writable, pages);
+       ret = get_user_pages_fast(vaddr, npages, writable ? FOLL_WRITE : 0,
+                                 pages);
        if (ret < 0)
                return ret;
 
 
        /* pin user pages in memory */
        rc = get_user_pages_fast(data & PAGE_MASK, /* page aligned addr */
                                 m->nr_pages,
-                                m->write,              /* readable/writable */
+                                m->write ? FOLL_WRITE : 0,     /* readable/writable */
                                 m->page_list); /* ptrs to pages */
        if (rc < 0)
                goto fail_get_user_pages;
 
        /*
         * Lock physical page backing a given user VA.
         */
-       retval = get_user_pages_fast(uva, 1, 1, &context->notify_page);
+       retval = get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page);
        if (retval != 1) {
                context->notify_page = NULL;
                return VMCI_ERROR_GENERIC;
 
        int err = VMCI_SUCCESS;
 
        retval = get_user_pages_fast((uintptr_t) produce_uva,
-                                    produce_q->kernel_if->num_pages, 1,
+                                    produce_q->kernel_if->num_pages,
+                                    FOLL_WRITE,
                                     produce_q->kernel_if->u.h.header_page);
        if (retval < (int)produce_q->kernel_if->num_pages) {
                pr_debug("get_user_pages_fast(produce) failed (retval=%d)",
        }
 
        retval = get_user_pages_fast((uintptr_t) consume_uva,
-                                    consume_q->kernel_if->num_pages, 1,
+                                    consume_q->kernel_if->num_pages,
+                                    FOLL_WRITE,
                                     consume_q->kernel_if->u.h.header_page);
        if (retval < (int)consume_q->kernel_if->num_pages) {
                pr_debug("get_user_pages_fast(consume) failed (retval=%d)",
 
                *iter_last_page_size = last_page_size;
        }
 
-       ret = get_user_pages_fast(first_page, requested_pages, !is_write,
+       ret = get_user_pages_fast(first_page, requested_pages,
+                                 !is_write ? FOLL_WRITE : 0,
                                  pages);
        if (ret <= 0)
                return -EFAULT;
 
 
                pinned = get_user_pages_fast(
                                (unsigned long)xfer->loc_addr & PAGE_MASK,
-                               nr_pages, dir == DMA_FROM_DEVICE, page_list);
+                               nr_pages,
+                               dir == DMA_FROM_DEVICE ? FOLL_WRITE : 0,
+                               page_list);
 
                if (pinned != nr_pages) {
                        if (pinned < 0) {
 
 
        dax_dbg("uva %p", va);
 
-       ret = get_user_pages_fast((unsigned long)va, 1, 1, p);
+       ret = get_user_pages_fast((unsigned long)va, 1, FOLL_WRITE, p);
        if (ret == 1) {
                dax_dbg("locked page %p, for VA %p", *p, va);
                return 0;
 
 
         /* Try to fault in all of the necessary pages */
         /* rw==READ means read from drive, write into memory area */
-       res = get_user_pages_fast(uaddr, nr_pages, rw == READ, pages);
+       res = get_user_pages_fast(uaddr, nr_pages, rw == READ ? FOLL_WRITE : 0,
+                                 pages);
 
        /* Errors and no page mapped should return here */
        if (res < nr_pages)
 
                        ptes[i].dma_addr = pg_tbl->coherent_pages[0].paddr +
                                           off + i * PAGE_SIZE;
                } else {
-                       ret = get_user_pages_fast(page_addr - offset, 1, 1,
-                                                 &page);
+                       ret = get_user_pages_fast(page_addr - offset, 1,
+                                                 FOLL_WRITE, &page);
 
                        if (ret <= 0) {
                                dev_err(pg_tbl->device,
 
                goto err;
        }
 
-       rc = get_user_pages_fast(start, num_pages, 1, shm->pages);
+       rc = get_user_pages_fast(start, num_pages, FOLL_WRITE, shm->pages);
        if (rc > 0)
                shm->num_pages = rc;
        if (rc != num_pages) {
 
        enum dma_data_direction direction = iommu_tce_direction(tce);
 
        if (get_user_pages_fast(tce & PAGE_MASK, 1,
-                       direction != DMA_TO_DEVICE, &page) != 1)
+                       direction != DMA_TO_DEVICE ? FOLL_WRITE : 0,
+                       &page) != 1)
                return -EFAULT;
 
        *hpa = __pa((unsigned long) page_address(page));
 
        int bit = nr + (log % PAGE_SIZE) * 8;
        int r;
 
-       r = get_user_pages_fast(log, 1, 1, &page);
+       r = get_user_pages_fast(log, 1, FOLL_WRITE, &page);
        if (r < 0)
                return r;
        BUG_ON(r != 1);
 
        if (!pages)
                return -ENOMEM;
 
-       ret = get_user_pages_fast((unsigned long)buf, nr_pages, true, pages);
+       ret = get_user_pages_fast((unsigned long)buf, nr_pages, FOLL_WRITE, pages);
        if (ret < nr_pages) {
                nr_pages = ret;
                ret = -EINVAL;
 
 
        /* Get the physical addresses of the source buffer */
        num_pinned = get_user_pages_fast(param.local_vaddr - lb_offset,
-               num_pages, param.source != -1, pages);
+               num_pages, param.source != -1 ? FOLL_WRITE : 0, pages);
 
        if (num_pinned != num_pages) {
                /* get_user_pages() failed */
 
        unsigned long xen_pfn;
        int ret;
 
-       ret = get_user_pages_fast(addr, 1, writeable, &page);
+       ret = get_user_pages_fast(addr, 1, writeable ? FOLL_WRITE : 0, &page);
        if (ret < 0)
                return ret;
 
 
 
        /* map the pages */
        ret = get_user_pages_fast((unsigned long)user_desc->ptr,
-                            bufmap->page_count, 1, bufmap->page_array);
+                            bufmap->page_count, FOLL_WRITE, bufmap->page_array);
 
        if (ret < 0)
                return ret;
 
 long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
                    struct page **pages, unsigned int gup_flags);
 
-int get_user_pages_fast(unsigned long start, int nr_pages, int write,
-                       struct page **pages);
+int get_user_pages_fast(unsigned long start, int nr_pages,
+                       unsigned int gup_flags, struct page **pages);
 
 /* Container for pinned pfns / pages */
 struct frame_vector {
 
        if (unlikely(should_fail_futex(fshared)))
                return -EFAULT;
 
-       err = get_user_pages_fast(address, 1, 1, &page);
+       err = get_user_pages_fast(address, 1, FOLL_WRITE, &page);
        /*
         * If write access is not required (eg. FUTEX_WAIT), try
         * and get read-only access.
 
                        len = maxpages * PAGE_SIZE;
                addr &= ~(PAGE_SIZE - 1);
                n = DIV_ROUND_UP(len, PAGE_SIZE);
-               res = get_user_pages_fast(addr, n, iov_iter_rw(i) != WRITE, pages);
+               res = get_user_pages_fast(addr, n,
+                               iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0,
+                               pages);
                if (unlikely(res < 0))
                        return res;
                return (res == n ? len : res * PAGE_SIZE) - *start;
                p = get_pages_array(n);
                if (!p)
                        return -ENOMEM;
-               res = get_user_pages_fast(addr, n, iov_iter_rw(i) != WRITE, p);
+               res = get_user_pages_fast(addr, n,
+                               iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0, p);
                if (unlikely(res < 0)) {
                        kvfree(p);
                        return res;
 
  * get_user_pages_fast() - pin user pages in memory
  * @start:     starting user address
  * @nr_pages:  number of pages from start to pin
- * @write:     whether pages will be written to
+ * @gup_flags: flags modifying pin behaviour
  * @pages:     array that receives pointers to the pages pinned.
  *             Should be at least nr_pages long.
  *
  * requested. If nr_pages is 0 or negative, returns 0. If no pages
  * were pinned, returns -errno.
  */
-int get_user_pages_fast(unsigned long start, int nr_pages, int write,
-                       struct page **pages)
+int get_user_pages_fast(unsigned long start, int nr_pages,
+                       unsigned int gup_flags, struct page **pages)
 {
        unsigned long addr, len, end;
        int nr = 0, ret = 0;
 
        if (gup_fast_permitted(start, nr_pages)) {
                local_irq_disable();
-               gup_pgd_range(addr, end, write ? FOLL_WRITE : 0, pages, &nr);
+               gup_pgd_range(addr, end, gup_flags, pages, &nr);
                local_irq_enable();
                ret = nr;
        }
                pages += nr;
 
                ret = get_user_pages_unlocked(start, nr_pages - nr, pages,
-                               write ? FOLL_WRITE : 0);
+                                             gup_flags);
 
                /* Have to be a bit careful with return values */
                if (nr > 0) {
 
  * get_user_pages_fast() - pin user pages in memory
  * @start:     starting user address
  * @nr_pages:  number of pages from start to pin
- * @write:     whether pages will be written to
+ * @gup_flags: flags modifying pin behaviour
  * @pages:     array that receives pointers to the pages pinned.
  *             Should be at least nr_pages long.
  *
  * were pinned, returns -errno.
  */
 int __weak get_user_pages_fast(unsigned long start,
-                               int nr_pages, int write, struct page **pages)
+                               int nr_pages, unsigned int gup_flags,
+                               struct page **pages)
 {
-       return get_user_pages_unlocked(start, nr_pages, pages,
-                                      write ? FOLL_WRITE : 0);
+       return get_user_pages_unlocked(start, nr_pages, pages, gup_flags);
 }
 EXPORT_SYMBOL_GPL(get_user_pages_fast);
 
 
        while (got < num_pages) {
                rc = get_user_pages_fast(
                    (unsigned long)data + ((unsigned long)got * PAGE_SIZE),
-                   num_pages - got, write_page, pages + got);
+                   num_pages - got, write_page ? FOLL_WRITE : 0, pages + got);
                if (rc < 0)
                        break;
                BUG_ON(rc == 0);
 
                ret = -ENOMEM;
                goto out;
        }
-       ret = get_user_pages_fast(start, nr_pages, 1, pages);
+       ret = get_user_pages_fast(start, nr_pages, FOLL_WRITE, pages);
        if (ret != nr_pages) {
                if (ret > 0)
                        nr_pages = ret;
 
 {
        int ret;
 
-       ret = get_user_pages_fast(user_addr, nr_pages, write, pages);
+       ret = get_user_pages_fast(user_addr, nr_pages, write ? FOLL_WRITE : 0,
+                                 pages);
 
        if (ret >= 0 && ret < nr_pages) {
                while (ret--)