Merge tag '6.6-rc-smb3-client-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / fs / userfaultfd.c
index 70bd295..56eaae9 100644 (file)
@@ -277,17 +277,16 @@ static inline struct uffd_msg userfault_msg(unsigned long address,
  * hugepmd ranges.
  */
 static inline bool userfaultfd_huge_must_wait(struct userfaultfd_ctx *ctx,
-                                        struct vm_area_struct *vma,
-                                        unsigned long address,
-                                        unsigned long flags,
-                                        unsigned long reason)
+                                             struct vm_fault *vmf,
+                                             unsigned long reason)
 {
+       struct vm_area_struct *vma = vmf->vma;
        pte_t *ptep, pte;
        bool ret = true;
 
-       mmap_assert_locked(ctx->mm);
+       assert_fault_locked(vmf);
 
-       ptep = hugetlb_walk(vma, address, vma_mmu_pagesize(vma));
+       ptep = hugetlb_walk(vma, vmf->address, vma_mmu_pagesize(vma));
        if (!ptep)
                goto out;
 
@@ -308,10 +307,8 @@ out:
 }
 #else
 static inline bool userfaultfd_huge_must_wait(struct userfaultfd_ctx *ctx,
-                                        struct vm_area_struct *vma,
-                                        unsigned long address,
-                                        unsigned long flags,
-                                        unsigned long reason)
+                                             struct vm_fault *vmf,
+                                             unsigned long reason)
 {
        return false;   /* should never get here */
 }
@@ -325,11 +322,11 @@ static inline bool userfaultfd_huge_must_wait(struct userfaultfd_ctx *ctx,
  * threads.
  */
 static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx,
-                                        unsigned long address,
-                                        unsigned long flags,
+                                        struct vm_fault *vmf,
                                         unsigned long reason)
 {
        struct mm_struct *mm = ctx->mm;
+       unsigned long address = vmf->address;
        pgd_t *pgd;
        p4d_t *p4d;
        pud_t *pud;
@@ -338,7 +335,7 @@ static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx,
        pte_t ptent;
        bool ret = true;
 
-       mmap_assert_locked(mm);
+       assert_fault_locked(vmf);
 
        pgd = pgd_offset(mm, address);
        if (!pgd_present(*pgd))
@@ -431,16 +428,12 @@ vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason)
         * FOLL_DUMP case, anon memory also checks for FOLL_DUMP with
         * the no_page_table() helper in follow_page_mask(), but the
         * shmem_vm_ops->fault method is invoked even during
-        * coredumping without mmap_lock and it ends up here.
+        * coredumping and it ends up here.
         */
        if (current->flags & (PF_EXITING|PF_DUMPCORE))
                goto out;
 
-       /*
-        * Coredumping runs without mmap_lock so we can only check that
-        * the mmap_lock is held, if PF_DUMPCORE was not set.
-        */
-       mmap_assert_locked(mm);
+       assert_fault_locked(vmf);
 
        ctx = vma->vm_userfaultfd_ctx.ctx;
        if (!ctx)
@@ -556,15 +549,12 @@ vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason)
        spin_unlock_irq(&ctx->fault_pending_wqh.lock);
 
        if (!is_vm_hugetlb_page(vma))
-               must_wait = userfaultfd_must_wait(ctx, vmf->address, vmf->flags,
-                                                 reason);
+               must_wait = userfaultfd_must_wait(ctx, vmf, reason);
        else
-               must_wait = userfaultfd_huge_must_wait(ctx, vma,
-                                                      vmf->address,
-                                                      vmf->flags, reason);
+               must_wait = userfaultfd_huge_must_wait(ctx, vmf, reason);
        if (is_vm_hugetlb_page(vma))
                hugetlb_vma_unlock_read(vma);
-       mmap_read_unlock(mm);
+       release_fault_lock(vmf);
 
        if (likely(must_wait && !READ_ONCE(ctx->released))) {
                wake_up_poll(&ctx->fd_wqh, EPOLLIN);